1、死锁问题:两个或两个以上的线程,在执行的过程中出现互相等待的情况,就叫做死锁!
例如:有这样一个场景:一个中国人和一个美国人一起吃饭,美国人拿了中国人的筷子,而中国人拿了美国人的刀子和叉子,两个人开始争执;
中国人:你把我的筷子给我我就给你刀叉
美国人:你把我的刀叉给我我就给你筷子
....................................
结果很明显,两个人都吃不到饭!
接下来用代码来模拟死锁的问题:
思路:1)使用事项Runnable接口的方法来实现多线程
2)创建两个锁对象
3) 定义布尔型变量
4)定义有参构造方法
5)重写run()方法
6)创建线程对象
7)启动线程
package DieLock_problem;
class DieLock implements Runnable {
// 创建两个所对象
static final Object Chinese = new Object();
static final Object American = new Object();
// 定义布尔类型的flag变量
private boolean flag;
// 定义有参的构造方法
DieLock(boolean flag) {
this.flag = flag;
}
// 重写run()方法
@Override
public void run() {
if (flag) {
while (true) {
synchronized (Chinese) {// Chinese锁对象上的同步代码块
System.out.println(Thread.currentThread().getName() + "if chinese");
synchronized (American) {// American所对象上的同步代码块
System.out.println(Thread.currentThread().getName() + "else American");
}
}
}
} else {
while (true) {
synchronized (American) {// American所对象上的同步代码块
System.out.println(Thread.currentThread().getName() + "else American");
synchronized (Chinese) {// Chinese锁对象上的同步代码块
System.out.println(Thread.currentThread().getName() + "if chinese");
}
}
}
}
}
static // 测试类
public class test {
public static void main(String[] args) {
// 创建两个DieLock对象
DieLock d1 = new DieLock(true);
DieLock d2 = new DieLock(false);
// 启动线程
new Thread(d1).start();
new Thread(d2).start();
}
/*Thread-1else American
Thread-0if chinese
或者:
Thread-0if chinese
Thread-1else American
理想状态:
Thread-1else American
Thread-0if chinese
Thread-0if chinese
Thread-1else American
此三种状态都有可能出现
*/
}}