死锁示例
public class LockTest { public static void main(String[] args) { Object resource1 = new Object(); Object resource2 = new Object(); new Thread(() -> { synchronized (resource1){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("已获取资源1,准备获取资源2"); synchronized (resource2){ System.out.println("成功获取资源2"); } } }, "线程1").start(); new Thread(() -> { synchronized (resource2){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("已获取资源2,准备获取资源1"); synchronized (resource1){ System.out.println("成功获取资源1"); } } }, "线程2").start(); } }
如何预防死锁? 破坏死锁的产生的必要条件即可:
如何避免死锁?
避免死锁就是在资源分配时,借助于算法(比如银行家算法)对资源分配进行计算评估,使其进入安全状态。
安全状态 指的是系统能够按照某种进程推进顺序(P1、P2、P3.....Pn)来为每个进程分配所需资源,直到满足每个进程对资源的最大需求,使每个进程都可顺利完成。称<P1、P2、P3.....Pn>序列为安全序列。
参考:
https://javaguide.cn/java/concurrent/java-concurrent-questions-01/#认识线程死锁