java通过synchronized关键字包装代码块、方法或通过Lock、ReadWriteLock锁的机制来实现多线程并发同步操作,但是使用不当,会造成死锁!
下面写一个案例
先定义两个执行实体类
public class First {
public synchronized void foo(Second second){
System.out.println("当前线程名:" + Thread.currentThread().getName() + "进入了First实例的foo方法");
try {
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("当前线程名:" + Thread.currentThread().getName() + " 企图调用Second实例的last方法");
second.last();
}
public synchronized void last(){
System.out.println("进入了First实例的last方法内部");
}
}
public class Second{
public synchronized void bar(First first) {
System.out.println("当前线程名:" + Thread.currentThread().getName()
+ "进入了Second实例的bar方法");
try {
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("当前线程名:" + Thread.currentThread().getName()
+ "企图调用First实例的last方法");
first.last();
}
public synchronized void last() {
System.out.println("进入了Second类的last内部");
}
}
编写启动调用类
public class DeadLock implements Runnable {
First first = new First();
Second second = new Second();
public void init(){
Thread.currentThread().setName("主线程");
first.foo(second);
System.out.println("进入了主线程之后");
}
public void run() {
Thread.currentThread().setName("副线程");
second.bar(first);
System.out.println("进入副线程之后");
}
public static void main(String[] args){
DeadLock lock = new DeadLock();
new Thread(lock).start();
lock.init();
}
}
然后运行DeadLock的main方法,实现效果如下:
线程执行到画线部分戛然而止,而且虚拟机永不停止(图中画方框处),此时就造成了死锁,程序不停止,也不报错,所有线程都想被阻塞!
如下图解实现过程
心得:在多线程调用中,合理利用synchronized,和Lock,合理使用wait() 和 notify()、notifyAll()来进行线程间的通信协作。避免造成死锁!