ReentrantLock
介绍:用lock和unlock进行枷锁和解锁,配合try、finally来实现,
和synchronized wait notify 对比
1 有公平锁的功能
2 可中断lock.lockInterruptibly()
3CAS枷锁方式
4 trylock 可以规定时间内获得一把锁
CyclicBarrier (人满发车)
介绍:满人发车,可以限制N个线程阻塞,当阻塞线程达到N个之后,可以执行一个方法,阻塞的线程统一执行,
使用
CyclicBarrierbarrier=newCyclicBarrier(10,()->System.out.println("满人"));
barrier.await();
System.out.println("执行");
CountDownLatch(事后明白)
介绍:设置一个数量,每个线程执行一次 减一个数量,当数量为0,可以执行wait的线程,与CyclicBarrier 不同的在于,CyclicBarrier 所有线程到数量后一起执行(多次),CountDownLatch是执行到数量后等待线程才会执行(一次)
使用:
CountDownLatchlatch=newCountDownLatch(threads.length);
latch.countDown();//数量减去1
latch.await(); 等待执行的地方
MarriagePhaser
分阶段执行(安各个阶段的线程到了之后,分阶段执行,)
ReadWriteLock
介绍:读锁 只能有一个线程修改 写锁 能有多个线程读取,场景:当需要读写多线程的场景,读写锁可以提高效率,让多个线程一起读。
使用:
staticReadWriteLockreadWriteLock=newReentrantReadWriteLock();
staticLockreadLock=readWriteLock.readLock();
staticLockwriteLock=readWriteLock.writeLock();
辅助类工具
LockSupport
介绍:LockSupport是一个线程工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。
它的内部其实两类主要的方法:park(停车阻塞线程)和unpark(启动唤醒线程)。
与wiat与notify的区别:
1)wait和notify都是Object中的方法,在调用这两个方法前必须先获得锁对象,但是park不需要获取某个对象的锁就可以锁住线程。
(2)notify只能随机选择一个线程唤醒,无法唤醒指定的线程,unpark却可以唤醒一个指定的线程。
Semaphore
介绍:限流,限制线程并发数
使用方法: 限制同事只有两个线程
Semaphores = new Semaphore(2);
try{
s.acquire();
System.out.println("running...");
}catch(InterruptedExceptione){
e.printStackTrace();
}finally{
s.release();
}
Exchanger
介绍:2个线程交换数据
使用:
staticExchanger<String>exchanger=newExchanger<>();
exchanger.exchange(s);