各种锁
1 重入锁定义
ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被阻塞.
2 读写锁定义
读写锁维护了一对锁,一个读锁,一个写锁.通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大的提升.
除了保证读写操作对读操作的可见性和并发性提升之外,在读多于写的情况下,读写锁能够提供比排他锁更好的并发性和吞吐量.
3 读写锁的实现分析
读写的状态设计,写锁的释放和获取,读锁的释放以及获取,以及锁降级.
(1)读写状态的设计
读写锁同样依赖自定义同步器来实现功能,而读写状态就是其同步器的同步状态.
如果在一个整型变量上维护多种状态,就一定需要"按位切割使用"这个变量,读写锁将变量分为两个部分,高16位表示读,低16位表示写,通过位运算来实现.
(2)写锁的获取与释放
写锁是一个支持重进入的排他锁,当前线程已经获取了写锁,则增加写状态.如果当前线程正在获取写锁时候,读锁已经被获取或者该线程不是已经获取写锁的线程,则当前线程进入等待状态.
(3) 读锁的获取与释放
读锁能被多个线程同时获取,在没有其他线程访问时候,读锁总会被成功的获取,而做的也是增加读状态,如果当前线程在获取读锁时,写锁也被其他线程获取,则进入等待状态.
(4) 锁降级
指的是写锁变成读锁,如果当前线程拥有写锁,然后将其释放,最后在获取读锁.这种分段完成的过程不能称为锁降级.锁降级指的是把持住写锁,再获取到读锁,随后释放写锁的过程.
4 LockSupport工具
当需要阻塞或者唤醒一个线程的时候,都会使用LockSupport来完成相应的工作.LockSupport提供了一组公共的静态方法,为这些方法提供了最基本的线程阻塞和唤醒的功能.