死锁是指两个或多个以上的进程在执行过程中,因争夺资源而造成一种互相等待的现象,若无外力干涉那他们都将无法推进下去,如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
系统资源不足
进程运行推进的顺序不对
资源分配不当
互斥
解决方法:把互斥的共享资源封装成可同时访问
占有且等待
解决方法:进程请求资源时,要求它不占有任何其它资源,也就是它必须一次性申请到所有的资源,这种方式会导致资源效率低。
非抢占式
解决方法:如果进程不能立即分配资源,要求它不占有任何其他资源,也就是只能够同时获得所有需要资源时,才执行分配操作
循环等待
解决方法:对资源进行排序,要求进程按顺序请求资源。
public class DeadLock { public static void main(String[] args) { Resource666 res1 = new Resource666(); Resource666 res2 = new Resource666(); res1.flag = true; res2.flag = false; new Thread(new Runnable() { @Override public void run() { res1.method(); } }, "A").start(); new Thread(new Runnable() { @Override public void run() { res2.method(); } },"B").start(); } } class Resource666 { boolean flag = true; private static final Object obj1 = new Object(); private static final Object obj2 = new Object(); public void method() { if (flag) { synchronized (obj1) { System.out.println(Thread.currentThread().getName() + " " + "获取到锁1"); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (obj2) { System.out.println(Thread.currentThread().getName() + " " + "获取到锁2"); } } } else { synchronized (obj2) { System.out.println(Thread.currentThread().getName() + " " + "获取到锁2"); synchronized (obj1) { System.out.println(Thread.currentThread().getName() + " " + "获取到锁1"); } } } } } 复制代码
jstack 5116 # 后面参数是 jps输出的该类的pid 复制代码
得到的结果