黑马程序员技术交流社区

标题: 毕老师多线程LOCK锁中的问题 [打印本页]

作者: 支天歌    时间: 2014-1-9 14:39
标题: 毕老师多线程LOCK锁中的问题
照着视频敲了好几遍,翻来覆去的找还是没有找到问题所在,每次输出都是打印一两次就停止了。

代码如下:

  1. package 多线程;

  2. import java.util.concurrent.locks.*;

  3. class Resource
  4. {
  5.         private String name;
  6.         private int count = 1;
  7.         private boolean flag = false;
  8.        
  9.         //重点变化,使用Lock代替线程同步
  10.         private Lock lock = new ReentrantLock();
  11.         private Condition condition_pro = lock.newCondition();
  12.         private Condition condition_con = lock.newCondition();
  13.        
  14.         public synchronized void set(String name)throws InterruptedException
  15.         {
  16.                 lock.lock();
  17.                
  18.                 //全部唤醒,通过循环控制
  19.                 try
  20.                 {
  21.                 while(flag)
  22.                         condition_pro.await();
  23.                
  24.                 this.name = name+"--"+count++;
  25.                
  26.                 System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name);
  27.                 flag = true;
  28.                
  29.                 condition_con.signal();
  30.                 }
  31.                 finally
  32.                 {
  33.                         lock.unlock();

  34.                 }
  35.                
  36.         }
  37.        
  38.         public synchronized void out() throws InterruptedException
  39.         {
  40.                 lock.lock();
  41.                 //全部唤醒,通过循环控制
  42.                 try
  43.                 {
  44.                 while(!flag)
  45.                         condition_con.await();       
  46.                
  47.                 System.out.println(Thread.currentThread().getName()+"---消费者---"+this.name);
  48.                 flag = false;
  49.                
  50.                 condition_pro.signal();
  51.                 }
  52.                 finally
  53.                 {
  54.                         lock.unlock();

  55.                 }
  56.         }
  57. }

  58. class Producer implements Runnable
  59. {
  60.         private Resource res;
  61.         Producer(Resource res)
  62.         {
  63.                 this.res = res;
  64.         }
  65.         public void run()
  66.         {
  67.                 while(true)
  68.                 {
  69.                         try {
  70.                                 res.set("-商品-");
  71.                         } catch (InterruptedException e) {
  72.                                 //e.printStackTrace();
  73.                         }
  74.                 }
  75.         }
  76. }

  77. class Consumer implements Runnable
  78. {
  79.         private Resource res;
  80.         Consumer(Resource res)
  81.         {
  82.                 this.res = res;
  83.         }
  84.         public void run()
  85.         {
  86.                 while(true)
  87.                 {
  88.                         try {
  89.                                 res.out();
  90.                         } catch (InterruptedException e) {
  91.                                 //e.printStackTrace();
  92.                         }
  93.                 }
  94.         }
  95. }
  96. public class Example9 {
  97.        
  98.         public static void main(String[] args) {
  99.                 Resource r = new Resource();
  100.                
  101.                 Producer pro = new Producer(r);
  102.                 Consumer con = new Consumer(r);
  103.                
  104.                 Thread t1 = new Thread(pro);
  105.                 Thread t2 = new Thread(pro);
  106.                 Thread t3 = new Thread(con);
  107.                 Thread t4 = new Thread(con);
  108.                
  109.                 t1.start();
  110.                 t2.start();
  111.                 t3.start();
  112.                 t4.start();
  113.                
  114.                
  115.         }

  116. }
复制代码




