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

此三种状态都有可能出现

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值