實現乙個容器,提供兩個方法,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方法稱為執行緒的執行單元。重...