【好程序员训练营】-Java多线程与并发(三)之死锁

 android培训——我的java笔记,期待与您交流!

死锁

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

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

【好程序员训练营】-Java多线程与并发(三)之死锁_第1张图片
我简单的写了一个发生死锁的例子帮助理解(实际编程中切记不可):
描述: 这是一个服务员和顾客的故事, 服务员可能会说先付钱再吃饭, 但顾客也可能会说先吃饭再付钱, 如果两者同时说就会”僵持”起来也就是发生了死锁.

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);
    }
}

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

未完待续….

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

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

你可能感兴趣的:(java,多线程,并发)