自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java線程死鎖如何避免這一悲劇

開發(fā) 后端
Java線程死鎖如何避免這一災(zāi)難發(fā)生呢?下面我們就詳細(xì)的看看如何才能更好的解決相關(guān)的問題。希望大家有所收獲。

Java線程死鎖需要如何解決,這個問題一直在我們不斷的使用中需要只有不斷的關(guān)鍵。不幸的是,使用上鎖會帶來其他問題。讓我們來看一些常見問題以及相應(yīng)的解決方法:

Java線程死鎖

Java線程死鎖是一個經(jīng)典的多線程問題,因為不同的線程都在等待那些根本不可能被釋放的鎖,從而導(dǎo)致所有的工作都無法完成。假設(shè)有兩個線程,分別代表兩個饑餓的人,他們必須共享刀叉并輪流吃飯。他們都需要獲得兩個鎖:共享刀和共享叉的鎖。#t#

假如線程 “A”獲得了刀,而線程“B”獲得了叉。線程“A”就會進(jìn)入阻塞狀態(tài)來等待獲得叉,而線程“B”則阻塞來等待“A”所擁有的刀。這只是人為設(shè)計的例子,但盡管在運行時很難探測到,這類情況卻時常發(fā)生。雖然要探測或推敲各種情況是非常困難的,但只要按照下面幾條規(guī)則去設(shè)計系統(tǒng),就能夠避免Java線程死鎖問題:

讓所有的線程按照同樣的順序獲得一組鎖。這種方法消除了 X 和 Y 的擁有者分別等待對方的資源的問題。

將多個鎖組成一組并放到同一個鎖下。前面Java線程死鎖的例子中,可以創(chuàng)建一個銀器對象的鎖。于是在獲得刀或叉之前都必須獲得這個銀器的鎖。

將那些不會阻塞的可獲得資源用變量標(biāo)志出來。當(dāng)某個線程獲得銀器對象的鎖時,就可以通過檢查變量來判斷是否整個銀器集合中的對象鎖都可獲得。如果是,它就可以獲得相關(guān)的鎖,否則,就要釋放掉銀器這個鎖并稍后再嘗試。

最重要的是,在編寫代碼前認(rèn)真仔細(xì)地設(shè)計整個系統(tǒng)。多線程是困難的,在開始編程之前詳細(xì)設(shè)計系統(tǒng)能夠幫助你避免難以發(fā)現(xiàn)Java線程死鎖的問題。

Volatile 變量,volatile 關(guān)鍵字是 Java 語言為優(yōu)化編譯器設(shè)計的。以下面的代碼為例:

 

  1. class VolatileTest {  
  2. public void foo() {  
  3. boolean flag = false;  
  4. if(flag) {  
  5. //this could happen  
  6. }  
  7. }  

 

一個優(yōu)化的編譯器可能會判斷出if部分的語句永遠(yuǎn)不會被執(zhí)行,就根本不會編譯這部分的代碼。如果這個類被多線程訪問, flag被前面某個線程設(shè)置之后,在它被if語句測試之前,可以被其他線程重新設(shè)置。用volatile關(guān)鍵字來聲明變量,就可以告訴編譯器在編譯的時候,不需要通過預(yù)測變量值來優(yōu)化這部分的代碼。

無法訪問的Java線程死鎖有時候雖然獲取對象鎖沒有問題,線程依然有可能進(jìn)入阻塞狀態(tài)。在 Java 編程中IO就是這類問題最好的例子。當(dāng)線程因為對象內(nèi)的IO調(diào)用而阻塞時,此對象應(yīng)當(dāng)仍能被其他線程訪問。該對象通常有責(zé)任取消這個阻塞的IO操作。造成阻塞調(diào)用的線程常常會令同步任務(wù)失敗。如果該對象的其他方法也是同步的,當(dāng)線程被阻塞時,此對象也就相當(dāng)于被冷凍住了。

其他的線程由于不能獲得對象的Java線程死鎖,就不能給此對象發(fā)消息(例如,取消 IO 操作)。必須確保不在同步代碼中包含那些阻塞調(diào)用,或確認(rèn)在一個用同步阻塞代碼的對象中存在非同步方法。盡管這種方法需要花費一些注意力來保證結(jié)果代碼安全運行,但它允許在擁有對象的線程發(fā)生阻塞后,該對象仍能夠響應(yīng)其他線程。

 

責(zé)任編輯:張浩 來源: CSDN
相關(guān)推薦

2024-04-02 11:22:01

死鎖Java并發(fā)

2014-12-30 18:13:37

2019-10-29 16:10:55

死鎖Java并發(fā)

2011-12-23 13:42:05

JavaScript

2024-11-20 08:00:00

死鎖多線程編程

2021-03-10 14:36:33

機(jī)器人日本美國

2015-07-08 14:41:14

物聯(lián)網(wǎng)安全監(jiān)測踩踏

2010-06-29 17:32:13

SQL Server鎖

2017-09-09 15:13:10

2010-05-24 14:04:48

JavaSwing多線程

2021-03-28 09:12:58

多線程死鎖技術(shù)熱點

2010-07-20 08:56:37

SQL Server鎖

2015-03-18 09:21:53

編程Java死鎖

2021-03-03 08:57:46

java死鎖線程

2019-04-01 08:15:21

Java線程池多核處理器

2009-08-04 17:57:41

C#線程同步死鎖

2019-05-28 08:43:27

DBA

2020-08-13 08:45:09

多線程死鎖

2009-06-12 16:15:42

死鎖Java虛擬機(jī)

2019-02-20 14:16:43

點贊
收藏

51CTO技術(shù)棧公眾號