A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

JDK1.5 中提供了多线程升级解决方案:
(1)将同步Synchronized替换成现实Lock操作;
(2)将Object中的wait,notify notifyAll,替换了Condition对象,该对象可以Lock锁 进行获取。
下面的示例中,实现了本方只唤醒对方操作。
Lock:替代了Synchronized
        lock
        unlock
        newCondition()
Condition:替代了Object wait notify notifyAll
        await();
        signal();
        signalAll();
示例:
  1. import java.util.concurrent.locks.*;

  2. class ProducerConsumerDemo2
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Resource r = new Resource();

  7.                 Producer pro = new Producer(r);
  8.                 Consumer con = new Consumer(r);

  9.                 Thread t1 = new Thread(pro);
  10.                 Thread t2 = new Thread(pro);
  11.                 Thread t3 = new Thread(con);
  12.                 Thread t4 = new Thread(con);

  13.                 t1.start();
  14.                 t2.start();
  15.                 t3.start();
  16.                 t4.start();

  17.         }
  18. }

  19. /*
  20. JDK1.5 中提供了多线程升级解决方案。
  21. 将同步Synchronized替换成现实Lock操作。
  22. 将Object中的wait,notify notifyAll,替换了Condition对象。
  23. 该对象可以Lock锁 进行获取。
  24. 该示例中,实现了本方只唤醒对方操作。

  25. Lock:替代了Synchronized
  26.         lock
  27.         unlock
  28.         newCondition()

  29. Condition:替代了Object wait notify notifyAll
  30.         await();
  31.         signal();
  32.         signalAll();
  33. */
  34. class Resource
  35. {
  36.         private String name;
  37.         private int count = 1;
  38.         private boolean flag = false;
  39.                         //  t1    t2
  40.         private Lock lock = new ReentrantLock();

  41.         private Condition condition_pro = lock.newCondition();
  42.         private Condition condition_con = lock.newCondition();



  43.         public  void set(String name)throws InterruptedException
  44.         {
  45.                 lock.lock();
  46.                 try
  47.                 {
  48.                         while(flag)
  49.                                 condition_pro.await();//t1,t2
  50.                         this.name = name+"--"+count++;

  51.                         System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  52.                         flag = true;
  53.                         condition_con.signal();
  54.                 }
  55.                 finally
  56.                 {
  57.                         lock.unlock();//释放锁的动作一定要执行。
  58.                 }
  59.         }


  60.         //  t3   t4  
  61.         public  void out()throws InterruptedException
  62.         {
  63.                 lock.lock();
  64.                 try
  65.                 {
  66.                         while(!flag)
  67.                                 condition_con.await();
  68.                         System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
  69.                         flag = false;
  70.                         condition_pro.signal();
  71.                 }
  72.                 finally
  73.                 {
  74.                         lock.unlock();
  75.                 }
  76.                
  77.         }
  78. }

  79. class Producer implements Runnable
  80. {
  81.         private Resource res;

  82.         Producer(Resource res)
  83.         {
  84.                 this.res = res;
  85.         }
  86.         public void run()
  87.         {
  88.                 while(true)
  89.                 {
  90.                         try
  91.                         {
  92.                                 res.set("+商品+");
  93.                         }
  94.                         catch (InterruptedException e)
  95.                         {
  96.                         }
  97.                        
  98.                 }
  99.         }
  100. }

  101. class Consumer implements Runnable
  102. {
  103.         private Resource res;

  104.         Consumer(Resource res)
  105.         {
  106.                 this.res = res;
  107.         }
  108.         public void run()
  109.         {
  110.                 while(true)
  111.                 {
  112.                         try
  113.                         {
  114.                                 res.out();
  115.                         }
  116.                         catch (InterruptedException e)
  117.                         {
  118.                         }
  119.                 }
  120.         }
  121. }
复制代码



1 个回复

倒序浏览
表示没有用过lock,unlock,知识盲点哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马