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...