并发之死锁

并发之死锁:一个同步块同时拥有两个以上对象的锁就有可能发生死锁;
 *     因为都在等待着对方释放资源而停止执行。
 * 模拟:大丫有镜子,小丫有口红,大丫想要小丫的口红,
 *   小丫想要大丫的镜子,互不退让。
//口红
class Lipstick{

}
//镜子
class Mirror{

}
//化妆
class Markup implements Runnable{
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();
    int chioce;//选择
    String name;

    public Markup(int chioce, String name) {
        this.chioce = chioce;
        this.name = name;
    }

    @Override
    public void run() {
        markup();
    }
    public void markup(){
        if(chioce == 0){
            synchronized (lipstick){
                System.out.println(this.name+"涂口红");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (mirror){
                    System.out.println(this.name+"照镜子");
                }
            }
        }else {
            synchronized (mirror){
                System.out.println(this.name+"照镜子");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lipstick){
                    System.out.println(this.name+"涂口红");
                }
            }
        }
    }
}

调用:

Markup g1 = new Markup(0,"小华");
        Markup g2 = new Markup(1,"小花");
        new Thread(g1).start();
        new Thread(g2).start();

执行:

小华涂口红
小花照镜子

双方都等着对方,都占着对方要的东西(锁),都不释放。修改代码

 public void markup(){
        if(chioce == 0){
            synchronized (lipstick){
                System.out.println(this.name+"涂口红");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
//                synchronized (mirror){//放这里会造成死锁
//                    System.out.println(this.name+"照镜子");
//                }
            }
            synchronized (mirror){//放这里  解决死锁
                System.out.println(this.name+"照镜子");
            }
        }else {
            synchronized (mirror){
                System.out.println(this.name+"照镜子");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
//                synchronized (lipstick){
//                    System.out.println(this.name+"涂口红");
//                }
            }
            synchronized (lipstick){
                System.out.println(this.name+"涂口红");
            }
        }
    }

执行:

小华涂口红
小花照镜子
小花涂口红
小华照镜子

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值