JUC 執行緒八鎖

2021-09-07 18:35:33 字數 1816 閱讀 9793

1,乙個物件裡面如果有多個synchronized方法,某乙個時刻內,只要乙個執行緒去呼叫其中的乙個synchronized方法了,其它的執行緒都只能等待,

換句話說,某乙個時刻內,只能有唯一乙個執行緒去訪問這些synchronized方法。

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

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

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

5,都換成靜態同步方法後,情況又變化

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

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

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

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

例項**:

package

com.atguigu.juc;

/** 題目:判斷列印的 "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 例項

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

public

class

testthread8monitor

}).start();

new thread(new

runnable()

}).start();

/*new thread(new runnable()

}).start();*/}

}class

number

catch

(interruptedexception e)

system.out.println("one");

}public

synchronized

void gettwo()

public

void

getthree()

}

JUC 執行緒八鎖

package org.meng.juc 題目 判斷列印 one or two 1.兩個普通同步方法,兩個執行緒 標準列印,列印?one two 2.新增thread.sleep 3000 給getone 列印?3s 後列印 one two 3.新增普通方法 getthreee 列印?先列印thre...

JUC 八鎖現象

由鎖引發的8個問題 同一物件,兩個同步方法,哪個先行?同一物件,兩個同步方法,先被呼叫的執行前鎖住2s,哪個先行?乙個物件,乙個同步,乙個普通方法,哪個先行?兩個物件,分別呼叫兩個同步方法,先被呼叫的執行前鎖住2s,哪個先行?增加兩個靜態同步方法,哪個先行?兩個物件,分別呼叫兩個靜態同步方法,哪個先...

juc學習備忘錄 執行緒八鎖

package com.wyz.juc 執行緒八鎖 題目 判斷列印的 one or two 1.兩個普通同步方法,兩個執行緒,標準列印,列印?one two 2.新增tread.sleep 給getone 列印?one two 3.新增普通的getthree 列印?three one two 4.兩...