关键词:排他性、原子性、可重入性
Lock接口是对锁操作方法的一个基本定义,它提供了synchronized关键字所具备的全部功能方法,另外我们可以借助于Lock创建不同的Condition对象进行多线程间的通信操作,与关键字synchronized进行方法同步代码块同步的方式不同,Lock提供了编程式的锁获取(lock())以及释放操作(unlock())等其他操作。
无论是Lock接口还是synchronized关键字,主要是帮我们解决多线程资源的竞争问题,也就是说在同一时刻只能有一个线程对共享资源进行访问,即排他性,另外就是确保若干代码指令执行的原子性。
lock和synchronized关键字一样都具备可重入性,lock的内部维护了hold计数器,而synchronized的内部则维护了monitor计数器,它们的作用都是一样的,若成功获取锁的初始值为1,那么持有该锁时再次获取锁除了会立即成功之外,对应的计数器也会随之自增,在使用synchronized关键字的时候,JVM会为我们担保这一切,但是显式锁的使用则需要程序员自行控制。
正确使用显式锁Lock
- 确保已获取锁的释放:在匿名线程里面lock,重入多次,hold计数器累计,在没有完全unlock完之前,线程提前死亡,会导致没有任何线程可以释放该锁,也会导致没有任何一个线程可以获取到该锁。
- 避免锁的交叉使用引起死锁:A、B线程中锁的交叉使用。
- 多个原子性方法的组合不能确保原子性
多线程的情况下显式锁的表现要优于关键字synchronized,除了性能上的优越表现之外,显式锁Lock具备更加灵活和丰富的API。
