JAVA线程死锁问题:希望写一个死锁程序,但是发现可以正常运行,求助大神解释

classLockDemoimplementsRunnable{//定义标签,控制不同的线程执行run方法中不同区域的代码booleanflag=true;//flag一... class LockDemo implements Runnable
{
//定义标签,控制不同的线程执行run方法中不同区域的代码
boolean flag=true;//flag一般用于控制代码的执行区域,不同值,执行不同的区域
//复写run方法
//创建两个Object对象,以便于提供锁
Object o1=new Object();
Object o2=new Object();
public void run()
{
if (flag)
{
//线程1的执行代码
while(true)
{
synchronized(o1)
{
//持有o1锁后先睡500毫秒
try
{
Thread.sleep(500);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
//睡醒了,持续执行,接着获取o2的锁
synchronized(o2)
{
System.out.println("醒了。");
}
}

}
else
{
//线程2的执行代码
//首先获取o2的锁
while(true)
{
synchronized(o2)
{
//获取锁后,睡500毫秒
try{Thread.sleep(500);}catch(InterruptedException e){e.printStackTrace();}
}
//睡醒了,继续运行获取o1的锁
synchronized(o1)
{
System.out.println("我也睡醒了。");
}
}

}
}

}
class DeadLockTest
{
public static void main(String[] args)
{
//创建LockDemo对象
LockDemo ld=new LockDemo();
//创建并启动两个线程
new Thread(ld).start();
//主线程应该睡会儿,主线程睡了,第一个线程就开始执行
try
{
Thread.sleep(10);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
//改变flag的值
ld.flag=false;
new Thread(ld).start();
}
}
展开
 我来答
B2K1bonPplR
2016-07-30 · TA获得超过2049个赞
知道小有建树答主
回答量:1156
采纳率:72%
帮助的人:392万
展开全部

flag 为 true 时,线程1 synchronized(o1) 睡 500ms 就把 o1 的锁释放了,线程2 只需要等 500ms 就可以获得 o1 的锁了。同理,线程2 synchronized(o2) 睡 500ms 就把 o2 的锁释放了,线程1 只需要等 500ms 就可以获得 o2 的锁了。

要造成死锁,需要线程1 在占有 o1 锁的时候再去占有 o2 锁,线程2 在占有 o2 锁的时候再去占有 o2 锁。

线程1:

synchronized(o1) {

  synchronized(o2) {
    
  }
}

线程2:

synchronized(o2) {

  synchronized(o1) {
    
  }
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式