Java多线程与并发(三)之死锁

死锁

过多的同步有可能出现死锁, 死锁的操作一般是在程序运行的时候才有可能出现。这就好比两个人相向开车堵了, 但是谁也不让谁,会一直堵下去。程序中也一样,如果发生了死锁,程序并不会报错,而是卡在那不动了。
多线程中要进行资源的共享, 就需要同步, 但同步过多,就可能造成死锁

程序中出现死锁的一般原因就是在当前的同步方法中调用了其它对象的同步方法, 在我们编程时要注意避免这样写
死锁的发生的是不确定性的!

这里写图片描述
我简单的写了一个发生死锁的例子帮助理解(实际编程中切记不可):
描述: 这是一个服务员和顾客的故事, 服务员可能会说先付钱再吃饭, 但顾客也可能会说先吃饭再付钱, 如果两者同时说就会”僵持”起来也就是发生了死锁.

package com.lulu;

public class DeadThreadDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Thread(new DeadThread()).start();
    }

}

// 服务员
class Customer {
    // 顾客对服务员说
    public synchronized void say(Waiter w) {
        System.out.println("顾客说: 先吃饭再买单");
        w.doService();
    }

    public synchronized void doService() {
        System.out.println("顾客说: 好吧, 我同意了, 那就先付钱");
    }
}

// 服务员
class Waiter {
    // 服务员对顾客说
    public synchronized void say(Customer c) {
        System.out.println("服务员说: 先买单再吃饭");
        c.doService();
    }

    public synchronized void doService() {
        System.out.println("服务员说: 好吧, 我同意了, 那就先付吃饭");
    }
}

// 死锁线程
class DeadThread implements Runnable {
    Customer c = new Customer();
    Waiter w = new Waiter();

    public DeadThread() {
        // TODO Auto-generated constructor stub
        new Thread(this) {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                super.run();
                c.say(w);

            }
        }.start();
    }

    @Override
    public void run() {
        w.say(c);
    }
}

代码运行结果是不确定的,如果发生了死锁两个人都在僵持着,程序就会卡住不动了, 也可能两个顺利都通过了.
这里写图片描述
图中运行结果就发生了死锁!

未完待续….

以上纯属个人见解, 如有不足之处希望有高人指出, 定感激不尽, 如有喜欢交流学习经验请给我留言谢谢.

原创文章, 转载请注明出处

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值