synchronized死锁问题

synchronized死锁问题

死锁产生: 线程A持有资源r1的锁,等待获取资源r2;线程B持有资源r2的锁,等待获取资源r1;线程A不愿意放弃资源r1的锁,而线程B也不愿意放弃资源r2的锁

调试用例:

public class DeadSynThread implements Runnable {

    private byte[] lock1 = new byte[0];
    private byte[] lock2 = new byte[0];

    @Override
    public void run() {

        if (Thread.currentThread().getName().equals("a")){
            synchronized (lock1){
                System.out.println(Thread.currentThread().getName()+ "获取lock1的锁,等待lock2...");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2){
                    System.out.println(Thread.currentThread().getName()+"执行lock1---> lock2");
                }
            }


        }else {
            synchronized (lock2){
                System.out.println(Thread.currentThread().getName()+ "获取lock2的锁,等待lock1...");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println(Thread.currentThread().getName()+"执行lock2---> lock1");
                }
            }

        }
    }

    public static void main(String[] args) {
        DeadSynThread deadSynThread = new DeadSynThread();
        Thread t1 = new Thread(deadSynThread);
        t1.setName("a");
        t1.start();

        Thread t2 = new Thread(deadSynThread);
        t2.setName("b");
        t2.start();
    }

}

结果:

b获取lock2的锁,等待lock1...
a获取lock1的锁,等待lock2...

使用jps查看正在执行的线程:

C:\Users\bingo>jps
11280 DeadSynThread
15504 RemoteMavenServer
10788
6388 Launcher
6360 Jps

使用jstack查看具体情况:

C:\Users\bingo>jstack 11280
2018-03-31 23:12:28
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode):

"DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x0000000005032800 nid=0x2614 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"b" #12 prio=5 os_prio=0 tid=0x000000001aeb9000 nid=0x42ac waiting for monitor entry [0x000000001bb9f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.sjing.yjyuan.ch2.synchronize.DeadSynThread.run(DeadSynThread.java:37)
        - waiting to lock <0x00000000d7d90358> (a [B)
        - locked <0x00000000d7d90368> (a [B)
        at java.lang.Thread.run(Thread.java:745)

"a" #11 prio=5 os_prio=0 tid=0x000000001aeb6000 nid=0x3260 waiting for monitor entry [0x000000001ba9e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.sjing.yjyuan.ch2.synchronize.DeadSynThread.run(DeadSynThread.java:23)
        - waiting to lock <0x00000000d7d90368> (a [B)
        - locked <0x00000000d7d90358> (a [B)
        at java.lang.Thread.run(Thread.java:745)

....

Found one Java-level deadlock:
=============================
"b":
  waiting to lock monitor 0x0000000019910628 (object 0x00000000d7d90358, a [B),
  which is held by "a"
"a":
  waiting to lock monitor 0x000000001990dc38 (object 0x00000000d7d90368, a [B),
  which is held by "b"

Java stack information for the threads listed above:
===================================================
"b":
        at com.sjing.yjyuan.ch2.synchronize.DeadSynThread.run(DeadSynThread.java:37)
        - waiting to lock <0x00000000d7d90358> (a [B)
        - locked <0x00000000d7d90368> (a [B)
        at java.lang.Thread.run(Thread.java:745)
"a":
        at com.sjing.yjyuan.ch2.synchronize.DeadSynThread.run(DeadSynThread.java:23)
        - waiting to lock <0x00000000d7d90368> (a [B)
        - locked <0x00000000d7d90358> (a [B)
        at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

可以看到线程a和线程都是阻塞状态BLOCKED,死锁产生

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值