《JAVA併發程式設計實踐》第二章 執行緒安全性

2021-08-18 01:34:55 字數 1005 閱讀 2246

1.多執行緒環境為什麼會出現問題?

由於競態條件的存在。     

競態條件:基於一種可能失效的觀察結果來做出判斷或執行某個計算

競態條件分兩種:

-**先檢查後執行**

-**讀取-修改-寫入**

場景:單例模式-懶載入

計數器競態條件本身也可以看做是一種復合操作,這個復合操作必須要以原子性來執行。

說到原子性不得不提原子類,是以atomic開頭的一組類,定義了一些原子操作的方法

2.如何避免這種失效資料問題?

日常專案中物件的非靜態例項域都是該執行緒獨享的。除非是在**中開啟乙個新執行緒,才會有共享的情況發生

將狀態變數修改為不可變的變數

訪問時使用同步

3.什麼是執行緒安全性?

當多個執行緒訪問某個類時,這個類始終表現出正常的行為

無狀態物件一定是執行緒安全的

為什麼?

因為無狀態的物件沒有例項域,也不包含對其他類中域的訪問,計算過程中的臨時狀態都僅存在於執行緒棧上的區域性變數中

實際的專案中,物件是有狀態的,是由本身的例項域和其他物件的引用組成。

-第四章 物件的組合

4同步-加鎖

synchronized 物件的內部鎖,互斥鎖 鎖的是物件,例項,也能實現同乙個執行緒的重入

由於synchronized可以用在**塊,方法上,用在方法上或導致不良併發(可同時呼叫的數量,不僅受到可用處理資源的限制,還受到程式結構本身的限制)

解決方案:控制synchronized的範圍,

5 為什麼要用鎖保護?

鎖保護 : 對於可能被多個執行緒同時訪問的可變狀態變數,訪問它時都需要持有同乙個鎖,在這種情況下,我們稱狀態變數是由這個鎖保護的。

假設對於該狀態變數 只有寫操作時是同步的,讀操作沒有使用,那麼某個執行緒讀取到該狀態變數,並使用的過程中,其他的執行緒正在修改這個狀態變數

Java併發程式設計實踐 第二章 執行緒安全性

如果當多個執行緒訪問同乙個可變的狀態變數時沒有使用合適的同步,那麼程式就會出現錯誤。有三種方式可以修復這個問題 2.將狀態變數修改為不可變的變數。3.在訪問狀態變數時使用同步。執行緒安全性 當多個執行緒訪問某個類時,這個類始終都能表現出正確的行為,那麼就稱這個類是執行緒安全的。重入 當某個執行緒請求...

java併發程式設計實戰 第二章

執行緒安全性的定義 最核心概念 準確性,當多個執行緒訪問某個類的時,這個類始終都能biao表現出正確的行為,那麼就稱這個類是執行緒安全的。加鎖機制 1.通過內建的鎖機制 同步 塊 synchronized 分為兩個部分 鎖的 物件引用 方法呼叫的物件 鎖保護的 塊 synchronized關鍵字修飾...

python第二章上機實踐 第二章上機實踐報告

設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。輸入格式 輸入有兩行 第一行是n和k,0 第二行是n個整數 輸出格式 輸出第k小的數 輸入樣例 在這裡給出一組輸入。例如 10 4 2 8 9 0 1 3 6 7 8 2 輸出樣例 在這裡給出相應的輸出。例如 ...