线程死锁及解决方案

发生死锁的原因一般是两个对象的锁相互等待造成的。

学过操作系统的朋友都知道:产生死锁的条件有四个:
1.互斥条件:所谓互斥就是进程在某一时间内独占资源。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

所以,简单来说,就是一个线程持有一个锁,另一个线程持有另一个锁。两个线程同时申请获取对方的锁,导致相互都阻塞在那里,谁也不愿意释放锁,导致死锁。

public class TryDieSock implements Runnable {
    private int flag = 1;
    static Object obj1 = new Object(), obj2 = new Object();
    @Override
    public void run() {
        if (flag == 1) {
            synchronized (obj1) {
                System.out.println("锁定了obj1,过0.5秒后去锁定obj2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj2) {
                    System.out.println("1");
                }
            }
        }
        if (flag == 0) {
            synchronized (obj2) {
                System.out.println("锁定了obj2,过0.5秒后去锁定obj1");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj1) {
                    System.out.println(0);
                }
            }
        }
    }

    public static void main(String[] args) {
        TryDieSock try1 = new TryDieSock();
        TryDieSock try2 = new TryDieSock();
        try1.flag = 1;
        try2.flag = 0;
        Thread thread1 = new Thread(try1);
        Thread thread2 = new Thread(try2);
        thread1.start();
        thread2.start();
    }
}

因为object1和object2加上了static关键字,是共享资源,会造成死锁
解决死锁的办法,只要破坏上面的其中一条就可以了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文首发于我的个人博客:尾尾部落 本文是我刷了几十篇一线互联网校招java后端开发岗位的面经后总结的多线程相关题目...
    繁著阅读 2,027评论 0 7
  • 在之前的课程中,我们已经学习了进程相关的知识。进程是计算机程序被执行的一个实例(instance),一个进程可能由...
    夏威夷的芒果阅读 927评论 0 2
  • 1、竞态条件: 定义:竞态条件指的是一种特殊的情况,在这种情况下各个执行单元以一种没有逻辑的顺序执行动作,从而导致...
    Hughman阅读 1,326评论 0 7
  • 在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制。Java提供了多种多线程锁机制的实现方...
    千淘萬漉阅读 6,963评论 1 33
  • 操作系统概论 操作系统的概念 操作系统是指控制和管理计算机的软硬件资源,并合理的组织调度计算机的工作和资源的分配,...
    野狗子嗷嗷嗷阅读 12,045评论 3 34