码迷,mamicode.com
首页 > 编程语言 > 详细

JavaSE---死锁

时间:2019-02-16 11:56:04      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:bsp   deadlock   必须   就会   current   cep   run   没有   setname   

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---死锁

标签:bsp   deadlock   必须   就会   current   cep   run   没有   setname   

原文地址:https://www.cnblogs.com/anpeiyong/p/10387161.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!