synchronized | Lock | |
---|---|---|
Java的关键字,jvm提供 | java接口 | |
获取锁 | 假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待 | 分情况而定,Lock有多个锁获取的方式,可以尝试获得锁,线程可以中断等待 |
释放锁 | 1、已获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁 | 在finally中必须手动释放锁,不然容易造成线程死锁 |
锁状态 | 无法判断 | 可以判断 |
灵活控制 | 可绑定多个条件 | |
锁类型 | 可重入 不可中断 非公平 | 可重入 可中断 可公平 |
性能 | 少量同步 | 大量同步 |
Lock相对于synchronize优势
- 灵活控制: Lock可针对同锁不同任务绑定多个条件,更简单高效地协调控制多组线程。
- 提高效率:Lock(ReentrantReadWriteLock)可以提高多个线程进行读操作的效率。
- 锁状态:Lock的tryLock()可以知道有没有成功获取锁
- 可中断: 如果获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法),获取锁的线程被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,这非常影响程序的执行效率。因此就需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定的时间或者能够响应中断)。