馬士兵高併發程式設計筆記二之容器讀寫同步

2021-08-18 08:36:44 字數 1792 閱讀 6131

實現乙個容器,提供兩個方法,add,size, 寫兩個執行緒,執行緒1新增10個元素到容器中,執行緒2實現監控元素的個數,當個數到5個時,執行緒2給出提示並結束

public

class

mycontainer2

public

intsize()

public

static

void

main(string args) catch (interruptedexception e)

}}, "t1").start();

new thread(() ->

}system.out.println("t2 結束");

}, "t2").start();

}}

缺點:給lists新增volatile之後,t2能夠接到通知,但是,t2執行緒的死迴圈很浪費cpu,如果不用死迴圈,該怎麼做呢?

public

class

mycontainer3

public

intsize()

public

static

void

main(string args) catch (interruptedexception e)

}system.out.println("t2 結束");

//通知t1繼續執行

lock.notify();

}}, "t2").start();

try catch (interruptedexception e1)

new thread(() ->

try catch (interruptedexception e) }}

}, "t1").start();

}}

這裡使用wait和notify做到,wait會釋放鎖,而notify不會釋放鎖

需要注意的是,運用這種方法,必須要保證t2先執行,也就是首先讓t2監聽才可以

呼叫wait後,必須呼叫notify通知其他執行緒

notify之後,t1必須釋放鎖,t2退出後,也必須notify,通知t1繼續執行

整個通訊過程比較繁瑣

public

class

mycontainer5

public

intsize()

public

static

void

main(string args) catch (interruptedexception e)

}system.out.println("t2 結束");

}, "t2").start();

try catch (interruptedexception e1)

new thread(() ->

try catch (interruptedexception e)

}}, "t1").start();

}}

使用latch(門閂)替代wait notify來進行通知

好處是通訊方式簡單,同時也可以指定等待時間

使用await和countdown方法替代wait和notify

countdownlatch不涉及鎖定,當count的值為零時當前執行緒繼續執行

當不涉及同步,只是涉及執行緒通訊的時候,用synchronized + wait/notify就顯得太重了

這時應該考慮countdownlatch/cyclicbarrier/semaphore

Java高併發程式設計筆記

jmm記憶體模型之 可見性 可見性是指當乙個執行緒修改了某乙個共享變數的值,其他執行緒是否能夠立即知道這個修改。jmm記憶體模型之 有序性 有序性問題的原因是因為程式在執行時,可能會出現指令重排,重排後的指令的順序未必一致。一條指令的執行可以分為很多步驟的 簡單來說就是以下幾步 1 取指if 2 解...

Java高併發程式設計讀書筆記

程序 程序是計算機彙總的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體 在當代面向執行緒設計的計算機結構中,程序是執行緒的容器。程式是指令 資料及其組織形式的描述,程序是程式的實體。執行緒是輕量...

Java高併發程式設計學習筆記1

執行緒的runnable狀態 已經具備執行條件,只等待cpu排程 萬事俱備只欠東風 1 thread類中得start方法啟動乙個執行緒,並且該執行緒進入了可執行態 runnabel 2 run方法和start方法的區別。3 線 正的執行邏輯在run方法中,通常我們把run方法稱為執行緒的執行單元。重...