宏觀:concurrent包
- atomic包: AtmoicInteger
- locks包:Lock、Condition、ReetrantLock
- Callable、Future
- Exector、ExecutorService
- CountDownLatch、CyclicBarrier
- ConcurrentHashMap
//AtmoicInteger
//(預期值,新值) 當前值==預期值,當前值=新值
public final int getAndIncrement(){
for(;;){
int current=get();
int next=current+1;
if(compareAndSet(current,next)){
return current;
}
}
}
線程池:threadPoolExector.execute
- coreNum、maxNum、
- ThreadFactory、BlockingQueue、
- 飽和策略、時間、時間單位)
- amount< coreNum:ThreadFactory創建線程
- amount< maxNum
- 阻塞隊列未滿:BlockingQueue阻塞隊列
- 阻塞隊列已滿:ThreadFactory創建線程
- amount>=max
- 誰提交請求、誰處理
- 拋異常、catch處理
- 丟了這個請求
- 丟了隊列最早請求
線程讓出cpu
- yield():就緒:讓給相同/更高:t1.setPriority(1-10,5)
- wait():阻塞:釋放鎖
- sleep():阻塞:不釋放鎖
- join():阻塞:main調用t1.join(),main阻塞,直到t1結束
中止一個線程
suspend():立刻、不釋放鎖
interrupt():只能用於阻塞態,拋InterruptedException異常
- wait:等鎖;sleep:立刻;join:立刻
- stop()
- run()不同步:釋放鎖、拋ThreadDeath、可能不一致
- run()同步:stop()也是同步,得不到鎖、無法中止
synchronized
- 提供了與對象相關的隱式監視器鎖的訪問
- 鎖的獲取和釋放要出現在一個塊結構中,鎖的釋放是隱式的
- 獲取多個鎖時, 必須以相反的順序釋放
- JVM 在生成線程轉儲時能夠包括鎖定信息
ReentrantLock
- Lock機制必須顯式、在finally釋放:locl.unlock()
- 鎖的獲取和釋放不必要在同一個塊中
- 釋放鎖的順序更加自由
都是可重入鎖
- 同一個線程多次試圖獲取它所佔有的鎖,請求會成功。
- 當釋放鎖的時候,直到重入次數清零,鎖才釋放完畢。