• 缓存设计--读写锁场景实现


            /**
             * 设计一个缓存系统
             * 读写锁的应用。
             * JDK1.5自带的读写锁特性,读与读不互斥,读与写互斥,写与写互斥。
             * 为什么要使用读写锁?一句话概括那就是提高系统性能,如何提高呢?
             * 试想,对于所有对读的操作是不需要线程互斥的,而如果方法内
             * 使用了synchronized关键字同步以达到线程安全,对于所有的线程不管是读还是写的操作都要同步。
             * 这时如果有大量的读操作时就会又性能瓶颈。
             *
             * 所以,当一个方法内有多个线程访问,并且方法内有读和写读操作时,
             * 提升性能最好的线程安全办法时采用读写锁的机制对读写互斥、写写互斥。这样对于读读就没有性能问题了
             *
             */
    
    
        public void readWriteMathod(String key){
    
            readWriteLock.readLock().lock();//读锁,只对写的线程互斥
            Object value = null;
            try {
                // 尝试从缓存中获取数据
                value = map.get(key);
                if (value == null) {
                    readWriteLock.readLock().unlock();//发现目标值为null,释放掉读锁
                    readWriteLock.writeLock().lock();//发现目标值为null,需要取值操作,上写锁
                    try {
                        value = map.get(key);// 很严谨这一步。再次取目标值
                        if (value == null) {//很严谨这一步。再次判断目标值,防止写锁释放后,后面获得写锁的线程再次进行取值操作
                            // 模拟DB操作
                            value = new Random().nextInt(10000) + "test";
                            map.put(key, value);
    
                            System.out.println("db completed!");
                        }
                        readWriteLock.readLock().lock();//再次对读进行锁住,以防止写的操作,造成数据错乱
                    } finally {
                        /*
                         * 先加读锁再释放写锁读作用:
                         * 防止在100行出多个线程获得写锁进行写的操作,所以在写锁还没有释放前要上读锁
                         */
                        readWriteLock.writeLock().unlock();
                    }
                }
    
            } finally {
                readWriteLock.readLock().unlock();
            }
    
        }
    

      

  • 相关阅读:
    unity工厂模式
    unity对象池
    unity进阶项目------保卫萝卜(2)
    C#状态机
    unity进阶项目------保卫萝卜(1)
    OpenGL——外部读档+异常报错
    OpenGL入门之入门
    xlua build时 报错处理
    捕鱼达人Demo版下载
    UGUI-Text——自适应
  • 原文地址:https://www.cnblogs.com/kaleidoscope/p/9877743.html
Copyright © 2020-2023  润新知