你不知道什么是死锁?

当两个线程相互等待对象释放同步监视器时就会发生死锁,一旦出现死锁,整个程序既不会发生任何异常,也不会给任何提示,只是所有线程处于阻塞状态,无法继续,代码如下:

package com.eduask.java.thread.deadlock;

class A

{

public synchronized void foo( B b )

{

System.out.println("当前线程名: " + Thread.currentThread().getName()

+ " 进入了A实例的foo()方法" );    // ①

try

{

Thread.sleep(200);

}

catch (InterruptedException ex)

{

ex.printStackTrace();

}

System.out.println("当前线程名: " + Thread.currentThread().getName()

+ " 企图调用B实例的last()方法");    // ③

b.last();

}

public synchronized void last()

{

System.out.println("进入了A类的last()方法内部");

}

}

class B

{

public synchronized void bar( A a )

{

System.out.println("当前线程名: " + Thread.currentThread().getName()

+ " 进入了B实例的bar()方法" );  // ②

try

{

Thread.sleep(200);

}

catch (InterruptedException ex)

{

ex.printStackTrace();

}

System.out.println("当前线程名: " + Thread.currentThread().getName()

+ " 企图调用A实例的last()方法");  // ④

a.last();

}

public synchronized void last()

{

System.out.println("进入了B类的last()方法内部");

}

}

public class DeadLock implements Runnable

{

A a = new A();

B b = new B();

public void init()

{

Thread.currentThread().setName("主线程");

// 调用a对象的foo方法

a.foo(b);

System.out.println("进入了主线程之后");

}

public void run()

{

Thread.currentThread().setName("副线程");

// 调用b对象的bar方法

b.bar(a);

System.out.println("进入了副线程之后");

}

public static void main(String[] args)

{

DeadLock dl = new DeadLock();

// 以dl为target启动新线程

new Thread(dl).start();

// 调用init()方法

dl.init();

}

}


运行结果如下:


你不知道什么是死锁?_第1张图片

你可能感兴趣的:(你不知道什么是死锁?)