zoukankan      html  css  js  c++  java
  • Java学习-死锁练习

    3个同步对象a, b, c
    3个线程 t1,t2,t3
    故意设计场景,使这3个线程彼此死锁

     1 package multiplethread;
     2 
     3 import charactor.Hero;
     4 
     5 public class Test5 {
     6     public static void main(String[] args) {
     7           Hero a=new Hero("a");
     8           Hero b=new Hero("b");
     9           Hero c=new Hero("c");
    10           Thread t1=new Thread(){
    11               public void run(){
    12                   synchronized (a) {
    13                     System.out.println("t1已经占有a");
    14                     try {
    15                         Thread.sleep(1000);
    16                     } catch (InterruptedException e) {
    17                         // TODO Auto-generated catch block
    18                         e.printStackTrace();
    19                     }
    20                     System.out.println("t1试图占有b");
    21                     synchronized (b) {
    22                         System.out.println("占有成功");
    23                     }
    24                 }
    25               }
    26           };
    27           t1.start();
    28           Thread t2=new Thread(){
    29               public void run(){
    30                   synchronized (b) {
    31                     System.out.println("t2已经占有b");
    32                     try {
    33                         Thread.sleep(1000);
    34                     } catch (InterruptedException e) {
    35                         // TODO Auto-generated catch block
    36                         e.printStackTrace();
    37                     }
    38                     System.out.println("t2试图占有c");
    39                     synchronized (c) {
    40                         System.out.println("占有成功");
    41                     }
    42                 }
    43               }
    44           };
    45           t2.start();
    46           Thread t3=new Thread(){
    47               public void run(){
    48                   synchronized (c) {
    49                     System.out.println("t3已经占有c");
    50                     try {
    51                         Thread.sleep(1000);
    52                     } catch (InterruptedException e) {
    53                         // TODO Auto-generated catch block
    54                         e.printStackTrace();
    55                     }
    56                     System.out.println("t3试图占有a");
    57                     synchronized (a) {
    58                         System.out.println("占有成功");
    59                     }
    60                 }
    61               }
    62           };
    63           t3.start();
    64     }
    65 }

    效果图:

    使用Lock方式的死锁测试

    令线程t1,t2分别占有lock1,lock2对象,二者再试图占有对方的对象

     1 package multiplethread;
     2 
     3 import java.util.concurrent.TimeUnit;
     4 import java.util.concurrent.locks.Condition;
     5 import java.util.concurrent.locks.Lock;
     6 import java.util.concurrent.locks.ReentrantLock;
     7 
     8 public class Test {
     9 
    10     public static void main(String[] args) {
    11         Lock lock1 = new ReentrantLock();
    12         Lock lock2 = new ReentrantLock();
    13         // lock1 lock2对象互相尝试占有对方
    14         Thread t1 = new Thread() {
    15             boolean locked1 = false;// 开始时lock1未被占有
    16             boolean locked1_2 = false;
    17             public void run() {
    18                 try {
    19                     locked1 = lock1.tryLock(1, TimeUnit.SECONDS);
    20                     if (locked1) {
    21                         System.out.println(this.getName() + "成功占有lock1");
    22                         System.out.println("试图再占有lock2");
    23                         try {
    24                             locked1_2 = lock2.tryLock();
    25                             if (locked1_2)
    26                                 System.out.println(this.getName() + "成功占有lock2");
    27                             else
    28                                 System.out.println(this.getName() + "占有失败");
    29                         } finally {
    30                             if (locked1_2) {
    31                                 System.out.println(this.getName() + "释放对象lock2");
    32                                 lock2.unlock();
    33                             }
    34                         }
    35                     } else
    36                         System.out.println(this.getName() + "放弃了占有lock1");
    37                 } catch (InterruptedException e) {
    38                     // TODO Auto-generated catch block
    39                     e.printStackTrace();
    40                 } finally {
    41                     if (locked1) {
    42                         System.out.println(this.getName() + "释放对象lock1");
    43                         lock1.unlock();
    44                     }
    45                 }
    46             }
    47         };
    48         t1.setName("t1");
    49         t1.start();
    50         Thread t2 = new Thread() {
    51             boolean locked2 = false;// 开始时lock2未被占有
    52             boolean locked2_1 = false;
    53             public void run() {
    54                 try {
    55                     locked2 = lock2.tryLock(1, TimeUnit.SECONDS);
    56                     if (locked2) {
    57                         System.out.println(this.getName() + "成功占有lock2");
    58                         System.out.println("试图再占有lock1");
    59                         try {
    60                             locked2_1 = lock1.tryLock();
    61                             if (locked2_1)
    62                                 System.out.println(this.getName() + "成功占有lock1");
    63                             else
    64                                 System.out.println(this.getName() + "占有失败");
    65                         } finally {
    66                             if (locked2_1) {
    67                                 System.out.println(this.getName() + "释放对象lock1");
    68                                 lock1.unlock();
    69                             }
    70                         }
    71                     } else
    72                         System.out.println(this.getName() + "放弃了占有lock1");
    73                 } catch (InterruptedException e) {
    74                     // TODO Auto-generated catch block
    75                     e.printStackTrace();
    76                 } finally {
    77                     if (locked2) {
    78                         System.out.println(this.getName() + "释放对象lock2");
    79                         lock2.unlock();
    80                     }
    81                 }
    82             }
    83         };
    84         t2.setName("t2");
    85         t2.start();
    86 
    87     }
    88 }

    效果图:

     并且运行顺利结束,没有死循环出现,说明Lock的trylock方式成功避免了死锁。

  • 相关阅读:
    数据结构课后
    idea 使用java 链接sqlservice 2008
    超链接 a href 提交表单通过post方式
    课程主页之课程接口
    课程主页之课程表数据
    课程表分析
    课程前端简单页面
    前台的登录注册
    ORM常用字段及参数与查询 -刘
    Celery配置与使用
  • 原文地址:https://www.cnblogs.com/gilgamesh-hjb/p/12236044.html
Copyright © 2011-2022 走看看