【1】Java 中的死锁
1 public static void main(String[] arg) { 2 3 DeathLock deathLock = new DeathLock(); 4 ThreadA threadA = new ThreadA(deathLock); 5 threadA.start(); 6 ThreadB threadB = new ThreadB(deathLock); 7 threadB.start(); 8 } 9 10 11 static class ThreadA extends Thread { 12 13 private DeathLock deathLock; 14 15 public ThreadA(DeathLock deathLock) { 16 this.deathLock = deathLock; 17 } 18 19 @Override 20 public void run() { 21 try { 22 deathLock.read(); 23 } catch (InterruptedException e) { 24 e.printStackTrace(); 25 } 26 } 27 } 28 29 static class ThreadB extends Thread { 30 private DeathLock deathLock; 31 32 public ThreadB(DeathLock deathLock) { 33 this.deathLock = deathLock; 34 } 35 36 @Override 37 public void run() { 38 try { 39 deathLock.write(); 40 } catch (InterruptedException e) { 41 e.printStackTrace(); 42 } 43 } 44 } 45 46 static class DeathLock { 47 private Object obj1 = new Object(); 48 private Object obj2 = new Object(); 49 50 public void read() throws InterruptedException { 51 synchronized (obj1) { 52 Thread.sleep(5000);; 53 synchronized (obj2) { 54 System.out.println("complete read"); 55 } 56 } 57 } 58 59 public void write() throws InterruptedException { 60 synchronized (obj2) { 61 Thread.sleep(5000); 62 synchronized (obj1) { 63 System.out.println("complete write"); 64 } 65 } 66 } 67 }
结果截图:
jps查看相关信息
结论:由于对资源的相互等待,你等待我的释放,我等待你的释放,最终形成了一个循环闭环。
【2】数据库中的死锁表现
事务A:
1 begin tran A 2 3 update [Student] set Age=10 where Id=1 4 5 waitfor delay '00:00:05' 6 7 update [Student] set Age=12 where Id=2 8 9 commit tran A
事务B:
1 begin tran B 2 3 update [Student] set Age=13 where Id=2 4 5 waitfor delay '00:00:05' 6 7 update [Student] set Age=11 where Id=1 8 9 commit tran B
结论:可能会造成数据表的【锁死】,后续的查询陷入无止境的转圈状态,查看表死锁的信息:
SELECT request_session_id spid , OBJECT_NAME(resource_associated_entity_id) [Student] FROM sys.dm_tran_locks WHERE resource_type = 'OBJECT'
kill 51(spid) --去除死锁状态
总结:只要不满足死锁的任一条件,可避免死锁。