JUC介紹 鎖的理解 4組問題闡述鎖

2021-10-23 15:57:28 字數 2518 閱讀 5918

1.標準情況下(sendmsg沒有延遲),兩個執行緒先列印發簡訊還是打**–>結果:先列印發簡訊

2.sendmsg延遲4秒的情況下,兩個執行緒先列印發簡訊還是打**–>結果:先列印發簡訊

解答:這種情況並不是因為**書寫順序的原因,而是因為有鎖的存在;

synchronized鎖的物件是方法的呼叫者phone,而兩個方法用的是同乙個鎖,誰先拿到鎖就要先執行完畢才會釋放給下乙個

public

class

lock8question01

catch

(exception e)

newthread((

)-> phone.

call()

,"b").

start()

;}}class

phone

catch

(exception e)

system.out.

println

("發簡訊");

}public

synchronized

void

call()

}

3.phone新增乙個沒有synchronized修飾的普通方法hello,第二個執行緒呼叫這個hello方法,兩個執行緒先列印發簡訊還是hello–>結果:先列印hello

解答:普通方法沒有synchronized的限制不受鎖的影響

4.建立兩個物件,兩個執行緒分別執行兩個物件的同步方法,兩個執行緒先列印發簡訊還是打**–>結果:先列印打**

解答:synchronized鎖的是this物件,兩個物件有兩把鎖,所以會按時間(速度)執行

public

class

lock8question02

catch

(exception e)

newthread((

)-> phone2.

call()

,"b").

start()

;}}class

phone2

catch

(exception e)

system.out.

println

("發簡訊");

}public

synchronized

void

call()

public

void

hello()

}

5.兩個靜態的同步方法,只有乙個物件,兩個執行緒先列印發簡訊還是打**–>結果:先列印發簡訊

解答:static方法類一載入就有了,此時synchronized鎖的是類的class物件,這個物件全域性唯一,也就是同一把鎖

6.兩個靜態的同步方法,建立兩個物件,兩個執行緒先列印發簡訊還是打**–>結果:先列印發簡訊

解答:一旦方法被static修飾,synchronized鎖的是類的class物件,即生成物件的類模板,類模板只有乙個,也就是同一把鎖

public

class

lock8question03

catch

(exception e)

newthread((

)-> phone2.

call()

,"b").

start()

;}}class

phone3

catch

(exception e)

system.out.

println

("發簡訊");

}public

static

synchronized

void

call()

}

7.乙個普通同步方法和乙個靜態同步方法,只有乙個物件,兩個執行緒先列印發簡訊還是打**–>先列印打**

解答:普通方法鎖的是呼叫者,靜態方法鎖的是class模板,是兩個不同的鎖

8.乙個普通同步方法和乙個靜態同步方法,建立兩個物件,兩個執行緒先列印發簡訊還是打**–>先列印打**

解答:仍然是兩個不同的鎖

public

class

lock8question04

catch

(exception e)

newthread((

)-> phone2.

call()

,"b").

start()

;}}class

phone4

catch

(exception e)

system.out.

println

("發簡訊");

}public

synchronized

void

call()

}

要點小結

new this 是物件級別的,鎖的是具體的物件

static class 是類級別的,鎖的是唯一的模板

面試系列 JUC中常見的鎖

公平鎖 是指多個執行緒按照申請鎖的順序來獲取鎖類似排對打飯,先來後到 非公平鎖 是指在多執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取到鎖,在高併發的情況下,有可能造成優先順序反轉或者飢餓現象 並發包reentrantlock的建立可以指定建構函式的boole...

面試系列 JUC中常見的鎖

公平鎖 是指多個執行緒按照申請鎖的順序來獲取鎖類似排對打飯,先來後到 非公平鎖 是指在多執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取到鎖,在高併發的情況下,有可能造成優先順序反轉或者飢餓現象 並發包reentrantlock的建立可以指定建構函式的boole...

JUC 3 0 鎖 Lock的基本使用

在併發開發中,鎖也是經常使用的乙個工具,主要是用於對共享資源的控制,常用的鎖就是lock和synchronized,這兩個鎖都可以達到執行緒安全的目的,但是在使用上有較大差別.lock一般情況用於synchronized不滿足要求或者不合適的時候,lock是乙個介面,最常用的實現類就是reentra...