在過去單 cpu 時代,單任務在乙個時間點只能執行單一程式。之後發展到多工階段,計算機能在同一時間點並行執行多工或多程序。雖然並不是真正意義上的「同一時間點」,而是多個任務或者程序共享乙個 cpu ,並交由作業系統完成多工間對 cpu 的執行切換,以使得每個任務都有機會獲得一定的時間片執行。
隨著多工對軟體開發者帶來新的挑戰,程式不在能夠獨佔所有 cpu 時間,所有的記憶體和其他計算機資源。乙個好的程式榜樣是在其不再使用這些資源時對其進行釋放,以使得其他程式能夠有機會使用這些資源。
再後來發展到多執行緒技術,使得在乙個程式內部能夠擁有多個執行緒並行執行,乙個執行緒的執行可以認為是乙個 cpu 在執行該程式。當乙個程式執行在多執行緒下,就好像有多個 cpu 在同時執行該程式。
多執行緒比多工更有挑戰性,多執行緒是在同乙個程式內部並行執行,因此會對相同的記憶體空間進行併發讀寫操作。這可能是在單執行緒程式中從來不會遇到的問題。其中一些錯誤也未必會在單 cpu 機器上出現,因為兩個執行緒從來不會得到真正的並行執行。然而,現代計算機伴隨著多核 cpu 的出現,也就意味著不同執行緒能夠被不同 cpu 得到並行執行。
如果乙個執行緒正在讀乙個記憶體時,另乙個執行緒正向該記憶體寫操作,那麼進行讀操作的執行緒將獲得什麼結果?是寫之前的舊值?還是寫操作成功後的新值?或者是一半新值一半舊值?或者,如果兩個執行緒同時寫乙個記憶體,在操作完成後將會是什麼結果?是第乙個執行緒寫入的值?還是第二個執行緒寫入的值?還是兩個執行緒的混合值?因此沒有合適的預防措施,任何結果都是有可能的。而這種行為的發生甚至不能**,所以結果也是不確定性的。
Java併發 多執行緒
執行緒狀態 每個執行緒可以看做不同的任務,cpu需要分配每個執行緒不同的使用時間,cpu需要不同的執行緒之間來回切換,造成執行緒可能存在的不同狀態。新建執行緒 public class thread1 extends thread public class runnable1 implements ...
多執行緒 Java多執行緒與併發
實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...
java 多執行緒的併發控制
synchronized必須鎖的是物件,基本資料型別的變數不能當作物件鎖。要保證多執行緒使用的是同乙個互斥鎖 物件鎖 才能進行同步。死鎖的兩種情況 1 多個執行緒共用同乙個物件鎖,互相等待。2 互相持有對方所需的資源 即每個執行緒都需要同時拿到多個資源才能繼續執行,而多個執行緒都處於 各持有一部分,...