死锁实例java
进程A等待进程B发来的消息,进程B等待进程C发来的消息,而进程C又等待进程A发来的消息。消息未到,A,B,C三个进程均没法向前推动,也会发生进程通讯上的死锁this
死锁:spa
死锁是指多个线程循环等待其余线程占有的资源而无限期等待下去的状况,没有外力的状况下是涉及到死锁的各个线程将 一直处于死锁状态线程
产生死锁的必要条件:code
1>.互斥条件:某个资源在一段时间内只能由一个进程占有,不能被两个或以上进程占有进程
2>.不可抢占:资源的申请者不能强行的从资源的占有者手中夺取资源,只能由资源的占有者自动释放资源
3>.占有申请条件:进程已经占有一个资源,可是又申请新的资源,因为该资源已经被进程占有,此时该进程阻塞,可是他在等待新进程以前仍然占有该资源get
4>.循环等待 4.死锁示例:class
class Test implements Runnable { private boolean flag; Test(boolean flag) { this.flag = flag; } public void run() { if(flag) { while(true) { synchronized(MyLock.locka) { System.out.println(Thread.currentThread().getName()+"...if locka "); synchronized(MyLock.lockb) { System.out.println(Thread.currentThread().getName()+"..if lockb"); } } } } else //多个正在执行的线程 { while(true) { synchronized(MyLock.lockb) { System.out.println(Thread.currentThread().getName()+"..else lockb"); synchronized(MyLock.locka) { System.out.println(Thread.currentThread().getName()+".....else locka"); } } } } } } class MyLock { static Object locka = new Object(); static Object lockb = new Object(); } class DeadLockTest { public static void main(String[] args) { Thread t1 = new Thread(new Test(true)); Thread t2 = new Thread(new Test(false)); t1.start(); t2.start(); } }
5.死锁解决方法:循环
上锁的顺序必须一致。具体来讲,咱们人为地给锁指定一种相似“水位”的方向性属性。不管已持有任何锁,该执行绪全部的上锁操做,必须按照一致的前后顺序从低到高(或从高到低)进行,且在一个系统中,只容许使用一种前后次序