執行緒安全問題是如何產生的:
多個執行緒同時爭搶乙個公共資源。當乙個執行緒執行到一半的時候,執行緒失去時間片,處於等待狀態,其他執行緒修改公共資源。此時當這個屬於等待狀態的執行緒再回來的時候,繼續操作的資料就是修改之後的,而這個時候兩個執行緒都修改過這個資源,就容易造成問題。
如何解決:
使用鎖機制。在可能出現執行緒安全問題的**塊部分,加上鎖,這麼鎖通常在普通方法的時候是this,在static方法的時候是類名.class這個物件。乙個執行緒將一段**加上鎖之後,這個段**不進行完,這個鎖物件不會被釋放。其他的執行緒即便準備執行這段**由於拿不到鎖物件也會無法執行。
兩種加鎖的方式:
一:synchronized**塊
/*
* 本類用於演示第二種實現runnable介面的方式多執行緒
* 三個視窗賣100張票,賣完退出
* 實現runnable介面的方式由於開啟多執行緒的時候建立的多個thread物件,所以只需要乙個自定義執行緒類物件,
* 那麼這個自定義執行緒類物件的普通屬性就可以被多個執行緒同時方法。所以我們說實現runnable介面的方式更適合多個執行緒訪問同乙個資料。
* 本類採用synchronized**塊處理執行緒安全問題
*/public
class
sellticket
implements
runnable
trycatch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+"售票視窗賣出一張票~~~~~~~~~~~~~~~~~當前還剩餘:"+(
--ticket));
}}}}
synchronized**塊需要乙個鎖物件,通常普通方法這個鎖物件就是this。
二:synchronized方法
當乙個方法裡所有的**都應該被synchronized**塊括中的時候,就直接將這個synchronized關鍵字加上方法的修飾上。此時方法內所有的**是執行緒安全的。那麼鎖物件就是this,不能更改。
/*
* 本類用於演示第二種實現runnable介面的方式多執行緒
* 三個視窗賣100張票,賣完退出
* 實現runnable介面的方式由於開啟多執行緒的時候建立的多個thread物件,所以只需要乙個自定義執行緒類物件,
* 那麼這個自定義執行緒類物件的普通屬性就可以被多個執行緒同時方法。所以我們說實現runnable介面的方式更適合多個執行緒訪問同乙個資料。
* 本類採用synchronized方法處理執行緒安全問題
*/public
class
sellticket2
implements
runnable
}// 執行緒安全的方法,synchronized的方法相當於將乙個synchronized**塊的開始和方法的開始一起,結束和方法的結束一起。
// synchronized的方法的鎖物件就是this
public
synchronized
void
sellsticket()
trycatch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+"售票視窗賣出一張票~~~~~~~~~~~~~~~~~當前還剩餘:"+(
--ticket));
}}
注意:由於鎖機制是將原本的多執行緒程式設計單執行緒。所以加了鎖的**執行效率會降低。
執行緒的死鎖問題:
死鎖不同的執行緒分別占用對方需要的同步資源不放棄,都在等待對方放棄自己需要的同步資源,就形成了執行緒的死鎖
解決方法
專門的演算法、原則
儘量減少同步資源的定義
public
class
testdeadthread
}class
deadthreaddemo
extends
thread
public
void
setflag
(boolean flag)
//想做出死鎖的效果首先需要兩把鎖,需要兩把鎖互相呼叫。
@override
public
void
run()}
}else}}
}}class
badboy
public
void
say()}
class
mrma
public
void
say(
)}
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...
Java執行緒安全和非執行緒安全
arraylist是非執行緒安全的,vector是執行緒安全的 hashmap是非執行緒安全的,hashtable是執行緒安全的 stringbuilder是非執行緒安全的,stringbuffer是執行緒安全的 什麼是執行緒安全?執行緒安全和非執行緒安全有什麼區別?分別在什麼情況下使用?非執行緒安...