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<>();