java线程死锁实战

Java多线程死锁示例及诊断,
该Java程序展示了两个线程分别获取不同锁然后尝试获取对方锁导致的死锁情况。线程1先锁定lock1,然后尝试lock2;线程2则相反,先锁定lock2再尝试lock1。通过`jps`和`jstack`命令,检测到一个Java级别的死锁,线程2等待lock1,而线程1等待lock2。

(1),

public class TestCls {
    private static Object lock1 = new Object();
    private static Object lock2 = new Object();

    public static void main(String[] args) throws Exception {

        Thread th1 = new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        synchronized (lock1 ) {
                            System.out.println("线程1锁住了成员静态变量lock1,阻塞线程3秒");
                            try {
                                Thread.sleep(3000);
                            } catch (Exception ex1) {
                                ex1.printStackTrace();
                            }
                            synchronized (lock2) {
                                System.out.println("线程1锁住了成员静态变量lock2");
                            }
                        }

                    }
                }, "线程1"
        );
        th1.start();

        Thread th2 = new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        try {
                            synchronized (lock2){
                                System.out.println("线程2锁住了lock2,阻塞当前线程3秒");
                                Thread.sleep(3000);

                                synchronized (lock1) {
                                    System.out.println("线程2锁住了lock1");
                                }
                            }

                        } catch (Exception ex1){
                            ex1.printStackTrace();
                        }
                    }
                }, "线程2"
        );
        th2.start();

    }

}

(2),在cmd命令窗口

在cmd 中 jps -l 主类全名,进程号
jstack -l 进程号, 线程快照
如下
Found one java - level deadLock
线程2 waitting to lock monitor 0x00000583 (object 0x0000
线程1 waitting to lock monitor 0x00000583 (object 0x0000

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值