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();
           }
         }
       }
    

     

  • 相关阅读:
    加密,解密Web.Config
    Asp.Net在SqlServer中的图片存取技术
    获得定长字符串
    Response.redirect到一个新页面时,保证不是缓存的方法
    从MapX到MapXtreme2004[12]SearchNearest!
    电子签名实现的思路、困难及解决方案
    LegacyText的复制的Bug
    从MapX到MapXtreme2004[11]坐标概论
    水晶报表的导出和打印
    水晶报表文本在web中无法两端对齐
  • 原文地址:https://www.cnblogs.com/iwangzheng/p/8807840.html
Copyright © 2011-2022 走看看