https://www.jianshu.com/p/bb5105303d85 CountDownLatch、Semaphore和CyclicBarrier。
一、ReentraLock
手动锁,重入锁 ReentranLock,可替代synchronize,更灵活
1、必须要手动释放锁,经常在finally中进行锁释放。
2、可以尝试锁定tryLock,或者指定时间内无法锁定,线程可以决定是否继续等待
3、lock.lockInterruptibly();代替lock.lock(), 可以对thread.interrupt()方法做出响应,打断该线程。
lock.lock()锁定的线程不可打断的。使用lockInterruptibly(); 就可以进行打断
4、指定公平锁(效率会相对低一点)
private static ReentrantLock lock = new ReentrantLock(true);//参数true为公平锁
5、Condition
对比notifyAll() 能精准叫醒线程,效率更高
二、ThreadLocal 线程局部变量(空间换时间)
hibernate 中 session就存在ThreadLocal
不想线程1的改变让线程2 知道,自己的线程的变量只有自己能用,只影响当前线程
ThreadLocal<String> t = new ThreadLocal<>();