安全與死鎖問題

2022-08-24 17:12:06 字數 2045 閱讀 6219

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

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

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 修飾後,隱式的鎖...