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

     

  • 相关阅读:
    七牛php-sdk使用
    七牛php-sdk使用-多媒体处理
    七牛php-sdk使用-文档处理
    七牛php-sdk使用-文件上传
    php爬取微信文章内容
    php解决微信文章图片防盗链
    python2.7编译安装升级python3并安装Scrapy
    centos7安装配置supervisor守护进程
    vuejs+thinkphp5+phpsocketIO+timer数据及时更新
    docker常用命令
  • 原文地址:https://www.cnblogs.com/iwangzheng/p/8807840.html
Copyright © 2011-2022 走看看