用java写出死锁的例子_Java产生死锁的一个简单例子

本文转载自https://www.cnblogs.com/mudao/p/5867107.html

感谢作者

对我很有帮助

思路是创建两个字符串a和b,再创建两个线程A和B,让每个线程都用synchronized锁住字符串(A先锁a,再去锁b;B先锁b,再锁a),如果A锁住a,B锁住b,A就没办法锁住b,B也没办法锁住a,这时就陷入了死锁。直接贴代码:

public class DeadLock {

public static String obj1 = "obj1";

public static String obj2 = "obj2";

public static void main(String[] args){

Thread a = new Thread(new Lock1());

Thread b = new Thread(new Lock2());

a.start();

b.start();

}

}

class Lock1 implements Runnable{

@Override

public void run(){

try{

System.out.println("Lock1 running");

while(true){

synchronized(DeadLock.obj1){

System.out.println("Lock1 lock obj1");

Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2

synchronized(DeadLock.obj2){

System.out.println("Lock1 lock obj2");

}

}

}

}catch(Exception e){

e.printStackTrace();

}

}

}

class Lock2 implements Runnable{

@Override

public void run(){

try{

System.out.println("Lock2 running");

while(true){

synchronized(DeadLock.obj2){

System.out.println("Lock2 lock obj2");

Thread.sleep(3000);

synchronized(DeadLock.obj1){

System.out.println("Lock2 lock obj1");

}

}

}

}catch(Exception e){

e.printStackTrace();

}

}

}

运行的结果如图所示:

0fb2f074e610bb6f12496324cf20389e.png

可以看到,Lock1获取obj1,Lock2获取obj2,但是它们都没有办法再获取另外一个obj,因为它们都在等待对方先释放锁,这时就是死锁。

如果我们只运行Lock1呢?修改一下main函数,把线程b注释掉。

public class DeadLock {

public static String obj1 = "obj1";

public static String obj2 = "obj2";

public static void main(String[] args){

Thread a = new Thread(new Lock1());

//Thread b = new Thread(new Lock2());

a.start();

//b.start();

}

}

class Lock1 implements Runnable{

@Override

public void run(){

try{

System.out.println("Lock1 running");

while(true){

synchronized(DeadLock.obj1){

System.out.println("Lock1 lock obj1");

Thread.sleep(3000);

synchronized(DeadLock.obj2){

System.out.println("Lock1 lock obj2");

}

}

}

}catch(Exception e){

e.printStackTrace();

}

}

}

class Lock2 implements Runnable{

@Override

public void run(){

try{

System.out.println("Lock2 running");

while(true){

synchronized(DeadLock.obj2){

System.out.println("Lock2 lock obj2");

Thread.sleep(3000);

synchronized(DeadLock.obj1){

System.out.println("Lock2 lock obj1");

}

}

}

}catch(Exception e){

e.printStackTrace();

}

}

}

运行结果为:

352dd532b46bfdb731d72ca752ab3619.png

由于没有其它线程和Lock1争夺obj1和obj2,Lock1可以不断地循环获取并释放它们,这时没有死锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值