JavaSE---死锁

Posted anpeiyong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE---死锁相关的知识,希望对你有一定的参考价值。

1、死锁:

    当2个线程互相等待对方释放  同步监视器  时就会发生死锁,JVM没有监测,也没有采取任何措施来避免死锁(当出现死锁时,整个程序既不会发生任何异常,也不会有任何提示,

      所有线程处于阻塞状态,无法继续);

package com.an.lock.deadlock;

public class A {

    public synchronized void aFoo(B b){
        System.out.println("当前线程:"+Thread.currentThread().getName());
        try {
            Thread.sleep(200);
        }catch (Exception e){
            e.printStackTrace();
        }
        b.last();
    }

    public synchronized void last(){
        System.out.println("执行A对象的last方法");
    }
}
package com.an.lock.deadlock;

public class B {

    public synchronized void bFoo(A a){
        System.out.println("当前线程:"+Thread.currentThread().getName());
        try {
            Thread.sleep(200);
        }catch (Exception e){
            e.printStackTrace();
        }
        a.last();
    }

    public synchronized void last(){
        System.out.println("执行B对象的last方法");
    }
}
package com.an.lock.deadlock;

public class Test implements Runnable{

    A a=new A();
    B b=new B();

    public void init(){
        Thread.currentThread().setName("主线程");
        a.aFoo(b);
    }

    public static void main(String[] args){
        Test test=new Test();
        new Thread(test).start();
        test.init();
    }

    @Override
    public void run() {
        Thread.currentThread().setName("副线程");
        b.bFoo(a);
    }
}

    简介:

      类A、类B中的方法均为同步方法;

        如果主线程先执行,调用a.aFoo(b),此时或得A对象的锁定,线程睡眠200ms;

        线程切换到副线程,调用b.bFoo(a),此时获得B对象锁定,线程睡眠200ms;

        线程重新切换到主线程的a.aFoo(b)中,执行b.last(),因为此方法为同步方法,必须先获得对B对象的锁定,但此时B对象已被锁定;

        如此导致死锁;

以上是关于JavaSE---死锁的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE基础(十 一 )--<线程>线程同步,死锁,Lock锁,线程通信,生产消费问题,新增的线程创建方式

sqlserver-处理死锁

javaSE第二十四天

javaSE_07_方法

JavaSE 方法的使用

Java并发编程实战 04死锁了怎么办?