- 線程通信
多線程併發執行時, 在默認狀況下CPU是隨機切換線程, 若是但願線程執行的順序按咱們的規律執行, 就須要線程之間協調通信java
線程通信方式多線程
- 休眠喚醒方式
- -- Object: wait、notify、notifyAll(以上必須配合synchronized塊使用)
- -- Condition(Lock.newCondition()): await、signal、signalAll
- CountDownLatch: 用於某個線程等待其餘線程執行完後再執行
CountDownLatch底層原理是經過一個計數器來實現的, 計數器的初始值爲(等待)線程的數量, 執行減一操做, 到0後意味着某個線程就能夠執行了併發
好比A線程等待前面有3個線程執行完成後再執行, 計數器標記count=3, 第一步執行await()方法等待檢查當前的count是不是0, 不是0 ,則A線程阻塞, 在其餘3個線程執行時各自分別調用countDown()方法, 對count-1操做, 直到count=0, 就去喚醒(resume())A線程工做學習
- CyclicBarrier: 一組線程等待至某個狀態以後再所有同時執行
CyclicBarrier 底層基於 ReentrantLock 和 Condition 實現spa
- Semaphore: 用於控制對某組資源的訪問權限 (適合資源少,線程多的場景)
wait 和 sleep 區別線程
wait | sleep | |
同步 | 只能在synchronized同步塊中使用 | 不須要依賴synchronized |
做用對象 | wait方法定義在Object類中,做用於對象自己 | sleep方法定義在java.lang.Thread中,做用當前線程 |
釋放鎖資源 | 會 | 不會 |
喚醒條件 | 其餘線程調用對象的notify或notifyAll | 超時或調用interrupt() |
方法屬性 | 實例方法(Object.wait()) | 靜態方法 |
Go. 學習線程 還須要瞭解Java內存模型 也是核心基礎對象