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();
}
} 展开
{
//定义标签,控制不同的线程执行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();
}
} 展开
展开全部
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) {
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询