執行緒安全與死鎖

2022-08-24 17:18:13 字數 1893 閱讀 3348

一、實現多執行緒的方式:

方式一:繼承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 testdeadlock 

private 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.建立自定義類的...