死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:
-- 互斥条件:一个资源每次只能被一个进程使用。
-- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
-- 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
-- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。
如何避免死锁在Java中?是这是本赛季的多线程的味道的问题之一,要求更多的在高层,并有大量的后续问题。即使问题看起来很简单,但大多数开发商会被卡住,一旦你开始要深。
面试的问题开头“什么是死锁?”
答案很简单,当两个或多个线程都在等待对方释放锁卡住了无限的时间,情况称为死锁。它只会发生在多任务情况下。
你如何检测死锁在Java中?
虽然这可以有很多答案,我的版本是第一个我会看的代码,如果我看到嵌套同步块或从其他调用一个synchronized方法或尝试不同的对象上得到锁定,则有死锁的好机会,如果开发商是不是很小心。
另一种方法是找到它时,你实际上得到锁定,同时运行的应用程序,尽量采取线程转储,在Linux下,你可以通过命令来完成这一“杀-3”,这将在应用程序日志文件和打印所有线程的状态可以看到哪个线程锁定哪个对象上。
另一种方法是使用JConsole的,它会告诉你究竟哪些线程被锁定,并在其上的对象。
写Java程序,这将导致僵局?
一旦你回答这个问题,他们可能会问你写的代码,这将导致僵局?
这里是我的一个版本
如果方法1()和方法2()都将通过两个或多个线程中调用,有僵局的好机会,因为如果线程1所获取锁定在执行字符串对象方法1()和线程同时执行2所获取锁Integer对象的方法2 ()都将等待对方释放对Integer和String锁进行进一步将永远不会发生。
此图正是展示我们的节目,其中一个线程持有锁定一个物体上,并等待其被其他线程持有的其他对象的锁。
如何避免死锁在Java中?
现在面试官说到最后一部分,在我看来,最重要的一个;你如何解决僵局?或如何避免死锁在Java中?
如果你已经看过上面的代码小心,你可能已经想通了,对僵局的真正原因是不是多线程,但他们正在请求锁的方式,如果你提供一个有序的访问,则问题将得到解决,这是我的固定版本,避免通过避免与不抢占循环等待死锁。
现在就不会有任何的僵局,因为这两种方法都在访问锁整数和字符串类在同一顺序的文字。所以,如果线程A获得Integer对象上的锁,线程B将不会继续进行,直到线程A释放整数锁,同样线程A将不即使线程B持有串锁,因为现在线程B也不会想到线程A释放整数受阻锁定进一步进行。