美文网首页
线程死锁及解决方案

线程死锁及解决方案

作者: 泽林呗 | 来源:发表于2019-03-15 17:11 被阅读0次

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

学过操作系统的朋友都知道:产生死锁的条件有四个:
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关键字,是共享资源,会造成死锁
解决死锁的办法,只要破坏上面的其中一条就可以了

相关文章

  • 线程死锁及解决方案

    发生死锁的原因一般是两个对象的锁相互等待造成的。 学过操作系统的朋友都知道:产生死锁的条件有四个:1.互斥条件:所...

  • 防止死锁的加锁机制

    防止死锁的加锁机制 问题 你正在写一个多线程程序,其中线程需要一次获取多个锁,此时如何避免死锁问题。 解决方案 在...

  • java死锁介绍、源码实现及预防(含源码)

    java死锁介绍、源码实现及预防(含源码) 什么是死锁 死锁是 多个线程 之间 相互之间 持有 对方需要的资源,同...

  • JavaEE面试题总结 Day39 2018-12-29

    什么是线程死锁?死锁如何产生?如何避免线程死锁? 死锁的介绍: 线程死锁是指由于两个或者多个线程互相持有对方所需要...

  • jstack命令:教你如何排查多线程问题

    这是之前的一个死锁案例: 一个多线程死锁案例,如何避免及解决死锁问题? 如程序中发生这样的死锁问题该如何排查呢?我...

  • Python中的各种锁

    Python之死锁 死锁分为两种情况,多进程/线程的死锁.或者是单线程的死锁. 1.首先看一下单线程的死锁,单线程...

  • 中级09 - Java多线程初步

    中级09 - Java多线程初步 介绍多线程带来的问题,以及基本解决方案。 竞争条件带来的数据错误问题 死锁的原...

  • 5. 死锁

    线程死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • 6. 使用synchronized实现死锁

    死锁定义 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

网友评论

      本文标题:线程死锁及解决方案

      本文链接:https://www.haomeiwen.com/subject/qnjrmqtx.html