作者: 贺奕凯    时间: 2014-1-9 14:55
去掉synchronized

  1. import java.util.concurrent.locks.*;

  2. class Resource
  3. {
  4.         private String name;
  5.         private int count = 1;
  6.         private boolean flag = false;
  7.        
  8.         //重点变化,使用Lock代替线程同步
  9.         private Lock lock = new ReentrantLock();
  10.        
  11.         //通过已有的锁获取两组监视器,一组监视生产者,一组监视消费者。
  12.         private Condition condition_pro = lock.newCondition();
  13.         private Condition condition_con = lock.newCondition();
  14.        
  15.         public void set(String name)throws InterruptedException
  16.         {
  17.                 lock.lock();
  18.                
  19.                 //全部唤醒,通过循环控制
  20.                 try
  21.                 {
  22.                         while(flag)
  23.                                 condition_pro.await();
  24.                        
  25.                         this.name = name+"--"+count++;
  26.                        
  27.                         System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name);
  28.                         flag = true;
  29.                        
  30.                         condition_con.signal();
  31.                 }
  32.                 finally
  33.                 {
  34.                         lock.unlock();

  35.                 }
  36.                
  37.         }
  38.        
  39.         public void out() throws InterruptedException
  40.         {
  41.                 lock.lock();
  42.                 //全部唤醒,通过循环控制
  43.                 try
  44.                 {
  45.                 while(!flag)
  46.                         condition_con.await();       
  47.                
  48.                 System.out.println(Thread.currentThread().getName()+"---消费者---"+this.name);
  49.                 flag = false;
  50.                
  51.                 condition_pro.signal();
  52.                 }
  53.                 finally
  54.                 {
  55.                         lock.unlock();

  56.                 }
  57.         }
  58. }

  59. class Producer implements Runnable
  60. {
  61.         private Resource res;
  62.         Producer(Resource res)
  63.         {
  64.                 this.res = res;
  65.         }
  66.         public void run()
  67.         {
  68.                 while(true)
  69.                 {
  70.                         try {
  71.                                 res.set("-商品-");
  72.                         } catch (InterruptedException e) {
  73.                                 //e.printStackTrace();
  74.                         }
  75.                 }
  76.         }
  77. }

  78. class Consumer implements Runnable
  79. {
  80.         private Resource res;
  81.         Consumer(Resource res)
  82.         {
  83.                 this.res = res;
  84.         }
  85.         public void run()
  86.         {
  87.                 while(true)
  88.                 {
  89.                         try {
  90.                                 res.out();
  91.                         } catch (InterruptedException e) {
  92.                                 //e.printStackTrace();
  93.                         }
  94.                 }
  95.         }
  96. }
  97. public class Example9 {
  98.        
  99.         public static void main(String[] args) {
  100.                 Resource r = new Resource();
  101.                
  102.                 Producer pro = new Producer(r);
  103.                 Consumer con = new Consumer(r);
  104.                
  105.                 Thread t1 = new Thread(pro);
  106.                 Thread t2 = new Thread(pro);
  107.                 Thread t3 = new Thread(con);
  108.                 Thread t4 = new Thread(con);
  109.                
  110.                 t1.start();
  111.                 t2.start();
  112.                 t3.start();
  113.                 t4.start();
  114.                
  115.                
  116.         }

  117. }
复制代码

作者: 伍艳雄    时间: 2014-1-9 18:11
  1. package 多线程;

  2. import java.util.concurrent.locks.*;

  3. class Resource
  4. {
  5.         private String name;
  6.         private int count = 1;
  7.         private boolean flag = false;
  8.         
  9.         //重点变化,使用Lock代替线程同步
  10.         private Lock lock = new ReentrantLock();
  11.         private Condition condition_pro = lock.newCondition();
  12.         private Condition condition_con = lock.newCondition();
  13.         
  14.         public void set(String name)throws InterruptedException //把这里的synchronized 锁去掉.
  15.         {
  16.                 lock.lock();
  17.                
  18.                 //全部唤醒,通过循环控制
  19.                 try
  20.                 {
  21.                 while(flag)
  22.                         condition_pro.await();
  23.                
  24.                 this.name = name+"--"+count++;
  25.                
  26.                 System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name);
  27.                 flag = true;
  28.                
  29.                 condition_con.signal();
  30.                 }
  31.                 finally
  32.                 {
  33.                         lock.unlock();

  34.                 }
  35.                
  36.         }
  37.         
  38.         public void out() throws InterruptedException //这里的锁synchronized 也要去掉.
  39.         {
  40.                 lock.lock();
  41.                 //全部唤醒,通过循环控制
  42.                 try
  43.                 {
  44.                 while(!flag)
  45.                         condition_con.await();        
  46.                
  47.                 System.out.println(Thread.currentThread().getName()+"---消费者---"+this.name);
  48.                 flag = false;
  49.                
  50.                 condition_pro.signal();
  51.                 }
  52.                 finally
  53.                 {
  54.                         lock.unlock();

  55.                 }
  56.         }
  57. }

  58. class Producer implements Runnable
  59. {
  60.         private Resource res;
  61.         Producer(Resource res)
  62.         {
  63.                 this.res = res;
  64.         }
  65.         public void run()
  66.         {
  67.                 while(true)
  68.                 {
  69.                         try {
  70.                                 res.set("-商品-");
  71.                         } catch (InterruptedException e) {
  72.                                 //e.printStackTrace();
  73.                         }
  74.                 }
  75.         }
  76. }

  77. class Consumer implements Runnable
  78. {
  79.         private Resource res;
  80.         Consumer(Resource res)
  81.         {
  82.                 this.res = res;
  83.         }
  84.         public void run()
  85.         {
  86.                 while(true)
  87.                 {
  88.                         try {
  89.                                 res.out();
  90.                         } catch (InterruptedException e) {
  91.                                 //e.printStackTrace();
  92.                         }
  93.                 }
  94.         }
  95. }
  96. public class Example9 {
  97.         
  98.         public static void main(String[] args) {
  99.                 Resource r = new Resource();
  100.                
  101.                 Producer pro = new Producer(r);
  102.                 Consumer con = new Consumer(r);
  103.                
  104.                 Thread t1 = new Thread(pro);
  105.                 Thread t2 = new Thread(pro);
  106.                 Thread t3 = new Thread(con);
  107.                 Thread t4 = new Thread(con);
  108.                
  109.                 t1.start();
  110.                 t2.start();
  111.                 t3.start();
  112.                 t4.start();
  113.                
  114.                
  115.         }

  116. }
复制代码


把16行,和41行的synchronized 去掉.




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