Java多執行緒2 目標與挑戰

2021-09-24 06:31:24 字數 829 閱讀 9139

競態:計算結果的正確性與時間有關的現象就稱為競態

解釋競態的結果:二維表分析法

競態模式:read-modify-write、check-then-act(檢測而後執行)

執行緒安全性:乙個類在單執行緒環境下能夠執行正常,並且在多執行緒環境下、使用時不必為其做任何改變的情況下也能運作正常,則其稱為是執行緒安全的

執行緒安全問題概括起來三個方面:原子性、可見性、有序性

原子性:對共享變數的訪問操作,若該操作從其執行執行緒以外的任意執行緒來看是不可分割的,那麼該操作就稱為原子操作。(原子操作+原子操作 != 原子操作)

可見性:乙個執行緒對某個共享變數更新後,後續訪問該變數的執行緒可能無法立刻讀取到這個更新結果,甚至永遠也無法讀取到該更新結果;(能讀取到更新後的結果則為可見、否則為不可見)可見性常與儲存系統有關,執行緒對變數的更新過程:變數儲存在所用執行緒的暫存器上--寫緩衝器—快取記憶體—主記憶體;通知其他處理器時,其他處理器可能僅僅將更新通知的內容存入無效化佇列中;所以多執行緒對共享變數的操作是,將共享變數從主記憶體移動到各自的暫存器中,修改值後通過寫緩衝器、快取記憶體、再回到主記憶體中;除主記憶體外的其他部件統稱處理器快取

有序性:乙個處理器上執行的乙個執行緒所執行的記憶體訪問操作在另乙個處理器上執行的其他執行緒看來是亂序的;亂序:記憶體訪問操作的順序看起來像是發生了變化,其中涉及到重排序概念:指令重排序(**編譯器、處理器)、儲存子系統重排序(**快取記憶體、寫緩衝器)

保障記憶體訪問的順序性:邏輯上的部分禁止重排序,通過呼叫處理器提供的相應指令—記憶體屏障來實現的、關於記憶體屏障在第三章會有更詳細的講解

上下文切換:多執行緒共享同乙個處理器的產物

執行緒的活性故障:死鎖(鷸蚌相爭)鎖死(王子救公主、王子已死)活鎖(貓咬尾巴)飢餓

java多執行緒(2)

1.synchronized 鎖重入 執行緒請求由自己持有的物件時,如果該鎖是重入鎖,請求就會成功,否則阻塞 2.synchronized出現異常時,鎖自動釋放 3.當多個執行緒要同乙個例項時 雙重校驗鎖 public class dubblesingleton catch interruptede...

多執行緒 Java多執行緒與併發

實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...

Java多執行緒2 執行緒的建立

上一講中我們講了什麼是執行緒,這一講我們細細討論一下關於執行緒的那些事。先看看執行緒的狀態轉換圖。1.首先執行緒被建立出來。2.進入就緒佇列中等待cpu分配時間片 這裡的時間片指的是cpu允許執行緒執行的最大時間 若在規定時間內未執行完成,則執行緒繼續進入就緒佇列等待cpu分配時間片。3.執行緒進入...