一个死锁的例子及线程打印

/**
 * 卓二妹
 */
public class Deadlock {
    private static  Long lock1 = 0L;
    private static Long lock2 = 1L;

    private static Runnable runnable1 = new Runnable(){
        @Override
        public void run() {
            synchronized (lock1){
                System.out.println("get lock1 and wait for lock2");
                try {
                    Thread.sleep(1000);
                } catch (Exception e){
                    e.printStackTrace();
                }
                synchronized (lock2){
                    System.out.println("get lock1 and lock2");
                }
            }
        }
    };

    private static Runnable runnable2 = new Runnable(){
        @Override
        public void run() {
            synchronized (lock2){
                System.out.println("get lock2 and wait for lock1");
                try {
                    Thread.sleep(1000);
                } catch (Exception e){
                    e.printStackTrace();
                }
                synchronized (lock1){
                    System.out.println("get lock2 and lock1");
                }
            }
        }
    };

    public static void main(String[] args){
        Thread thread1 = new Thread(runnable1);
        Thread thread2 = new Thread(runnable2);
        thread1.start();
        thread2.start();

    }

}

上面打印的结果输出

get lock1 and wait for lock2
get lock2 and wait for lock1

然后进程就一直卡在这里了,这里发生了明显的死锁,下面是线程的信息:

Zhuos-MacBook-Pro-2:TestThreadPool jo$ jstack -l 2439
。。。。。

"Thread-1" #12 prio=5 os_prio=31 tid=0x00007f8f2e81d800 nid=0x5803 waiting for monitor entry [0x000070000ed45000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at Deadlock$2.run(Deadlock.java:33)
        - waiting to lock <0x000000076ada59a0> (a java.lang.Long)
        - locked <0x000000076ada59b8> (a java.lang.Long)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - None

"Thread-0" #11 prio=5 os_prio=31 tid=0x00007f8f2f003800 nid=0x5603 waiting for monitor entry [0x000070000ec42000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at Deadlock$1.run(Deadlock.java:16)
        - waiting to lock <0x000000076ada59b8> (a java.lang.Long)
        - locked <0x000000076ada59a0> (a java.lang.Long)
        at java.lang.Thread.run(Thread.java:745)

。。。。。。。。。。。。。
Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x00007f8f2c8224a8 (object 0x000000076ada59a0, a java.lang.Long),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x00007f8f2c81fab8 (object 0x000000076ada59b8, a java.lang.Long),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at Deadlock$2.run(Deadlock.java:33)
        - waiting to lock <0x000000076ada59a0> (a java.lang.Long)
        - locked <0x000000076ada59b8> (a java.lang.Long)
        at java.lang.Thread.run(Thread.java:745)
"Thread-0":
        at Deadlock$1.run(Deadlock.java:16)
        - waiting to lock <0x000000076ada59b8> (a java.lang.Long)
        - locked <0x000000076ada59a0> (a java.lang.Long)
        at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

Zhuos-MacBook-Pro-2:TestThreadPool jo$ 

可以清晰的看到
thread-1再等对象0x000000076ada59a0的锁,锁住了0x000000076ada59b8,线程状态为阻塞,进入阻塞队列。
thread-0在等对象0x000000076ada59b8的锁,锁住了0x000000076ada59a0,线程状态为阻塞,进入阻塞队列。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值