【JUC并发编程04】线程间定制化通信(单标志法存在的问题)
文章目錄
- 4 線程間定制化通信
- 案例實現(xiàn)
- 該案例需要注意
4 線程間定制化通信
案例實現(xiàn)
案列:啟動三個線程,按照如下要求:
AA打印5此,BB打印10次,CC打印15次,一共進行10輪
具體思路:
每個線程添加一個標志位,是該標志位則執(zhí)行操作,并且修改為下一個標志位,通知下一個標志 位的線程
創(chuàng)建一個可重入鎖 private Lock lock = new ReentrantLock();
分別創(chuàng)建三個開鎖通知 private Condition c1 = lock.newCondition();(他們能實現(xiàn)指定喚醒)
(注意)具體資源類中的A線程代碼操作
上鎖,(執(zhí)行具體操作(判斷、操作、通知),解鎖)放于try、finally,具體代碼如下
測試結(jié)果如下:
該案例需要注意
我們在學(xué)習(xí)操作系統(tǒng)中的同步可以知道,進程/線程同步有四個原則,都是為了禁止兩個進程同時進入臨界區(qū)。同步機制應(yīng)該遵循以下原則
- 空閑讓進:臨界區(qū)空閑時,可以允許一個請求進入臨界區(qū)的進程立即進入臨界區(qū)
- 忙則等待:當已經(jīng)有進程進入臨界區(qū)的時候,其他試圖進入臨界區(qū)的進程必須等待
- 有限等待:對請求訪問的進程,應(yīng)保證能在有限時間內(nèi)進入臨界區(qū)
- 讓權(quán)等待:當進程不能進入臨界區(qū)的時候,應(yīng)立即釋放處理機,防止進程忙等待
很顯然,該案例被稱為單標志法。因為該案例設(shè)置一個公用整型變量flag,用于指示被允許進入臨界區(qū)的進程編號。
若 flag =1,則允許 P1P_1P1? 進程進入臨界區(qū);若 flag =2,則允許 P2P_2P2? 進程進入臨界區(qū);若 flag =3,則允許 P3P_3P3? 進程進入臨界區(qū)
該算法可確保每次只允許一個進程進入臨界區(qū)。
但兩個進程必須交替進入臨界區(qū),若某個進程不再進入臨界區(qū),則另一個進程也無法進入臨界區(qū)
比如,若 P3P_3P3? 順利進入臨界區(qū)并從臨界區(qū)離開,則此時臨界區(qū)是空閑的,但 P1P_1P1? 并沒有進入臨界區(qū)的打算,flag = 1 一直成立,P3P_3P3? 就無法再次進入臨界區(qū)。
違背了"空閑讓進"原則,讓資源利用不充分·
比如,將上述代碼中的 main() 方法的C線程從10 改為 20 ,C線程不能訪問 Share 資源了,因為 A 線程已經(jīng)不再訪問同時 flag 值不再改變了。
單標志法偽代碼如下
//P_0進程 while(turn!=0); critical section; turn=1; remainder section; //P_1進程 while(turn!=1); critical section; turn=0; remainder section;總結(jié)
以上是生活随笔為你收集整理的【JUC并发编程04】线程间定制化通信(单标志法存在的问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何把本地idea上的项目上传到gith
- 下一篇: 【JUC并发编程05】集合的线程安全