Java基础——死锁

1.关于死锁,百度百科的解释:

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,他们将都无法进行下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程成为死锁进程。

2.关于死锁,我个人的理解:

经过一段时间的学习,我理解的死锁概念就是,比如有两段进程,每一个进程中都被两把锁(锁1、锁2),锁着。不同的是,在两段进程中,锁的应用位置不同。从而产生了,一个进程的完整启动,内部需要一把锁,而这把锁又恰巧在另一个进程那里。另一个进程想要完整启动(或执行)内部所需要的那把锁又在另一个程序里。这样互相牵绊着,都处于准备状态却无法向下执行。造成了死锁状态。我根据理解画了示意图:

 《Java基础——死锁》

3.关于死锁的一段简单代码:

public class Test15 {
    public static void main(String[] args) throws InterruptedException {
        new Thread(new DeadLockThread(true)).start();
        //Thread.sleep(10);在中间用上它可以使结果交替出现,我是为了看死锁的效果,用它对比一下。
        new Thread(new DeadLockThread(false)).start();
    }
}

class DeadLockThread implements Runnable {
    static Object o1 = new Object();
    static Object o2 = new Object();
    private boolean flag;

    DeadLockThread(boolean flag) {
        this.flag = flag;
    }

    public void run() {
        if (flag == true) {
            while (true) {
                synchronized (o1) {
                    System.out.println("这是锁o1");
                    synchronized (o2) {
                        System.out.println("这是锁o2");
                    }

打印结果:

《Java基础——死锁》

4.补充: 关于死锁,我查找了一些资料,感觉这里的问题蛮复杂。现阶段仅了解这些简单原理。也能大致了解到死锁发生必须具备一定的四个条件。 1)互斥条件: 指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。 2)请求和保持条件: 指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。 3)不剥夺条件: 指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。 4)环路等待条件: 指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
附: 1)调用sleep()方法,并不会让线程释放它所持有的同步锁;而且在这期间它也不会阻碍其它线程的运行 2)调用wait()方法,当前运行的线程就会转入等待状态,等待别的线程再次调用这个对象的notify()或者notifyAll()方法唤醒它,或者到了指定的等待时间,线程自动醒来。 如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。 3)在实际开发中,死锁一般隐藏的较深,不容易被发现,一旦死锁现象发生,就必然会导致程序的瘫痪。因此必须避免它的发生。

    原文作者:江河湖泊
    原文地址: http://www.cnblogs.com/1693977889zz/p/7124567.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