怎么想都想不明白。明明按视频教程里写的是死锁,怎么还能循环呢?
class Lie
{
public static void main(String[] args)
{
Dear d=new Dear();
new Thread(d).start();
try
{
Thread.sleep(1);
}
catch(Exception e)
{
e.printStackTrace();
}
d.b=true;
new Thread(d).start();
}
}
class Dear implements Runnable
{
int i=180;
Object obj=new Object();
Boolean b=false;
public void run()
{
if(b==false)
{
while(true)
sun();
}
else
{
while(true)
{
synchronized(obj)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
synchronized(this)
{
if(i>0)
{
System.out.println("run this:"+Thread.currentThread().getName()+
"i:"+i);
i--;
}
}
}
}
}
}
public synchronized void sun()
{
synchronized(obj)
{
if(i>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("sun is:"+Thread.currentThread().getName()+
"i:"+i);
i--;
}
}
}
}
始终不明白,检查了好几遍,头疼,请高手指点。。
public synchronized void sun()
//死锁临界区间(C)
{
synchronized(obj)。
由于C中没有任何时间间隔,所以A就同时占有了两把锁,这个时候线程B 没机会执行run方法中的else语句,因为它一直在等待obj锁的释放。线程A接着执行,打出sun is:Thread-0i:180。 执行完后线程A要释放锁object,this。这个时候返回到while(true) sun();处。其实我的理解这个时候A,B都有机会执行相应的代码块,但是根据程序打印的结果,接着A线程会继续执行,这样就重复上面的代码,至于什么时候结束,就是上面提到的临界区,产生死锁了,程序就死在那里了。这样看来你的代码其实是产生了死锁,只是时间比较慢。我上面该的代码就是让他死得更块点。
呵呵,纯属个人见解,希望对你有帮助。另外,可以给你点意见,多加些 log,这样对你分析程序有帮助。
[解决办法]
测试每次都死锁, 肯定要循环一些啊. 这是正常的。
另外,发代码时,框上面有一些图标,其中一个是"代码",从中选"java",把代码帖在“\[code=java\]把代码帖在这[/code]"中间。