1 Reentrantlock可重入锁
图片说明
特点:
1 Trylock(5,TimeUnit.SECONDS)五秒钟没拿到锁,会继续执行下续代码
2 lockinterruptibly 可以用interrupt打断线程的等待
3 公平锁Rerntrantlock lock = new Reentrantlock(true);synchronized只有非公平锁
4 CAS

2 Countdownlatch(门栓)
基于AQS的共享模式
countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了
CountDownLatch(int count); //构造方法,创建一个值为count 的计数器。
await();//阻塞当前线程,将当前线程加入阻塞队列。
await(long timeout, TimeUnit unit);//在timeout的时间之内阻塞当前线程,时间一过则当前线程可以执行,
countDown();//对计数器进行递减1操作,当计数器递减至0时,当前线程会去唤醒阻塞队列里的所有线程。

3 Cyclicbarrier(线程栅栏)
图片说明
await()方法的底层是调用重入锁的lock方法。
基于condition
实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作。下图演示了这一过程。
在CyclicBarrier类的内部有一个计数器,每个线程在到达屏障点的时候都会调用await方法将自己阻塞,此时计数器会减1,当计数器减为0的时候所有因调用await方法而被阻塞的线程将被唤醒

4 Phaser
多层线程栅栏

5 Readwritelock读写锁
Reentrantreadwritelock lock = new Reentrantreadwritelock();
Lock readlock = lock.readlock();
Lock writelock = lock. writelock();

6 StampedLock读写锁
三种模式是:
(1)write
方法writeLock()可能阻止等待独占访问,返回可以在方法unlockWrite(long)中使用的stamps来释放锁定。
不定时的和定时版本tryWriteLock,还提供当锁保持写入模式时,不能获得读取锁定,并且所有乐观读取验证都将失败。
(2)read
方法readLock()可能阻止等待非独占访问,返回可用于方法unlockRead(long)释放锁的戳记。
还提供不定时的和定时版本tryReadLock。
(3)乐观读
方法tryOptimisticRead()只有当锁当前未保持在写入模式时才返回非零标记。
方法validate(long)返回true,如果在获取给定的stamps时尚未在写入模式中获取锁定
这种模式可以被认为是一个非常弱的版本的读锁,可以随时由 writer 打破
对简单的只读代码段使用乐观模式通常会减少争用并提高吞吐量。
然而,其使用本质上是脆弱的。 乐观阅读部分只能读取字段并将其保存在局部变量中,以供后验证使用。
以乐观模式读取的字段可能会非常不一致,因此只有在熟悉数据表示以检查一致性和/或重复调用方法validate()时,使用情况才适用。
StampedLock stampedlock = new StampedLock();
stampedlock.asReadLock().Lock();
stampedlock.asReadLock().unlock();
stampedlock.asWriteLock().lock();
stampedlock.asWriteLock().unlock();

7 Semaphore(信号灯)
底层AQS(抽象同步队列)
限流,最多允许有多少个线程同时执行
Semaphore semaphore = new Semaphore(1);一个信号灯
semaphore.acquire();获得信号灯
semaphore.release();释放信号灯

8 exchanger
两个线程,exchange阻塞命令,值交换之后继续执行
图片说明

9 LockSupport
Locksupport.park();线程阻塞
Locksupport.unpark(t);线程t退出阻塞状态
Unpark可以在park之前