* 死锁是指两个或者两个以上的进程在执行过程中,因抢夺资源而造成的一种互相等待的现象,
* 若无外力干涉它们将都无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,
* 死锁出现的可能性也就很低,否则就会因争夺有限的资源而陷入死锁。
代码演示:
1 import java.util.concurrent.TimeUnit; 2 3 class HoldLockThread implements Runnable{ 4 private String lockA; 5 private String lockB; 6 7 public HoldLockThread(String lockA,String lockB){ 8 this.lockA = lockA; 9 this.lockB = lockB; 10 } 11 12 public void run(){ 13 synchronized (lockA){ 14 System.out.println(Thread.currentThread().getName()+"\t自己持有:"+lockA+"\t尝试获得:"+lockB); 15 //暂停一下 16 try{ TimeUnit.SECONDS.sleep(2); }catch (InterruptedException e){e.printStackTrace();} 17 18 synchronized (lockB){ 19 System.out.println(Thread.currentThread().getName()+"\t自己持有:"+lockB+"\t尝试获得:"+lockA); 20 } 21 } 22 } 23 } 24 25 public class deadLock { 26 public static void main(String[] args){ 27 String lockA = "lockA"; 28 String lockB = "lockB"; 29 30 new Thread(new HoldLockThread(lockA,lockB),"ThreadAAA").start(); 31 new Thread(new HoldLockThread(lockB,lockA),"ThreadBBB").start(); 32 33 } 34 }
运行结果:
ThreadAAA 自己持有:lockA 尝试获得:lockB
ThreadBBB 自己持有:lockB 尝试获得:lockA
上面的运行会一直出于运行状态,因为两个线程各自持有自己的锁同时都想获取对方的锁,从而进入死锁状态
正常的运行结果,
ThreadAAA 自己持有:lockA 尝试获得:lockB
ThreadAAA 自己持有:lockB 尝试获得:lockA
ThreadBBB 自己持有:lockB 尝试获得:lockA
ThreadBBB 自己持有:lockA 尝试获得:lockB