一、實現多執行緒的方式:
方式一:繼承thread類
a.自定義類繼承thread類
b.在自定義類中重寫run()方法
c.建立自定義類的物件
d.啟動執行緒的物件
方式二:實現runnable介面(大多數使用)
a.自定義類實現runnable介面
b.在自定義類中重寫run()方法
c.建立自定義類的物件
d.建立thread類的物件,並把c步驟建立的物件作為構造引數傳遞
優點:避免由於單繼承帶來的侷限性
適合多個程式的**處理同乙個資源的情況,把執行緒同程式的**、資料有效分離,較好的體現了物件導向的設計思想。
public class sellticket implements runnable catch (interruptedexception e)system.out.println(thread.currentthread().getname()+"正在**第"+(tickets--)+"張票");
}}
}}
public class 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 ...
三、死鎖
死鎖是指多個執行緒執行過程中因爭奪資源而造成的一種僵局,當程序處於這種僵持狀態時,若無外力作用,它們都將無法再向前推進。
互斥條件:程序要求對所分配的資源進行排它性控制,即在一段時間內某資源僅為一程序所占用。
請求和保持條件:當程序因請求資源而阻塞時,對已獲得的資源保持不放。
不剝奪條件:程序已獲得的資源在未使用完之前,不能剝奪,只能在使用完時由自己釋放。
環路等待條件:在發生死鎖時,必然存在乙個程序--資源的環形鏈。
public class testdeadlockprivate static class thread1 implements runnable catch (interruptedexception e)
synchronized (obj2) }}
}private static class thread2 implements runnable catch (interruptedexception e)
synchronized (obj1) }}
}}
互斥鎖 死鎖與執行緒安全
一 典型的兩種死鎖情形 一 執行緒自己將自己鎖住 一般情況下,如果同乙個執行緒先後兩次呼叫lock,在第二次調 用時,由於鎖已經被占用,該執行緒會掛起等待占用鎖的執行緒釋放鎖,然而鎖正是被自己占用著的,該執行緒又被掛起而沒有機會釋放鎖,因此 就永遠處於掛起等待狀態了,於是就形成了死鎖 deadloc...
什麼是執行緒安全 死鎖
1 執行緒安全 每個程序都會被系統分配一塊公共區域,該區域就是堆 記憶體 該程序的所有執行緒都能訪問該堆 記憶體 的資料,在不受限制的情況下存在被意外修改的風險,這就是執行緒安全。存在競爭的執行緒就是不安全的,不存在競爭的執行緒就是安全的。2 死鎖 所謂死鎖是指多個併發執行緒因競爭系統資源而處於互相...
安全與死鎖問題
一 實現多執行緒的方式 方式一 繼承thread類 a.自定義類繼承thread類 b.在自定義類中重寫run 方法 c.建立自定義類的物件 d.啟動執行緒的物件 方式二 實現runnable介面 大多數使用 a.自定義類實現runnable介面 b.在自定義類中重寫run 方法 c.建立自定義類的...