java死锁问题 synchronized 该锁什么东西 ?下面这个程序是我找的死锁例子

[复制链接]
查看11 | 回复1 | 2011-5-1 01:57:56 | 显示全部楼层 |阅读模式
publicclasssisuo{


publicstaticvoidmain(String[]args){
Xiancx1=newXianc();
Xiancx2=newXianc();
x1.fag=0;
x2.fag=1;
Threadt1=newThread(x1);
Threadt2=newThread(x2);
t1.start();
t2.start();

}

}

classXiancimplementsRunnable{
intfag=2;
staticObjecto1=0,o2=1;
publicvoidrun(){
System.out.println(\"fag=\"fag);
if(fag==1){
synchronized(o1){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
synchronized(o2){
System.out.println(\"1\");
}
}
}
if(fag==0){
synchronized(o2){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
synchronized(o1){
System.out.println(\"0\");
}
}
}

}
}


java死锁问题synchronized该锁什么东西?下面这个程序是我找的死锁例子
synchronized一般都锁什么我看例子里面的o1o2感觉和整个程序没多大联系
就在锁的地方出现到底锁什么东西啊??
回复

使用道具 举报

千问 | 2011-5-1 01:57:56 | 显示全部楼层
synchronized(obj){
...
}
称之为对obj加锁的同步代码块。
你可以这么理解,每一个java对象,都具有一个锁标记。而这个锁标记,同时只能分配给一个线程。
有synchronized(o),意思是只有获得o对象的锁标记之后,后面的代码块才会执行,否则会等待。

回到你的例子。x1和x2是两个不同的Xianc对象,但是,对于static的属性来说,任何Xianc对象都共享相同的值。因此,实际上,x1的o1属性和x2的o1属性指向同一个对象,而x1的o2属性和x2的o2属性也指向相同的对象。

也就是说,Xianc.o1和Xianc.o2表示两个对象,这两个对象被x1和x2作为静态属性共享。

然后,我们开始考虑锁标记的事情。程序中创建了两个线程t1和t2,并首先启动了t1线程。t1线程与x1绑定,此时执行的是flag==0的代码块。
首先,遇到sync(o2),由于此时o2的锁标记还没有被分配,因此t1线程就能获得o2的锁标记,进入代码块。
进入代码块之后,接下来是sleep。由于t1线程sleep之后,释放了cpu,导致t2线程开始运行。由于t2线程与x2绑定,此时执行的是flag==1的代码块。
这时,t2线程遇到sync(o1)。由于o1的锁标记没有被分配,因此t2线程就能获得o1的锁标记,进入代码块。同样的,进入代码块之后,t2也进入了sleep状态,释放了CPU。

过了一段时间,t1率先苏醒,并被执行。但是执行过程中,会遇到syn(o1)。此时,o1的锁标记被t2线程占据,t1无法获得锁标记,于是t1只能等待。

在等待过程中,t2也苏醒了。但是t2遇到了syn(o2),而此时o2的锁标记被t1占据,因此t2也只能等待。

于是,两个线程相互等待,就形成了死锁。

手打,楼主给分
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行