zoukankan      html  css  js  c++  java
  • Java生产者和消费者

    synchronized

    This version is the fewest lines of code, largely because the synchronization mechanism used is built into the language and runtime. But the programmer has to remember to avoid a couple of common bugs: The wait() must be inside a while instead of an if, and notifyAll() must be used instead of notify() because there are two different logical conditions being awaited.
     
       public class SafeBox<V> {
         private V value;
    
         public synchronized V get() throws InterruptedException {
           while (value == null) {
             wait();
           }
           V result = value;
           value = null;
           notifyAll();
           return result;
         }
    
         public synchronized void set(V newValue) throws InterruptedException {
           while (value != null) {
             wait();
           }
           value = newValue;
           notifyAll();
         }
       }
    
     

    ReentrantLock

    This version is much more verbose than the synchronized version, and still suffers from the need for the programmer to remember to use while instead of if. However, one advantage is that we can introduce two separate Condition objects, which allows us to use signal() instead of signalAll(), which may be a performance benefit.
     
    
       public class SafeBox<V> {
         private final ReentrantLock lock = new ReentrantLock();
         private final Condition valuePresent = lock.newCondition();
         private final Condition valueAbsent = lock.newCondition();
         private V value;
    
         public V get() throws InterruptedException {
           lock.lock();
           try {
             while (value == null) {
               valuePresent.await();
             }
             V result = value;
             value = null;
             valueAbsent.signal();
             return result;
           } finally {
             lock.unlock();
           }
         }
    
         public void set(V newValue) throws InterruptedException {
           lock.lock();
           try {
             while (value != null) {
               valueAbsent.await();
             }
             value = newValue;
             valuePresent.signal();
           } finally {
             lock.unlock();
           }
         }
       }
    

     

  • 相关阅读:
    友盟统计,监听事件次数。
    webView 加载网页
    Springboot 启动时Bean初始化,启动异常-Assert.isTrue(condition,message) 报错
    Springboot使用@ConfigurationProperties注解 配置读不进去
    2018即将结束,给寒假李哥flag
    大精度求和,给任意两个数 m,n 甚至m,n->∞ 计算x+y
    第二章JavaScript 函数和对象
    第三章JavaScript 内置对象
    响应式网页设计
    新的页面布局方式
  • 原文地址:https://www.cnblogs.com/iwangzheng/p/8807840.html
Copyright © 2011-2022 走看看