JUC探索筆記之二 synchronized

2021-10-01 05:53:41 字數 2028 閱讀 5119

在多執行緒環境下,共享資料會存在安全問題,sychronized可以保證同一時只有乙個執行緒能進入**塊或者是這個方法。因此synchronized可以有三種用法:修飾**塊,修飾類中的普通方法(鎖例項物件),修飾靜態方法(鎖類物件)。

下面來看下作用於普通方法的例子

實驗1:手機類有兩個普通同步方法:發簡訊和發郵件

class

phone

public

synchronized

void

sendms()

throws exception

}

下面建立資源類phone, 通過thread.sleep()來使得a執行緒先啟動,在哪個執行緒裡面呼叫sleep()方法就阻塞哪個執行緒,所以main執行緒到這裡會堵塞住

public

class

lockdemo

catch

(exception e)},

"a")

.start()

; thread.

sleep

(100);

//人為讓a先啟動

newthread((

)->

catch

(exception e)},

"b")

.start()

;}}

結果是 「sendemail」 必定在 "sendmessage"之前,分析:兩個執行緒對乙個物件中的普通方法進行操作,乙個物件只有一把鎖,只有乙個執行緒能搶到這個鎖。

實驗2: 手機類有1個普通同步方法(sendemail),1個普通方法(sayhello)

public

void

sayhello()

}

這裡為了看出來效果,讓sendemail方法停滯 4秒,如果sayhello被阻塞,也會有感覺。

public

class

lockdemo

catch

(exception e)},

"a")

.start()

; thread.

sleep

(100);

//人為讓a先啟動

newthread((

)->

catch

(exception e)},

"b")

.start()

;}}

結果say hello必定在sendemail之前馬上出來。結論:執行緒占用普通同步方法不影響別的執行緒使用同一實現類的其他普通方法。以此類推如果呼叫另外乙個實現類的普通方法,更不會有什麼影響。

實驗3 : 兩個同步方法加上static關鍵字程式設計靜態同步方法。這裡建了就兩個資源類:phone 和phone2,分別呼叫一種靜態同步方法

class

phone

public

static

synchronized

void

sendms()

throws exception

public

static

void

main

(string[

] args)

throws interruptedexception

catch

(exception e)},

"a")

.start()

; thread.

sleep

(100);

newthread((

)->

catch

(exception e)},

"b")

.start()

;}

結果是sendemail先於sendmsg出現,結論:靜態同步方法鎖類。

以此類推,如果是同乙個資源類呼叫兩個靜態同步方法,更是要互相衝突的。如果是靜態同步方法和普通方法,是不會互相影響的,這裡就不作贅述。

探索式測試學習筆記之二 全域性探索式測試法

我們知道探索式測試的目標是 1 找出缺陷 2 強迫軟體展現其能力 3 證明軟體實現了哪些功能 whittaker又把全域性探索式測試叫做漫遊測試,把我們測試物件,比喻成我們將要旅遊 的乙個城市。根據我們要訪問城市各區域的目的,把城市各區域有分為 商業區,歷史區,娛樂區,旅遊區,旅館區和破舊區。相應的...

python探索筆記 二

str runoob print str 輸出字串 print str 0 1 輸出第乙個到倒數第二個的所有字元 print str 0 輸出字串第乙個字元 print str 2 5 輸出從第三個開始到第五個的字元 print str 2 輸出從第三個開始的後的所有字元 print str 2 輸...

python筆記之二

2.使用python實現http連線 其實使用python實現http連線的方法還是十分簡單的。比如說,我們不要求什麼,僅僅只需要獲取內容時,我們可以這樣的書寫 但是對實際應用來說,這個簡單的句子也是不能夠滿足我們各式各樣的開發需求的。比如說,我們需要user agent redirects gzi...