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---死锁的主要内容,如果未能解决你的问题,请参考以下文章