• 死锁


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




         

  • 相关阅读:
    orioledb pg 存储引擎
    nginx ngx_http_addition_module 模块openresty content_by_lua 不能生效的原因
    Windows下Erlang和RabbitMQ下载安装教程
    [建议收藏]缓存雪崩的处理办法
    【精选】Mysql BTree和B+Tree的结构?
    RabbitMQ用户和virtual hosts的添加以及授权
    程序员增加收入的几种方法
    基于redis的keys、scan删除ttl为1的key
    全面了解Nginx主要应用场景
    很佩服的一个Google佬,离职了。。
  • 原文地址:https://www.cnblogs.com/licaibin666/p/8636828.html
Copyright © 2020-2023  润新知