一、死锁:所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都无法向前推进。
二、如何避免死锁
1、加锁顺序(线程按照一定的顺序加锁)---------本例就是采用这种方法
2、加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁),例如本例中的线程,占了一个锁又再请求另一个锁。
package thread;
/**
* 避免死锁
* 获取锁的顺序
* 核心所在:t1.join();
* 把t1.join() 去掉就是demo01的死锁了
*
* Created by sxf on 2018/6/27.
*/
public class DeadLockDemo02 {
private int flag = 1;
private static Object o1 = new Object();
private static Object o2 = new Object();
public static void main(String[] args) {
final Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
money(1);
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
t1.join(); //*核心所在****************************************************
} catch (InterruptedException e) {
e.printStackTrace();
}
money(0);
}
});
t2.start();
}
public static void money(int flag) {
System.out.println("flag:" + flag);
if (flag == 1) {
synchronized(o1) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("1进来的");
}
}
}
if (flag == 0) {
synchronized(o2) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0进来的");
}
}
}
}
}
运行结果:
flag:1
1进来的
flag:0
0进来的