Java语言-61:死锁问题

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

此三种状态都有可能出现

*/

}


}


猜你喜欢

转载自blog.csdn.net/qq_41833394/article/details/80501345