java死锁是什么?遇到java死锁怎么办?

阳光 2022-02-18 21:15:37 java常见问答 5269

在进行java项目开发的时候,遇见java死锁是很正常的事情,有经验的开发员能够很快的解决java死锁问题,但是新手恐怕连java死锁的含义都不清楚,那下面来我们就来给大家讲解一下java死锁是什么?

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

遇到java死锁怎么办?

其实我们只要破坏产生死锁的四个条件中的其中一个就可以了。

1.破坏互斥条件

这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问);

2.破坏请求与保持条件

一次性申请所有的资源。

3.破坏不剥夺条件

占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。

4.破坏循环等待条件

靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。

我们对线程 2 的代码修改成下面这样就不会产生死锁了。

new Thread(() - >
    {
        synchronized(resource1)
        {
            System.out.println(Thread.currentThread() + "get resource1");
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread() + "waiting get resource2");
            synchronized(resource2)
            {
                System.out.println(Thread.currentThread() + "get resource2");
            }
        }
    }, "线程 2")
    .start();

Output

Thread[线程 1,5,main]get resource1
Thread[线程 1,5,main]waiting get resource2
Thread[线程 1,5,main]get resource2
Thread[线程 2,5,main]get resource1
Thread[线程 2,5,main]waiting get resource2
Thread[线程 2,5,main]get resource2
Process finished with exit code 0

我们分析一下上面的代码为什么避免了死锁的发生?

线程 1 首先获得到 resource1 的监视器锁,这时候线程 2 就获取不到了。然后线程 1 再去获取 resource2 的监视器锁,可以获取到。然后线程 1 释放了对 resource1、resource2 的监视器锁的占用,线程 2 获取到就可以执行了。这样就破坏了破坏循环等待条件,因此避免了死锁。

总之产生java死锁就是以上四个条件,只要这四个条件不是同时产生的,就可以避免死锁了哦!最后大家如果想要了解更多java常见问答知识,敬请关注奇Q工具网。

推荐阅读:

java初级是不是就做增删改查?Java只会增删改查怎么办?

JSF框架有哪些应用程序?JSF框架有什么优势?

Java服务器http怎么写?Java写服务器http代码