Java JUC 高階執行緒之十一 執行緒八鎖

2021-09-14 07:42:49 字數 3635 閱讀 1861

乙個物件裡面如果有多個synchronized方法,某一時刻內,只要乙個執行緒去呼叫其中的乙個synchronized方法了,其它的執行緒都只能等待,換句話說,某一時刻內,只能有唯一乙個執行緒去訪問這些synchronized方法

鎖的是當前物件this,被鎖定後,其它的執行緒都不能進入到當前物件的其它的synchronized方法

加個普通方法後發現和同步鎖無關。

換成兩個物件後,不是同一把鎖了,情況立刻變化。

都換成靜態同步方法後,情況有變化。

所有的非靜態同步方法用的都是同一把鎖——例項物件本身,也就是說如果乙個例項物件的非靜態同步方法獲取鎖後,該例項物件的其他非靜態同步方法必須等待獲取鎖的方法釋放鎖後才能獲取鎖,可是別的例項物件的非靜態同步方法因為跟該例項物件的非靜態同步方法使用的是不同的鎖,所以無須等待該例項物件已獲取鎖的非靜態同步方法釋放鎖就可以獲取他們自己的鎖。

所有的靜態同步方法用的也是同一把鎖——類物件本身,這兩把鎖是兩個不同的物件,所以靜態同步方法與非靜態同步方法之間是不會有競態條件的。但是一旦乙個靜態方法獲取鎖後,其他的靜態同步方法都必須等待該方法釋放鎖後才能獲取鎖,而不管是同乙個例項物件的靜態同步方法之間,還是不同的例項物件的靜態同步方法之間,只要它們同乙個類的例項物件!

執行緒八鎖的關鍵:

/*

* 題目:判斷列印的是 "one" or "two"?

* 1. 兩個普通同步方法,兩個執行緒,標準列印,列印? //one two

* 2. 新增thread.sleep() 給getone() 列印? // one two

* 3. 新增普通方法getthree() , 列印 ? // three one two

* 4. 兩個普通的同步方法,兩個number 物件 ,列印? // two one

* 5. 修改getone()為靜態同步方法 列印?// two one

* 6. 修改兩個方法均為靜態同步方法,乙個number物件//one two

* 7. 乙個靜態同步方法,乙個非靜態同步方法,兩個number物件。列印? // two one

* 8. 兩個靜態同步方法,兩個number物件,列印? // one two

* * 執行緒八鎖的關鍵:

* ①非靜態方法的鎖預設為 this ,靜態方法的鎖為 對對應的class例項

* ②某一時刻內,只有乙個執行緒持有鎖,無論有幾個方法。

在getone方法裡面列印前加入下列**

try

catch

(interruptedexception e)

列印結果還是one two

加入新的方法

public

void

getthree()

//新增乙個執行緒

newthread

(new

runnable()

}).start()

;

輸入結果為 three one two

新增乙個number物件,並將main方法**修改如下形式

public

static

void

main

(string[

] args)})

.start()

;new

thread

(new

runnable()

}).start()

;// new thread(new runnable()

// }).start();

}

輸入結果為 two one

將getone變為static 方法,且使用乙個物件number1呼叫兩個getone和gettwo

public

static

synchronized

void

getone()

catch

(interruptedexception e)

system.out.

println

("one");

}

輸出結果為 two one

修改兩個方法getone()和gettwo(),然後乙個物件,兩個執行緒同時呼叫,結果為

修改getone()為靜態同步方法 gettwo()為非靜態同步方法,然後兩個物件呼叫,main方法**如下

public static void main(string args) 

}).start();

new thread(new runnable()

}).start();

}

兩個靜態同步方法,兩個number物件,main方法**如7.

結果為 one two

十一 執行緒同步

前面完成了多執行緒之後,那麼肯定會涉及到執行緒的同步問題。因為執行緒的執行是隨機的,亂序的。雖然我們這個小kernel實現的排程器演算法比較簡陋,它的隨機性沒那麼強,但是每次進行執行緒切換的時候,還是有可能產生問題。並且問題已經產生了。int main void return0 void k thr...

多執行緒(十一)執行緒安全介紹

當多執行緒同時共享,同乙個全域性變數或靜態變數,做寫的操作時,可能會發生資料資料衝突問題。但是做讀的操作時是不會發生資料衝突問題 需求如下 100張車票 有兩個視窗同時搶火車票,請使用多執行緒模擬搶票效果。package com.zuojie author zuojie public class t...

併發程式設計 9 執行緒池 高階執行緒管理

所以從管理執行緒和任務的機制,兩個角度介紹執行緒池。一 簡單的執行緒池 定義 管理乙個任務佇列,乙個執行緒佇列,然後每次取乙個任務分配給乙個執行緒去做,迴圈往復。作為最簡單的執行緒池,其擁有固定數量的工作執行緒 通常工作執行緒數量std thread hardware concurrency 相同 ...