为什么ReentrantLock 可中断,而 synchronized 不行
时间: 2023-05-27 22:01:52 浏览: 52
ReentrantLock 是可中断锁,是因为他提供了一个 tryLock(long timeout, TimeUnit unit) 方法,这个方法可以让线程在给定的时间内尝试去获取锁,如果在指定的时间内没有获取到锁,就可以中断尝试获取锁的线程。
而 synchronized 是不可中断锁,因为在 synchronized 中获取锁的行为是原子性的,一旦进入了 synchronized 代码块,就会一直持有锁,直到执行完毕才会释放锁。如果想要中断正在执行 synchronized 代码块的线程,只能通过使用 Thread.interrupt() 方法进行中断操作,但是并不能立即中断线程,需要等待 synchronized 内代码块执行完毕才能中断。因此 synchronized 不支持像 ReentrantLock 那样的可中断锁。
相关问题
ReentrantLock和Synchronized有什么区别?
ReentrantLock和Synchronized是Java中用于实现锁的两种机制,它们有以下区别[^1][^1]:
1. 实现方式:Synchronized是JVM隐式实现的,而ReentrantLock是Java语言提供的API。
2. 公平性:ReentrantLock可以设置为公平锁,即按照线程请求锁的顺序来获取锁,而Synchronized不具备公平性。
3. 代码块范围:ReentrantLock只能修饰代码块,而Synchronized可以用于修饰方法、修饰代码块等。
4. 锁的获取和释放:ReentrantLock需要手动加锁和释放锁,即需要在代码中显式地调用lock()方法来获取锁,并在合适的位置调用unlock()方法来释放锁。而Synchronized不需要手动释放锁,当Synchronized修饰的代码块执行完毕或者发生异常时,会自动释放锁。
5. 锁的可中断性:ReentrantLock提供了可中断的获取锁的方式,即可以通过lockInterruptibly()方法来获取锁,而Synchronized在获取锁时是不可中断的。
6. 锁的可见性:ReentrantLock具备可见性,即一个线程在获取锁之前对共享变量的修改对其他线程是可见的,而Synchronized也具备可见性。
7. 锁的状态获取:ReentrantLock可以通过tryLock()方法尝试获取锁,并返回是否成功获取锁的结果,而Synchronized无法直接获取锁的状态。
综上所述,ReentrantLock和Synchronized在实现方式、公平性、代码块范围、锁的获取和释放、锁的可中断性、锁的可见性以及锁的状态获取等方面存在差异。
synchronized 和 ReentrantLock 区别是什么
synchronized 和 reentrantlock 都是用于实现线程同步的机制,但是它们之间有以下区别:
1. 锁的获取方式不同:synchronized 是隐式锁,即在进入同步代码块或方法时自动获取锁,退出同步代码块或方法时自动释放锁;而 reentrantlock 是显式锁,需要手动获取和释放锁。
2. 可重入性不同:synchronized 是可重入锁,同一个线程可以多次获取同一把锁;而 reentrantlock 也是可重入锁,但需要手动实现。
3. 等待可中断性不同:synchronized 不支持等待可中断,即线程在获取锁时无法响应中断;而 reentrantlock 支持等待可中断,可以响应中断。
4. 公平性不同:synchronized 是非公平锁,即线程获取锁的顺序是不确定的;而 reentrantlock 可以是公平锁或非公平锁,可以通过构造函数指定。
5. 性能不同:在低并发的情况下,synchronized 的性能优于 reentrantlock;而在高并发的情况下,reentrantlock 的性能优于 synchronized。