第十三章 显式锁
1.Lock(接口) 和 ReentrantLock(实现类)
与内置加锁机制不同的是,Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取方式,所有加锁和解锁的方法都是显式的。
ReentrantLock实现了Lock接口,提供和synchronized相同的互斥性和内存可见性。
2.为什么要创建一种与内置锁如此相似的新加锁机制?
ReentrantLock并不是一种替代内置锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能。内置锁存在功能上的局限,比如:无法中断一个正在等待获取锁的线程,内置锁必须在获取该锁的代码块中释放,因此无法实现非阻塞结构的加锁规则。
3.synchronized VS Lock
1)synchronized是关键字,Lock是接口
2)synchronized在发生异常时自动释放锁,Lock必须在finally()块中手动释放
3)Lock可定时,可中断,可轮询,非块结构,公平/非公平锁
4)Lock支持读写锁
4.轮询锁与定时锁
如果不能获取所有需要的锁,可使用可定时的或可轮询的锁获取方式,它会释放已经获得的锁,然后重新尝试获取所有锁。定时锁在给定的时间里使用独占锁。
5.可中断的所获取操作
在获得锁的同时保持对中断的响应。
6.公平性
公平的锁:线程按照申请的顺序获得锁,ReentrantLock默认使用非公平的加锁机制。
7.读—写锁
互斥(每次最多只有一个线程能持有该锁)是一种保守的加锁策略,虽然避免了“写/读”冲突和“写/写”冲突,但同样避免了“读/读”冲突。
读/写锁:一个资源可以被多个读操作访问,或者被一个写操作访问,但两者不能同时进行。
读锁会阻塞写,但不会阻塞读;写锁会阻塞读和写。
人生就像蒲公英,看似自由,其实身不由己。