• (原创)JAVA多线程三锁


    前两章介绍了锁,那么现在我们介绍新的一个类,锁

    一,简介

      Lock是一个接口,实现它的类有读锁,写锁,和ReentrantLock,我们可以在类上点击ctrl+t来看看有哪些类实现了这个接口

      使用方法

    private Lock l = new ReentrantLock();            
    try{
        l.lock();
        if(ticketCount > 0){                    
        try {
             Thread.sleep(100);
        } catch (InterruptedException e) {
                 e.printStackTrace();
         }
          System.out.println(Thread.currentThread().getName()+ "卖出了第"+(ticketCount--)+"张票");
         }                
        }
        finally{
        l.unlock();                
      }

    特别注意,要在最后unlock锁,否则这个锁会一直锁着,导致别的无法使用

    二,读锁和写锁

     这里有一个例子,读写锁的缓存应用,如下所示

    package cn.unis;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    public class CacheDemo {
        public Map<String, Object> cached = new HashMap<String, Object>();
    
        private ReadWriteLock rwl = new ReentrantReadWriteLock();
    
        public Object getobject(String keyname) {
            rwl.readLock().lock(); // 读数据前先加锁
            Object value = null;
            try {
                value = cached.get(keyname);
                if (value == null) {   //发现数据是空的,则写数据,先开启写锁
                    rwl.readLock().unlock();
                    rwl.writeLock().lock();
                    try {
                        if (value == "" || value == null) {
                            value = "test";
                        }
                    } finally {
                        rwl.writeLock().lock();
                        rwl.readLock().lock();
                    }
                }
            } finally {
                rwl.readLock().unlock();
            }
    
            return value;
        }
    }
    缓存

     三,Condition实现线程同步通信

    类似于传统线程技术中的object.wait()和object.notifyall()方法

    可以这样说,他替代了wait方法,用的是如下的代码,注意,Condition是基于Lock的

        Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();

    使用方法是:

            condition.await();
            condition.signal();

     在SDK里面有一个例子,缓冲区的例子,可以参考一下

     class BoundedBuffer {
       final Lock lock = new ReentrantLock();
       final Condition notFull  = lock.newCondition(); 
       final Condition notEmpty = lock.newCondition(); 
    
       final Object[] items = new Object[100];
       int putptr, takeptr, count;
    
       public void put(Object x) throws InterruptedException {
         lock.lock();
         try {
           while (count == items.length) 
             notFull.await();
           items[putptr] = x; 
           if (++putptr == items.length) putptr = 0;
           ++count;
           notEmpty.signal();
         } finally {
           lock.unlock();
         }
       }
    
       public Object take() throws InterruptedException {
         lock.lock();
         try {
           while (count == 0) 
             notEmpty.await();
           Object x = items[takeptr]; 
           if (++takeptr == items.length) takeptr = 0;
           --count;
           notFull.signal();
           return x;
         } finally {
           lock.unlock();
         }
       } 
     }
    View Code
  • 相关阅读:
    基于antd封装一个高可用form组件 减少cv代码导致的bug
    写一个umi插件 自动生成代码 解放cv的双手
    jquery.validate的一个bug
    ef6+mysql的bug
    angularJS使用ocLazyLoad实现js延迟加载
    postgresql,postgis,geoserver 发布地图服务,并用.net mvc openlayers3进行显示
    EF框架操作postgresql,实现WKT类型坐标的插入,查询,以及判断是否相交
    jquery validate 之多tab页同时校验问题
    js去除空格12种方法
    个人工具清单
  • 原文地址:https://www.cnblogs.com/ningheshutong/p/5845888.html
Copyright © 2020-2023  润新知