资讯专栏INFORMATION COLUMN

浅谈Java中锁的问题

fox_soyoung / 1059人阅读

摘要:之前我们简单的讨论了一下关于中的同步还有一些锁优化的问题,今天我们就来简单的聊一聊关于中的死锁问题。这里显示两个线程的状态现在是处于阻塞状态,然后都在等待锁的获取,我们再继续往下看。

之前我们简单的讨论了一下关于Java中的同步还有一些锁优化的问题,今天我们就来简单的聊一聊关于Java中的死锁问题。

这个问题我们在开发的时候,或多或少都能遇到,对业务逻辑没有正确的梳理,又或者是在多线程的情况下,对程序的执行顺序有理解上的偏差等等,但是这种问题有时候执行代码是看不出来的,那我们今天就看一看如何使用简单的命令来查看死锁。

首先我们得写一段有问题的程序,当然前提条件是先要明确什么是死锁,这个问题在网上找有很多的资料,在这里我们就不重复叙述了,先来看一下代码

class Lock extends Thread{

    private String lock1;
    
    private String lock2;
    
    Lock(String s1, String s2){
        this.lock1 = s1;
        this.lock2 = s2;
    }
    
    @Override
    public void run() {
        synchronized (lock1) {
            System.out.println(Thread.currentThread().getName() + " get " + lock1);
            try {
                Thread.sleep(1 * 1000);
                synchronized (lock2) {
                    System.out.println(Thread.currentThread().getName() + " get -- " + lock2);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    
}

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(new Lock(LOCK_1, LOCK_2));
        Thread thread2 = new Thread(new Lock(LOCK_2, LOCK_1));
        
        thread1.start();
        thread2.start();
        
        thread1.join();
        thread2.join();
    }

在这里我们用synchronized来嵌套两层,然后赋予两个线程两个交互的锁,那么这段代码在大部分情况下会发生死锁,但是我们的程序执行下来没有报错,那这个该如何查看呢?JDK为我们提供了一些工具,我们来看一下,首先用jps这个命令查看当前的PID,这个就和ps命令差不多。

然后我们再用jstack来查看具体的栈信息,例如:jstack 9520,会打印很多的信息,我们看几个比较重要的。

这里显示两个线程的状态现在是处于阻塞状态,然后都在等待锁的获取,我们再继续往下看。

这里很明确的指出线程3在等待一个锁获取,但是这个锁被线程1持有,反过来也是一样,线程1也在等待一个锁获取,但是这个锁又被线程3持有,那么这里就产生了一个死锁。

JDK的这些命令行工具能很好的帮助我们分析程序中的一些问题,但是我们在日常的开发工作中,该如何规避这些问题呢,其实我的建议只有一点,首先要明确理论,有了一定的理论做基础,然后就是不断的实践采坑,这样才能明白某些问题的点在哪里。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76759.html

相关文章

  • 浅谈Java锁的实现和优化

    摘要:这两种策略的区别就在于,公平策略会让等待时间长的线程优先执行,非公平策略则是等待时间长的线程不一定会执行,存在一个抢占资源的问题。 之前有一篇文章我们简单的谈到了Java中同步的问题,但是可能在平常的开发中,有些理论甚至是某些方式是用不到的,但是从程序的角度看,这些理论思想我们可以运用到我们的开发中,比如是不是应该一谈到同步问题,就应该想到用synchronized?,什么时候应该用R...

    DevWiki 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    BicycleWarrior 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    tommego 评论0 收藏0

发表评论

0条评论

fox_soyoung

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<