所谓可重入指的是同一个线程再次获取已经拥有的锁时无需等待。
1, ReentrantLock
可重入锁是互斥锁,根据AQS实现机制的分析,只需要实现tryAcquire和tryRelease维护state的含义即可。ReentrantLock可以指定锁是否公平,所谓公平就是指当一个线程要获取锁时,如果已经有线程在排队,它必须乖乖去排队,所谓不公平是指当队列头的线程被唤醒之后获取锁的过程中,允许当前请求锁的线程跟它竞争。
state:
0:表示当前没有线程获得锁
n>0:表示当前获取锁的线程获取了n次锁
2, ReentrantReadWriteLock
可重入读写锁是互斥和共享混合的锁
state:
低16bit:0表示没有互斥锁,>0表示当前获取互斥锁的线程获取锁的次数
高16bit:表示所有线程获取共享锁的次数
另外每个线程获取共享锁的次数会保存在ThreadLocal里。
3,CountDownLatch:等待的n个线程阻塞直到n个条件在其他线程满足
非常简单,state表示共享锁获取次数,对象构造时表示已经获取了n次共享锁。
每次countDown释放一次共享锁,await只是阻塞在获取共享锁上,只有当前共享锁全部释放时所有获取共享锁的线程才会成功。
4,Semaphore:限流,控制可访问资源的线程数
共享锁,state表示当前获取共享锁的次数,构造时指定上限。
5,CyclicBarrier:n个线程执行到某个点时互相等待,然后同时继续执行。
CyclicBarrier直接利用ReentrantLock关联的condition variable实现。
每次有线程到达指定点时调用await,计数器减1,归0时唤醒所有线程。
否则等待大家都到齐后被唤醒或超时。
6,Phaser
Phaser本身是单链表,表示多个阶段,每个阶段可以动态改变互相等待的线程数,大家都到齐之后进入下一个阶段。
本节完。。。。。。