Sychronized学习之死锁

package com.ilucky.test.jdk.util.concurrent;

/**
 * 死锁
 * 如下这段代码会引起死锁,两个线程会互相等待对方释放锁。
 * 一般发生的原因是: 某个线程拿到锁后, 因为一些异常没有释放锁。
 * 避免死锁的方法:
 * 避免一个线程同时获取多个锁。
 * 避免一个线程同时占用多个资源。
 * 尝试使用定时锁,使用tryLock(timeout)来替代内部锁机制。
 * @author IluckySi
 *
 */
public class SynchronizeTest {

    public static String A = "a";
    public static String B = "b";

    public static void main(String[] args) {
        new SynchrnizedTest1T1().start();
        new SynchrnizedTest1T2().start();
    }
}

class SynchrnizedTest1T1 extends Thread {

    public void run() {
        try {
            System.out.println("--->" + Thread.currentThread().getName());
            synchronized(SynchronizeTest.A) {
                System.out.println("SynchrnizedTest1T1 A");
                Thread.sleep(1000);
                synchronized(SynchronizeTest.B) {
                    System.out.println("SynchrnizedTest1T1 B");
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class SynchrnizedTest1T2 extends Thread {

    public void run() {
        try {
            System.out.println("--->" + Thread.currentThread().getName());
            synchronized(SynchronizeTest.B) {
                System.out.println("SynchrnizedTest1T2 A");
                Thread.sleep(1000);
                synchronized(SynchronizeTest.A) {
                    System.out.println("SynchrnizedTest1T2 B");
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

/**
查看dump线程信息:
C:\Users\IluckySi>jstack 11572
2017-05-21 18:15:58
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode):

"DestroyJavaVM" prio=6 tid=0x00000000004bd800 nid=0x248c waiting on condition [0
x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Thread-1" prio=6 tid=0x000000000b092800 nid=0x16b8 waiting for monitor entry [0
x000000000bc8f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.ilucky.test.jdk.util.concurrent.SynchrnizedTest1T2.run(Synchroniz
eTest.java:52)
        - waiting to lock <0x00000000e0a16968> (a java.lang.String)
        - locked <0x00000000e0a16998> (a java.lang.String)

"Thread-0" prio=6 tid=0x000000000b08f000 nid=0x2df0 waiting for monitor entry [0
x000000000bb0f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.ilucky.test.jdk.util.concurrent.SynchrnizedTest1T1.run(Synchroniz
eTest.java:34)
        - waiting to lock <0x00000000e0a16998> (a java.lang.String)
        - locked <0x00000000e0a16968> (a java.lang.String)

"Service Thread" daemon prio=6 tid=0x000000000b074800 nid=0x1c4c runnable [0x000
0000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x000000000b072000 nid=0x25d8 waiting on
 condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x0000000009a0f800 nid=0x232c waiting on
 condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x0000000009a0a000 nid=0x2598 waiting on co
ndition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x0000000009a05000 nid=0x2004 runnable [0
x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x000000000999a000 nid=0x2c38 in Object.wait() [0x
000000000abff000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000e0904858> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
        - locked <0x00000000e0904858> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" daemon prio=10 tid=0x0000000009993000 nid=0x2b80 in Object.w
ait() [0x000000000a8ef000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000000e0904470> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:503)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
        - locked <0x00000000e0904470> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x000000000998d800 nid=0x2298 runnable

"GC task thread#0 (ParallelGC)" prio=6 tid=0x000000000235c800 nid=0xe0c runnable


"GC task thread#1 (ParallelGC)" prio=6 tid=0x000000000235e000 nid=0x2274 runnabl
e

"GC task thread#2 (ParallelGC)" prio=6 tid=0x000000000235f800 nid=0x23fc runnabl
e

"GC task thread#3 (ParallelGC)" prio=6 tid=0x0000000002361800 nid=0x1b2c runnabl
e

"VM Periodic Task Thread" prio=10 tid=0x000000000b085800 nid=0x1b6c waiting on c
ondition

JNI global references: 121


Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x0000000009999a68 (object 0x00000000e0a16968, a java.
lang.String),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x0000000009998728 (object 0x00000000e0a16998, a java.
lang.String),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at com.ilucky.test.jdk.util.concurrent.SynchrnizedTest1T2.run(Synchroniz
eTest.java:52)
        - waiting to lock <0x00000000e0a16968> (a java.lang.String)
        - locked <0x00000000e0a16998> (a java.lang.String)
"Thread-0":
        at com.ilucky.test.jdk.util.concurrent.SynchrnizedTest1T1.run(Synchroniz
eTest.java:34)
        - waiting to lock <0x00000000e0a16998> (a java.lang.String)
        - locked <0x00000000e0a16968> (a java.lang.String)

Found 1 deadlock.


C:\Users\IluckySi>
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值