死锁

【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)  --去除死锁状态
总结:只要不满足死锁的任一条件,可避免死锁。




     

原文地址:https://www.cnblogs.com/licaibin666/p/8636828.html