synchronzied
CountDownLatch 【 倒计时闩锁 】
https://www.cnblogs.com/sweetorangezzz/p/13186587.html
当计数为0的时候,下一步的动作实施者是main函数。
CyclicBarrier 【 篱栅 】
达到一定计数,下一步动作实施者是“其他线程”。
Semaphore 【信号标】
Semaphore与CountDownLatch相似,不同的地方在于Semaphore的值被获取到后是可以释放的,并不像CountDownLatch那样一直减到底。它也被更多地用来限制流量,类似阀门的 功能。如果限定某些资源最多有N个线程可以访问,那么超过N个主不允许再有线程来访问,同时当现有线程结束后,就会释放,然后允许新的线程进来
Phaser 【阶段器】
https://www.cnblogs.com/sweetorangezzz/p/13188210.html
Phaser它也被称为“阶段器”,可以用它来控制多线程分阶段共同完成的问题
Exchanger 【交换器】
Exchanger用于进行线程间的数据交换
LockSupport 【锁支持】
https://www.cnblogs.com/sweetorangezzz/p/13186874.html
主要是为了阻塞和唤醒线程用的
ReentrantReadWriteLock 【可重入读写锁】
https://www.cnblogs.com/sweetorangezzz/p/13186796.html
现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了
ReentrantLock
https://www.cnblogs.com/sweetorangezzz/p/13189193.html
https://www.cnblogs.com/sweetorangezzz/p/13189170.html
总结:
-
什么是共享锁和排它锁
共享锁就是允许多个线程同时获取一个锁,一个锁可以同时被多个线程拥有。
排它锁,也称作独占锁,一个锁在某一时刻只能被一个线程占有,其它线程必须等待锁被释放之后才可能获取到锁。
-
ReentrantReadWriteLock 、ReentrantLock都 通过 sync 实现了 排他锁
-
CountDownLatch 、Semaphore、CyclicBarrier 通过 sync 实现了 共享锁
-
synchronzied 是 JDK 内部实现的锁机制,无锁 ---> 偏向锁 ---> 自旋锁(轻量级锁)---> 重量级锁