资讯专栏INFORMATION COLUMN

【多线程编程核心技术】多线程的死锁

tabalt / 3518人阅读

摘要:使用工具监测死锁进入的安装目录中的目录,执行命令可以看出得到运行的线程的值为,再执行命令,查看结果

死锁

Java 线程是死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成

举个例子

DealThread.java

package dealThread.demo;

public class DealThread implements Runnable{
    public String username;
    public Object lock1 = new Object();
    public Object lock2 = new Object();
    
    public void setFlag(String username){
        this.username = username;
    }
    
    @Override
    public void run(){
        if(username.equals("a")){
            synchronized (lock1){
                try{
                    System.out.println("username="+username);
                    Thread.sleep(3000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                
                synchronized (lock2){
                    System.out.println("lock1 -> lock2");
                }
            }
        }
        
        if(username.equals("b")){
            synchronized (lock2){
                try{
                    System.out.println("username="+username);
                    Thread.sleep(3000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            
                synchronized (lock1){
                    System.out.println("lock2 -> lock1");
                }
            }
        }
    }
    
}

Run.java

package dealThread.demo;

public class Run {
    public static void main(String[] args){
        try{
            DealThread t1 = new DealThread();
            t1.setFlag("a");
            Thread thread1 = new Thread(t1);
            thread1.start();
            Thread.sleep(1000);
            
            t1.setFlag("b");
            Thread thread2 = new Thread(t1);
            thread2.start();
            
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

运行结果如下:

线程thread1和thread2都持有对方的锁,而且需要等待对方释放锁之后才能往下继续运行,这个时候就发生了死锁;其实不使用嵌套的synchronized代码结构也会出现死锁,与嵌套不嵌套没有任何关系,只要互相等待对方释放锁就有可能出现死锁。

使用JDK工具监测死锁

进入JDK的安装目录中的bin目录,执行jps命令:

可以看出得到运行的线程Run的id值为7404,再执行jstack命令,查看结果:

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

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

相关文章

  • 线程编程完全指南

    摘要:在这个范围广大的并发技术领域当中多线程编程可以说是基础和核心,大多数抽象并发问题的构思与解决都是基于多线程模型来进行的。一般来说,多线程程序会面临三类问题正确性问题效率问题死锁问题。 多线程编程或者说范围更大的并发编程是一种非常复杂且容易出错的编程方式,但是我们为什么还要冒着风险艰辛地学习各种多线程编程技术、解决各种并发问题呢? 因为并发是整个分布式集群的基础,通过分布式集群不仅可以大...

    mengera88 评论0 收藏0
  • Java线程学习(七)并发编程中一些问题

    摘要:因为多线程竞争锁时会引起上下文切换。减少线程的使用。举个例子如果说服务器的带宽只有,某个资源的下载速度是,系统启动个线程下载该资源并不会导致下载速度编程,所以在并发编程时,需要考虑这些资源的限制。 最近私下做一项目,一bug几日未解决,总惶恐。一日顿悟,bug不可怕,怕的是项目不存在bug,与其惧怕,何不与其刚正面。 系列文章传送门: Java多线程学习(一)Java多线程入门 Jav...

    yimo 评论0 收藏0
  • Java线程学习(七)并发编程中一些问题

    摘要:相比与其他操作系统包括其他类系统有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。因为多线程竞争锁时会引起上下文切换。减少线程的使用。很多编程语言中都有协程。所以如何避免死锁的产生,在我们使用并发编程时至关重要。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)syn...

    dingding199389 评论0 收藏0
  • (二)线程应用及挑战

    摘要:上下文切换会影响到线程的执行速度,对于系统来说意味着会消耗大量的时间减少上下文切换的方式无锁并发编程,在多线程竞争锁时,会导致大量的上下文切换。线程在中的使用在中实现多线程的方式比较简单,因为中提供了非常方便的来实现多线程。 文章简介 上一篇文章我们了解了进程和线程的发展历史、线程的生命周期、线程的优势和使用场景,这一篇,我们从Java层面更进一步了解线程的使用 内容导航 并发编程的...

    hqman 评论0 收藏0
  • 线程死锁就是这么简单

    摘要:此时线程需要锁才能继续往下执行。但是线程的锁并没有释放,线程的锁也没有释放。 前言 只有光头才能变强 回顾前面: ThreadLocal就是这么简单 多线程三分钟就可以入个门了! 多线程基础必要知识点!看了学习多线程事半功倍 Java锁机制了解一下 AQS简简单单过一遍 Lock锁子类了解一下 线程池你真不来了解一下吗? 本篇主要是讲解死锁,这是我在多线程的最后一篇了。主要将多线程...

    winterdawn 评论0 收藏0

发表评论

0条评论

tabalt

|高级讲师

TA的文章

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