死锁代码例子:
- class A{
- public synchronized void test_A(B b){
- System.out.println("线程:"+Thread.currentThread().getName()+"调用了A类的 test_A方法");
- b.last_B();
- }
-
- public synchronized void last_A(){
- System.out.println("线程:"+Thread.currentThread().getName()+"调用了A类的 last_A方法");
- }
- }
- class B{
- public synchronized void test_B(A a){
- System.out.println("线程:"+Thread.currentThread().getName()+"调用了A类的 test_A方法");
- a.last_A();
- }
- public synchronized void last_B(){
- System.out.println("线程:"+Thread.currentThread().getName()+"调用了B类的 last_B方法");
- }
- }
- class DeadLock implements Runnable
- {
- A a=new A();
- B b=new B();
-
- public void input(){
- System.out.println("线程:"+Thread.currentThread().getName()+"主线程运行");
- a.test_A(b);
- }
- public void run(){
- b.test_B(a);
- }
复制代码
上面A和B类的方法都是同步方法,也就是A,B对象都是同步锁。程序中两个线程执行,主线程执行了DeadLock对象的input方法,另一个线程执行DeadLock的run方法。假设主线程运行后,其中input方法中调用了b对象的test_A方法,进入test_A方法后,在调用该方法中的a.last_A(),该线程对A对象加锁。假设此时另一个线程抢到了cpu执行权,在此时切换到另一个线程运行了,子线程开始运行run方法,run方法中调用了b对象的test_B()方法,进入test_B()后,在执行方法a.last_A()前子线程会对B 对象加锁。如果此时主线程再次获得执行权,想执行b.last_B()时,但是子线程正保存着对B对象的加锁,所以主线程开始进入阻塞。而子线程想要运行a.last_A()时,而主线程正保存着对A对象的加锁,两个线程相互等待着对方释放锁,所以就出现了死锁。
|