欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

死锁编码及定位分析

程序员文章站 2022-04-17 22:38:29
...
import java.util.concurrent.TimeUnit;

class HoldLockThread implements  Runnable {
    private String lockA;
    private String lockB;

    public HoldLockThread(String lockA, String lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }

    @Override
    public void run() {
        synchronized (lockA) {
            System.out.println(Thread.currentThread().getName() + "\t 自己持有"+lockA+"\t 尝试获得"+lockB);
            try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}
            synchronized (lockB) {
                System.out.println(Thread.currentThread().getName() + "\t 自己持有"+lockB+"\t 尝试获得"+lockA);
            }
        }
    }
}
/**
 * @author zcl
 * @date 2021/9/7 15:00
 */
public class DeadLockDemo {
    public static void main(String[] args) {
        String  lockA="lockA";
        String  lockB="lockB";
        new Thread(new HoldLockThread(lockA,lockB),"ThreadAAA").start();
        new Thread(new HoldLockThread(lockB,lockA),"ThreadBBB").start();
        /**
         * windows下的 jps=ps ef...
         */

    }
}

打印

ThreadAAA	 自己持有lockA	 尝试获得lockB
ThreadBBB	 自己持有lockB	 尝试获得lockA

jps -l查找线程号
jstack 25092

Java stack information for the threads listed above:
===================================================
"ThreadBBB":
        at HoldLockThread.run(DeadLockDemo.java:18)
        - waiting to lock <0x0000000715d93608> (a java.lang.String)
        - locked <0x0000000715d93640> (a java.lang.String)
        at java.lang.Thread.run(Thread.java:748)
"ThreadAAA":
        at HoldLockThread.run(DeadLockDemo.java:18)
        - waiting to lock <0x0000000715d93640> (a java.lang.String)
        - locked <0x0000000715d93608> (a java.lang.String)
        at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.