第二章物件及變數的併發訪問

2021-08-20 08:09:01 字數 1476 閱讀 9044

今天這一章應該是看不完的,把現在看的一部分先記錄進來,剩下的部分之後看完再加。

首先說明了「非執行緒安全」問題存在於例項變數中,如果是方法內部的私有變數,則不存在「非執行緒安全」問題。

這一章主要是講的併發訪問問題,處理併發問題可以使用synchronized同步方法,列舉了三種型別的例子:

1、兩個執行緒修改同乙個例項變數,並且執行緒都不加synchronized,會出現執行緒安全問題。

2、兩個執行緒修改同乙個例項變數,其中乙個執行緒加了synchronized,會出現執行緒安全問題。

3、兩個執行緒修改同乙個例項變數,兩個執行緒都加了synchronized,不會出現執行緒安全問題。

synchronized是物件鎖,也就是說當乙個有synchronized方法的類被建立了多個物件,每個物件都會有一把鎖,多個執行緒訪問這多個物件,是非同步進行訪問。

髒讀:多個執行緒操作乙個物件的例項變數時,有可能會出現髒讀,就是在讀資料的過程中,資料被改了。

鎖重入:指的是在乙個synchronized方法內,去呼叫相同物件鎖的別的方法,可以直接獲取鎖。子類可以通過鎖重入呼叫父類的synchronized方法。

出現異常,鎖自動釋放。子類重寫父類synchronized方法,不會自動去繼承synchronized方法,還需要自己去加。

synchronized(物件)區分同步是否生效,主要就是判斷括號中的物件是否相等,這個相等不是值相等,是位址值相等。

synchronized public static void test()和synchronized public void test()同步的鎖是不一樣的,帶有static的方法上使用的事類鎖(class鎖),沒有static的方法是物件鎖(object鎖)

類鎖加在**塊上是public static void print()}

使用string型別字串作為鎖時注意,string具有常量池快取的功能,兩個「aa」就是一把鎖,而兩個new object()是兩把鎖。

下面是乙個關鍵點:

有兩個執行緒(執行緒1,執行緒2)需要競爭同一把鎖,他們同時開啟,先搶到鎖的先執行完,直到釋放鎖,另乙個執行緒才會接著執行。正常情況下是這樣,如果執行緒1先拿到鎖,在執行過程中將鎖的值修改了,這樣結果會發生什麼變化呢?

1、他們同時開始執行的,首先執行緒1拿到鎖且執行到修改了鎖那裡,這個時候執行緒2需要的鎖還是之前的,所以執行緒2並不會執行,還是會等到執行緒1釋放完鎖才會執行。

2、如果執行緒1線執行且拿到鎖並修改值,但是並未執行完,這個時候執行緒2開始執行,那麼執行緒2就會和執行緒1非同步執行了,執行緒2需要的鎖會發生變化。

volatile:主要作用是使變數在多個執行緒間可見。使用場景就是可以在多個執行緒中感知例項變數被更改了,並且可以獲得最新的值使用,也就是用多執行緒讀取共享變數時可以獲得最新的值使用。

伺服器在執行時會有乙個公共堆疊和乙個執行緒的私有堆疊,伺服器為了提高效率,通常會去私有堆疊獲取變數值,當公共堆疊的值發生改變時就造成了資料的不一致,而在變數上加了volatile可以強制讓執行緒去讀取公共記憶體中的值,這樣就讓例項變數在多個執行緒中保證了可見性。

物件及變數的併發訪問

10 volatile的作用是強制從公共堆疊中讀取變數的值,而不是從執行緒私有資料堆疊取得變數的值 例項情況 在jvm被設定為 server模式時,為了執行緒的執行效率,執行緒一直在私有堆疊中取得執行緒變數的值,11 volatile增加了例項變數在多執行緒之間的可見性,但它卻不具有同步性,也就不具...

c 第二章 變數

c 基本算術型別 char 8位 wchar t 16位 short 16位 int 16位 long 32位 float 6位有效數字 double 10位有效數字 long double 10位有效數字 1.8位的塊為乙個位元組,32位為乙個字 2.unsigned無符號型別,表示大於等於0的數...

第二章 shell變數

檢視所有全域性和區域性變數 delare和set 檢視所有全域性變數 env 定義環境變數 使用者變數在家目錄下的 bash profile和 bashrc中設定 全域性變數在 etc profile和 etc bashrc及 etc profile.d 下的指令碼檔案 登入shell待用流程 et...