首页 > 编程知识 正文

java锁面试,举例说明什么是死锁

时间:2023-05-04 20:50:09 阅读:157273 作者:1369

一.什么是死锁?

二、死锁原因。

三、产生死锁的四个必要条件。

四.解决死锁的方法。

什么是死锁死锁是指多个进程在运行过程中争夺资源导致的僵局,当进程处于这种僵持状态时,没有外力就无法前进。

因此,举例说明一下,线程a持有锁a,线程b持有锁b; 另一方面,在a等待取得密钥b,b等待取得a,此时,密钥a的密钥b被a、b占有。 下图:

http://www.Sina.com/http://www.Sina.com /

竞争资源

系统中的资源可以分为以下两类:

1、可剥夺资源是指某个进程获得此类资源后,该资源被其他进程或系统剥夺,CPU和主存均为可剥夺资源;

2、另一类资源是不可剥夺的资源,系统将此类资源分配给某个进程后,不能强制回收,只能在进程使用后自行释放。 例如,磁带机、打印机等。

发生死锁的竞争资源之一意味着竞争无法夺取资源。 例如,系统中只有一台打印机,进程P1可以使用。 假设P1占用打印机,如果P2继续请求打印机打印,则会被阻止。)

发生死锁的竞争资源另一个是竞争临时资源,通常如果消息的通信顺序不合适就会发生死锁

进程之间的推进顺序不正确

如果P1拥有资源R1,而P2拥有资源R2,则系统不安全,因为两个进程的进一步前进可能会导致死锁

例如,如果运行到p1:request(r2 ),R2将因被P2占用而被阻止。 p2 :运行到request (r1 )的情况下,由于R1被P1占用而被屏蔽,会发生进程死锁

死锁产生的四个先决条件1、互斥条件:进程必须独占控制分配的资源。 这意味着在一段时间内只使用一个资源。

2、请求和保留条件:进程被请求资源阻止时,不放置获得的资源。

3、不剥夺条件:过程获得的资源在未使用前不得剥夺。 只能在使用结束时自己释放。

4、环路等待条件:出现死锁时,必然存在流程-资源环状链。

http://www.Sina.com/http://www.Sina.com /

(1)、资源批量分配:一次性分配所有资源,避免再有请求。 ((破坏要求条件) )。

)2)、如果存在任何一个无法分配的资源,则不对该进程分配其他资源。 ((破坏请维持条件) )。

(3)、可以剥夺资源),即某一进程获得了部分资源但得不到其他资源时,释放已经占有的资源(破坏不可剥夺条件) )。

) 4、资源有序分配法)系统按资源种类给出编号,各进程按照编号从多到少的顺序请求资源,释放则相反(环路破坏等待条件)。

)5)按照规定的顺序获得锁定

如果需要获取多个锁,则设计时必须充分考虑在不同线程之前获取锁的顺序。

)6)放弃超时

使用synchronized关键字提供的内置锁时,除非线程获得锁,否则将永远等待,但Lock接口将始终等待布尔型锁定(long time,timeunit ) throws intints

产生死锁的原因

1、一些预防死锁的方案会严重损害系统性能。 因此,要避免死锁,必须施加较弱的限制以提高系统性能。 因为避免死锁的策略允许进程动态地请求资源。 因此,系统在进行资源分配之前会事先计算资源分配的安全性。 如果此次分配不会导致系统不安全,请将资源分配给进程。 否则,过程会等待。 其中最具代表性的死锁避免算法是银行家算法。

2、银行家算法:首先需要定义状态和安全状态的概念。 系统状态是当前分配给进程的资源的状态。 因此,状态包括两个向量Resource "系统内各资源的总和"、可用"未分配给进程的各资源的总和"、两个矩阵Claim "进程的资源要求"和分配安全状态意味着至少有一个资源分配序列不会发生死锁。 当进程请求一组资源时,假设您同意该请求并更改了系统状态,然后确定结果是否仍然处于安全状态。 是的,如果是,我同意这个要求; 不,我知道阻止进程,同意请求后系统的状态仍然是安全的。

可分为如下两点:

1、首先为每个进程和每个资源分配唯一的编号;

2、然后编制资源分配表和流程等待表。

解决死锁的基本方法

预防死锁:

1、资源剥夺:从其他进程中剥夺足够数量的资源用于死锁进程,以消除死锁状态

态;
2、撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。

死锁检测:

1、Jstack命令

jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息。 Jstack工具可以用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。

2、JConsole工具

        Jconsole是JDK自带的监控工具,在JDK/故意的冥王星目录下可以找到。它用于连接正在运行的本地或者远程的JVM,对运行在Java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。而且本身占用的服务器内存很小,甚至可以说几乎不消耗。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。