一、實現多執行緒的方式:
方式一:繼承thread類
a.自定義類繼承thread類
b.在自定義類中重寫run()方法
c.建立自定義類的物件
d.啟動執行緒的物件
方式二:實現runnable介面(大多數使用)
a.自定義類實現runnable介面
b.在自定義類中重寫run()方法
c.建立自定義類的物件
d.建立thread類的物件,並把c步驟建立的物件作為構造引數傳遞
優點:避免由於單繼承帶來的侷限性
適合多個程式的**處理同乙個資源的情況,把執行緒同程式的**、資料有效分離,較好的體現了物件導向的設計思想。
publicclass
sellticket implements runnable
catch
(interruptedexception e)
system.
out.println(thread.currentthread().getname()+"
正在**第
"+(tickets--)+"張票"
); }
}
}}
publicclass
sellticketdemo
}
出現多執行緒安全問題的原因:
1.是否是多執行緒環境
2.是否共享資料
3.是否有多條語句操作共享資料
二、解決執行緒安全問題——
方式一、同步**塊
同步機制:把多條語句操作共享資料的**給包成乙個整體,讓某個執行緒在執行的時候,別人不能來執行
格式:synchronized(物件)
同步可以解決安全問題的根本原因就在這個物件上。該物件如同鎖的功能。多個執行緒,需要共同擁有乙個物件
用法:在run()方法外建立乙個物件 object obj = new object(); 物件是任意建立的
.......
while(true)
run()方法中直接呼叫 但是需要注意鎖物件的問題
同步方法的鎖物件是this
靜態方法的鎖物件是類的位元組碼檔案物件 即當前類名.class (靜態方法是隨著類的載入而載入)
方式二、lock鎖的使用(lock屬於介面)
1.明確看到在哪加鎖,在哪釋放鎖
2.方法:void lock();獲取鎖 void unlock();釋放鎖
3.reentrantlock是lock的實現類。
用法:
在自定義類中定義鎖物件 如:private lock lock = new reentrantlock();
.......
while(true) finally ...
三、死鎖問題
是指兩個或兩個以上的執行緒在執行的過程中,因爭奪資源產生的一種互相等待的現象
同步弊端:效率低
如果出現同步巢狀就容易產生死鎖問題
出現死鎖問題例子:
publicclass
mylock
public
class
dielock extends thread
public
void
run() }}
else}}
}}public
class
demo
}
有兩把鎖obja、objb,兩個執行緒d1、d2, d1為true會進入第一部分**塊,d2進入第二部分**塊,理想狀態下,d1和d2正常交叉走完**塊,但是由於兩個執行緒搶cpu的執行權時,有可能出現d1走完第一部分的第乙個鎖後進入下乙個鎖時,d2在第二部分**塊還沒有執行完第乙個鎖,所以會等待d2完成,然後兩個執行緒進入不到對方的**塊中以至於互相等待,因此出現死鎖現象。
四、執行緒通訊
不同種類的執行緒針對同乙個資源的操作。
若想共享資料來源,可以在外界把這個資料來源物件建立出來,通過構造方法傳遞給其他的類。
執行緒安全與死鎖
一 實現多執行緒的方式 方式一 繼承thread類 a.自定義類繼承thread類 b.在自定義類中重寫run 方法 c.建立自定義類的物件 d.啟動執行緒的物件 方式二 實現runnable介面 大多數使用 a.自定義類實現runnable介面 b.在自定義類中重寫run 方法 c.建立自定義類的...
互斥鎖 死鎖與執行緒安全
一 典型的兩種死鎖情形 一 執行緒自己將自己鎖住 一般情況下,如果同乙個執行緒先後兩次呼叫lock,在第二次調 用時,由於鎖已經被占用,該執行緒會掛起等待占用鎖的執行緒釋放鎖,然而鎖正是被自己占用著的,該執行緒又被掛起而沒有機會釋放鎖,因此 就永遠處於掛起等待狀態了,於是就形成了死鎖 deadloc...
執行緒共享資料的安全問題和死鎖問題
解決執行緒安全的問題 執行緒同步 同步 塊 同步方法 同步鎖 1.同步 塊 synchronized 同步監視器 同步監視器 俗稱 鎖 可以使用任何物件充當。但是必須確定多個執行緒持有同一把鎖 同乙個物件 2.同步方法 同步方法 隱式的鎖 this 如果同步方法被靜態 static 修飾後,隱式的鎖...