Lock锁:
- JDK1.5后新增的功能,与采用 synchronized 相比,lcok 可以提供多种锁的方案,更加灵活。
注意:如果同步代码块有异常,要将 unlock() 写入 finally 语句块中。
-
ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的 并发性 和 内存语义,但是添加了类似 锁投票 , 定时锁等候 和 可中断锁等候 的一些特性。
此外,它还提供了在激烈争用情况下更佳的性能。
Lock 和 synchronized 的区别
- Lock 是显式锁(手动开启 和 关闭锁 ,别忘记关闭锁),synchronized 是隐式锁。
- Lock 只有代码块锁,synchronized 有代码块锁 和 方法锁。
- 使用 Lock 锁,JVM 将花费较少的时间来调度线程,性能更好,且具有更好的扩展性(提供更多的子类)。
优先使用顺序
Lock <== == 同步代码块 (已经进入了方法体,分配了相应资源) <== == 同步方法 (在方法体之外)