併發程式設計的本質:充分利用cpu的資源
執行緒就是乙個單獨的資源類,沒有任何的附屬操作。
傳統的synchronize鎖本質:佇列,鎖
lock.
lock()
//加鎖
try
new
reentrantlock()
;lock.
lock()
//加鎖
finally
=>lock.unlock 解鎖
鎖是什麼,如何判斷鎖的是誰:
深刻理解什麼是鎖:
8鎖就是關於鎖的8個問題。
3、增加了乙個普通方法後,後面的呼叫普通方法,發簡訊方法延時4s:1/hello 2/發簡訊;
4、兩個物件,兩個同步方法,發簡訊方法延時4s:1/打** 2/發簡訊;
5、增加兩個靜態的同步方法,只有乙個物件,加入static關鍵字發簡訊方法延時4s:1/發簡訊 2/打**;
6、增加兩個靜態的同步方法,兩個物件,加入static關鍵字發簡訊方法延時4s:1/發簡訊 2/打**;
7、乙個靜態的同步方法乙個普通同步方法,發簡訊方法延時4s:1/打** 2/發簡訊;
8、兩個物件,乙個靜態的同步方法乙個普通同步方法,發簡訊方法延時4s:1/打** 2/發簡訊;
synchronize鎖的物件是方法的呼叫者,兩個方法使用的是同乙個鎖,誰先拿到,誰就執行。
普通方法沒有鎖,不受鎖的影響。
兩個物件兩個呼叫者,兩把鎖。
static 靜態方法,類一載入就有了!鎖的是class(全域性唯一)。
同步方法鎖的是方法的呼叫者,靜態同步方法鎖的是class類模板。
執行緒交替執行 a b 操作同乙個物件
單例模式、排序演算法、生產者消費者、死鎖。
if迴圈:一次性判斷
使用while迴圈,防止虛假喚醒
執行緒也可以喚醒,而不會被通知,中斷或超時,即所謂的虛假喚醒 。 雖然這在實踐中很少會發生,但應用程式必須通過測試應該使執行緒被喚醒的條件來防範,並且如果條件不滿足則繼續等待。 換句話說,等待應該總是出現在迴圈中,就像這樣:
synchronized
(obj)
只要是併發一定要有鎖。
集合類不安全:
juc併發程式設計
public class thraedtest string.valueof i start countdownlatch.await system.out.println 關門結束 訊號量通常用來限制執行緒數,比如限流,而不是訪問某些 物理或邏輯 資源。例如,這是乙個使用訊號量來控制對乙個專案池的...
JUC併發程式設計
juc本階段學習介紹 執行緒和程序 回顧多執行緒 傳統的synchronized鎖 lock鎖 synchronized和lock區別 傳統的生產者消費者問題 防止虛假喚醒 lock版的生產者消費者問題 condition實現精準通知喚醒 八鎖現象徹底理解鎖 copyonwritearraylist...
JUC 併發程式設計 應用
2.限制對共享資源的使用 快取統籌 定時sleep 實現 在沒有利用 cpu 來計算時,不要讓 while true 空轉浪費 cpu,這時可以使用 yield 或 sleep 來讓出 cpu 的使用權 給其他程式 while true catch interruptedexception e se...