死锁:
——————————————————————————————————————————————————————————
代码/*
/** @ author Jokers @ version V 14.7.15 这是一个演示死锁的小练习。 */ class Deadlock implements Runnable { private boolean flag; Deadlock(boolean flag) { this.flag= flag; } public void run() { if(flag) { synchronized(Mylock.locka) { System.out.println("if...locka.."); synchronized(Mylock.lockb) { System.out.println("if...lockb.."); } } } else { synchronized(Mylock.lockb) { System.out.println("else...lockb.."); synchronized(Mylock.locka) { System.out.println("else...locka.."); } } } } } class Mylock { static Object locka= new Object(); static Object lockb= new Object(); } class DeadlockTest { public static void main(String[] args) { Deadlock lock_1=new Deadlock(true); Deadlock lock_2=new Deadlock(false); Thread t1= new Thread(lock_1); Thread t2= new Thread(lock_2); t1.start(); t2.start(); } }
代码完*/
————————————————————————————————————————————————————————
这是一个用判断语句写的死锁嵌套小程序。
尤其可以简单的解释死锁产生的原因,死锁主要产生在同步嵌套中。简言之:
同步中嵌套同步,但锁不同。
上面的代码可以看出,两条线程开启了两段运行代码。但使用的锁却不是同一个,即(locka,lockb)。
由于线程运行时间的随机性,导致当t1线程执行到synchronized(Mylock.locka){}时,
可能被CPU挂起,而此时t2线程开始执行并执行到synchronize(Mylock.lockb){},
这时t2线程就取得了lockb锁,而当t1线程开始恢复运行时,
执行到synchronize(Mylock.lockb){},就需要取得lockb锁,但此锁此时却在t2线程手中,而同理,当t2线程需要执行下面的语句,而锁却在t1手中,
自此就出现里两条线程都需要对方手中的锁,但却不释放自己的锁,导致两条线程出现死锁情况。
关于死锁的解决:
在网上能找到很多种解决方式,按照目前的知识量发现值得参考的是其中一种:
保证每条线程有序的拿到锁
但尚未详解具体实现方式。