简述synchronized和java.util.concurrent.locks.Lock的异同 ?
参考答案:
synchronized
和java.util.concurrent.locks.Lock
都是Java中用于控制多个线程对共享资源的访问的工具,以防止出现线程安全问题。它们都是可重入锁,即一个线程可以多次获得同一个锁。
相同点:
- 互斥性:两者都保证了在同一时刻只有一个线程可以执行被保护的代码块。
- 可重入性:无论是
synchronized
还是Lock
,都允许同一个线程多次获取锁。 - 中断性:两者都支持线程中断,当一个线程在等待锁的过程中被中断,它会收到
InterruptedException
。
不同点:
- 等待可中断性:
synchronized
的等待/通知机制(wait/notify/notifyAll
)是不可中断的,而Lock
接口中提供了可以中断的等待/通知机制(Condition
接口的await()
和signal()
方法)。 - 锁的释放:
synchronized
在发生异常时,会自动释放锁。而Lock
则需要显式调用unlock()
方法来释放锁,否则可能导致死锁。 - 锁的公平性:
synchronized
锁是非公平的,无法保证等待的线程按照它们等待的顺序获得锁。而Lock
接口中的ReentrantLock
类可以通过构造函数的参数来选择是否公平。 - 锁的获取:
synchronized
是自动获取和释放锁的,而Lock
需要手动获取和释放锁,这提供了更大的灵活性。 - 尝试获取锁:
Lock
接口提供了tryLock()
方法,这个方法会尝试获取锁,如果锁被其他线程占用,它会立即返回,不会阻塞当前线程。而synchronized
没有提供这样的机制。
总的来说,synchronized
是Java语言内置的锁机制,使用起来更简单,但是功能相对较少。而Lock
接口提供了更多的灵活性和功能,适合更复杂的并发控制需求。