第十三章 显式锁

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.读—写锁

互斥(每次最多只有一个线程能持有该锁)是一种保守的加锁策略,虽然避免了“写/读”冲突和“写/写”冲突,但同样避免了“读/读”冲突。

读/写锁:一个资源可以被多个读操作访问,或者被一个写操作访问,但两者不能同时进行。

读锁会阻塞写,但不会阻塞读;写锁会阻塞读和写。

人生就像蒲公英,看似自由,其实身不由己。
原文地址:https://www.cnblogs.com/walker993/p/9296322.html