Java 多線程中的死鎖問題
Java中的多線程使用
synchronized關(guān)鍵字實(shí)現(xiàn)同步.為了避免線程中使用共享資源的沖突,當(dāng)線程進(jìn)入
synchronized的共享對(duì)象時(shí),將為共享對(duì)象加上鎖,阻止其他的線程進(jìn)入該共享對(duì)象.但是,正因?yàn)檫@樣,當(dāng)多線程訪問多個(gè)共享對(duì)象時(shí),如果線程鎖定對(duì)象的順序處理不當(dāng)話就有可能線程間相互等待的情況,即常說的: 死鎖現(xiàn)象.
比如下面演示了一個(gè)典型的死鎖的情況:
線程:MyThread
/**?*/
/**
?*?共享線程
?*
*/
Class?MyThread?
extends
?Thread
{
??
private
?String?threadName;
??
private
?String?shareObj1,shareObj2;

??
public
?MyThread(String?name,String?shareObj1,String?shareObj2)
{
????
this
.threadName?
=
?name;
????
this
.shareObj1?
=
?shareObj1;
????
this
.shareObj2?
=
?shareObj2;
????start();
??}
??
public
?run()
{

????
synchronized
(shareObj1)
{
??????System.out.println(threadName?
+
?
"
locked?for?shareObj1
"
);
????}
????Thread.sleep(
1000
);

????
synchronized
(shareObj1)
{
??????System.out.println(threadName?
+
?
"
locked?for?shareObj2
"
);
????}
??}
}
主程序:Main
public
?
class
?Main
{
??
private
?String?shareObj1?
=
?
"
share?object?1
"
;
??
private
?String?shareObj2?
=
?
"
share?object?2
"
;

??
public
?
static
?main(String[]?args)
{
????MyThread?thread1?
=
?
new
?MyThread(
"
thread1
"
,shareObj1,shareObj2);
????Thread.sleep(
1000
);
????MyThread?thread2?
=
?
new
?MyThread(
"
thread2
"
,shareObj1,shareObj2);
??}
}
運(yùn)行結(jié)果:
比如下面演示了一個(gè)典型的死鎖的情況:
線程:MyThread


































主程序:Main













運(yùn)行結(jié)果:
posted on 2007-07-24 19:02 zJun's帛羅閣 閱讀(3235) 評(píng)論(1) 編輯 收藏 所屬分類: Java基礎(chǔ)