死锁条件(缺一不可):
持有等待资源互斥不可剥夺链式循环
网上对这四条详解的例子很多,不多赘述
使用Java的Synchronized记录一个死锁例子;基本思想:定义两个静态对象,然后再main方法启动两个线程,分别持有一个对象去调用另一个对象(链式调用);
Synchronized可修饰类、对象、变量,此例子修饰对象,在当前线程调用该对象未结束时不能被其他线程调用
public class LockDead { static Object LockA = new Object(); static Object LockB = new Object(); public static void main(String[] args) { Thread a = new Thread(() -> { synchronized (LockA) { System.out.println(Thread.currentThread().getName() + "t" + "持有对象A试图获取对象B"); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (LockB) { System.out.println(Thread.currentThread().getName() + "t" + "获取对象B成功"); } } }, "a"); a.start(); new Thread(() -> { synchronized (LockB) { System.out.println(Thread.currentThread().getName() + "t" + "持有对象B试图获取对象A"); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (LockA) { System.out.println(Thread.currentThread().getName() + "t" + "获取对象A成功"); } } }, "b").start(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)