黑马程序员技术交流社区

标题: 过多的同步容易造成死锁 [打印本页]

作者: 為了夢想    时间: 2015-7-25 14:08
标题: 过多的同步容易造成死锁
在多线程中,同一份资源在多个线程中都用了,可能会死锁,因为大家都不释放,举个例子:

  1. public class Lockup {

  2.         public static void main(String[] args) {
  3.                
  4.                 Object m = new Object();
  5.                 Object g = new Object();
  6.                
  7.                 Test t1 = new Test(g,m);
  8.                 Test2 t2 = new Test2(g,m);
  9.                
  10.                 Thread th1 = new Thread(t1);
  11.                 Thread th2 = new Thread(t2);
  12.                
  13.                 th1.start();
  14.                 th2.start();
  15.                
  16.         }
  17.        
  18. }

  19. class Test implements Runnable{

  20.         Object goods ;
  21.         Object money ;
  22.        
  23.        
  24.        
  25.         public Test(Object goods, Object money) {
  26.                 super();
  27.                 this.goods = goods;
  28.                 this.money = money;
  29.         }

  30.         @Override
  31.         public void run() {
  32.                
  33.                 while(true){
  34.                         test();
  35.                 }
  36.                
  37.         }
  38.        
  39.         public void test(){
  40.                 synchronized(goods){
  41.                         try {
  42.                                 Thread.sleep(500);
  43.                         } catch (InterruptedException e) {
  44.                                 e.printStackTrace();
  45.                         }
  46.                         synchronized(money){
  47.                                
  48.                         }
  49.                 }
  50.                 System.out.println("一手给钱");
  51.         }
  52.        
  53. }

  54. class Test2 implements Runnable{

  55.         Object goods ;
  56.         Object money ;
  57.        
  58.        
  59.        
  60.         public Test2(Object goods, Object money) {
  61.                 super();
  62.                 this.goods = goods;
  63.                 this.money = money;
  64.         }

  65.         @Override
  66.         public void run() {
  67.                
  68.                 while(true){
  69.                         test();
  70.                 }
  71.                
  72.         }
  73.        
  74.         public void test(){
  75.                 synchronized(money){
  76.                         try {
  77.                                 Thread.sleep(500);
  78.                         } catch (InterruptedException e) {
  79.                                 e.printStackTrace();
  80.                         }
  81.                         synchronized(goods){
  82.                                
  83.                         }
  84.                 }
  85.                 System.out.println("一手给货");
  86.         }
  87.        
  88. }
复制代码









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2