b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

java多线程死锁 Java多线程中的死锁

电脑杂谈  发布时间:2018-01-23 18:05:16  来源:网络整理

java里多个线程池_java死锁怎么解决_java多线程死锁

Java多线程中的死锁,最简单的例子就是,线程 T1 持有对象 O1 的锁,然后去申请对象 O2 的锁;而线程 T2 持有对象 O2 的锁,然后去申请对象 O1 的锁。默认的锁申请操作都是阻塞的,这样就造成了线程互相持有对方的锁,造成死锁。复杂一些的情况可能会出现多个线程死锁的环路。java多线程死锁

其根本原因是一个线程在持有一个锁 LOCK1 的时候,去申请另一个锁 LOCK2,即 LOCK1 没有释放,又去申请另一个锁 LOCK2,再加上锁申请是阻塞的,从而导致死锁。

简单的死锁例子:

java死锁怎么解决_java多线程死锁_java里多个线程池

public class Deadlock {

    private Object obj1 = new Object();
    private Object obj2 = new Object();

    public void method1() {
        try{
            synchronized (obj1) {
                Thread.sleep(2000);
                synchronized (obj2) {
                    System.out.println("method1 end");
                }
            }
        }catch(InterruptedException e){
            e.printStackTrace();
        }

    }

    public void method2() {
        try{
            synchronized (obj2) {
                Thread.sleep(2000);
                synchronized (obj1) {
                    System.out.println("method2 end");
                }
            }
        }catch(InterruptedException e){
            e.printStackTrace();
        }

    }
}

public class Thread1 extends Thread{

    private Deadlock lock;

    public Thread1(Deadlock lock){
        this.lock = lock;
    }

    @Override
    public void run() {
        lock.method1();
    }

}

public class Thread2 extends Thread{

    private Deadlock lock;

    public Thread2(Deadlock lock){
        this.lock = lock;
    }

    @Override
    public void run() {
        lock.method2();
    }

}

// 测试类
public class Test {

    public static void main(String[] args) {
        Deadlock lock = new Deadlock();
        Thread1 t1 = new Thread1(lock);
        Thread2 t2 = new Thread2(lock);
        t1.start();
        t2.start();
    }

}

可以看到对象 Deadlock 中两个方法,方法 method1 中,线程拿到 obj1 的对象锁后,申请 obj2 的对象锁;方法 method2 中,线程拿到 obj2 的对象锁后,申请 obj1 的对象锁。分别启动两个线程,执行这两个方法。java多线程死锁

运行结果看不到结果,因为发生了死锁。可以通过 jstack 来查看:

java多线程死锁_java里多个线程池_java死锁怎么解决

在 cmd 中输入 jps 命令,可以显示当前所有 java 进程 pid 的命令,然后找到运行主函数的 pid,通过 jstack pid 命令,即可获得该线程的信息,在其中可以看到死锁的信息:

死锁

互相申请对方线程持有的锁,就出现了 deadlock 。

避免死锁,最好避免在同步块中调用另一个对象的同步块,但是如果不能避免,那么就需要对这几个类进行研究,看方法是否会导致死锁的闭环,如果出现要想办法调整打破死锁的闭环。通过调整代码,或者 Lock 类的 tryLock 方法设置超时时限,或者使用 ThreadLocal 等减少对象的共享等方法解决死锁。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-62276-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...