13 執行緒安全

2022-04-19 20:17:46 字數 2923 閱讀 5465

【執行緒安全概念】

當多個執行緒訪問某乙個類(或物件、方法)時,這個類始終都能表現出正確的行為,那麼這個類就是執行緒安全的。

【synchronized】

可以在任意物件及方法上加鎖,而加鎖的這段**被稱為「互斥區」或「臨界區」。

【不加synchronized和加synchronized的不同情況】

package com.higgin.part1;

public

class

mythread extends thread

public

static

void

main(string args)

}

【執行結果:不加synchronized鎖(結果無法確定)】

【執行結果:加synchronized鎖】

【多個執行緒多個鎖的情況(區別物件鎖和類鎖)】

package com.higgin.part2;

public

class

mythread

else

if(tag.equals("b"

)) system.

out.println("

【finally】tag =

"+tag +"

, num =

"+num);

} catch

(interruptedexception e)

}public

static

void

main(string args)

});thread t2 = new thread(new

runnable()

});t1.start();

//如果執行緒安全,必須得等t1執行完run方法,釋放鎖之後,t2才能獲得鎖執行run方法

t2.start();}}

【執行結果:不加static,非靜態方法,為物件鎖,可以看到t1和t2兩個執行緒時併發執行的】

【執行結果:加上static,靜態方法,為類鎖,t1和t2同步執行】

【物件的同步和非同步】

同步:synchronized

同步的概念就是共享,要牢記「共享」兩個字,如果不是共享的資源,沒有必要同步。

非同步:asynchronized

非同步的概念就是獨立,相互之間不受到任何制約。比如http請求中,在頁面發起ajax請求時,我們依然可以繼續瀏覽或者操作頁面內容,二者之間沒有任何關係。

[ 執行緒安全的特性 ]

同步的目的就是為了執行緒安全,執行緒安全的兩個特性:原子性(同步)、可見性。

package com.higgin.part3;/**

* 物件鎖的同步和非同步問題 */

public

class

myobject

catch

(interruptedexception e)

}/*

** 針對的是同乙個物件的物件鎖

* 加上synchronized :當乙個執行緒已經在執行setnum()方法的時候,另乙個執行緒無法訪問readnum方法

* 不加synchronized :當乙個執行緒已經在執行setnum()方法的時候,另乙個執行緒可以訪問readnum方法

*/public

void

readnum()

public

static

void

main(string args)

},"t1

");

thread t2 = new thread(new

runnable()

},"t2

");t1.start();

t2.start();}}

【執行結果:readnum()不加synchrobized鎖,t1持有setnum方法的鎖,但t2不會去等待t1釋放鎖,直接去執行readnum方法】

【執行結果:readnum()加上synchronized鎖,t1持有setnum方法的鎖,t2必須等待t1釋放鎖才能獲得readnum方法的鎖】

【分析】

上面這個例子即乙個「髒讀」的例子。

對乙個物件的方法加鎖時,需要考慮業務的完整性,即為setvalue()/getvalue()方法同時加鎖synchronized關鍵字,保證業務的完整性。

【問:當乙個執行緒進入乙個物件的synchronized的方法時,其他執行緒是否可以進入此物件的其他方法?】

答:1.如果是建立的不同物件(如myobj1、myobj2物件),那麼兩個物件執行各自的方法不會相互影響,為非同步的。

2.如果是同乙個物件(只有乙個myobj物件),如果乙個執行緒進入乙個物件的synchronized修飾的方法,如果其他的那個方法是非sychronized方法,那麼是可以訪問的。

3.如果是同乙個物件(只有乙個myobj物件),如果乙個執行緒進入乙個物件的synchronized修飾的方法,如果其他的那個方法是sychronized方法,那麼是不可以訪問的。

多執行緒 13 守護執行緒

執行緒分為兩大類 使用者執行緒和守護執行緒 daemon 一般預設為使用者執行緒,守護執行緒不看虛擬機器的臉色,而是看使用者執行緒的臉色,虛擬機器必須確保使用者執行緒執行完畢,守護執行緒是為使用者執行緒服務的,不用等它執行完畢,它默默的為我們服務比如後台日誌,監控記憶體。練習 package com...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...