• Java Concurrency


    锁所提供的最重要的改进之一就是 ReadWriteLock 接口和它的实现类 ReentrantReadWriteLock。这个类提供两把锁,一把用于读操作和一把用于写操作。同一时间可以有多个线程执行读操作,但只有一个线程可以执行写操作。当一个线程正在执行一个写操作,不可能有任何线程执行读操作。

    public class VisitCounter {
    
        private ReadWriteLock lock;
        
        private long counter;
        
        public VisitCounter() {
            counter = 0;
            lock = new ReentrantReadWriteLock();
        }
        
        public long get() {
            long result = -1;
            lock.readLock().lock();
            try {
                // System.out.println(Thread.currentThread().getName() + "准备查询访客计数器……" + ", " + new Date());
                result = queryCounter();
                // System.out.println(Thread.currentThread().getName() + "查得访客计数器值为" + result + ", " + new Date());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.readLock().unlock();
            }
            return result;
        }
        
        public void increase() {
            lock.writeLock().lock();
            try {
                // System.out.println("新增访客:" + Thread.currentThread().getName() + ", " + new Date());
                updateCounter();
                // System.out.println(Thread.currentThread().getName() + "更新访客计数器完毕……" + ", " + new Date());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.writeLock().unlock();
            }
        }
        
        private long queryCounter() throws Exception {
            Thread.sleep((long)(Math.random() * 10000));
            return counter;
        }
        
        private void updateCounter() throws Exception {
            Thread.sleep((long)(Math.random() * 10000));
            counter++;
        }
    }

    正如前面提及到的,ReentrantReadWriteLock 类有两把锁,一把用于读操作,一把用于写操作。用于读操作的锁,是通过在 ReadWriteLock 接口中声明的 readLock() 方法获取的。这个锁是实现 Lock 接口的一个对象,所以我们可以使用 lock(),unlock() 和 tryLock() 方法。用于写操作的锁,是通过在 ReadWriteLock 接口中声明的 writeLock() 方法获取的。这个锁是实现 Lock 接 口的一个对象,所以我们可以使用 lock(),unlock() 和 tryLock() 方法。确保正确的使用这些锁,使用它们与被设计的目的是一样的,这是程序员的职责。当获得 Lock 接口的读锁时,不能修改变量的值。否则,可能会有数据不一致的错误。

  • 相关阅读:
    (Java实现) 有重复元素排列问题
    玩转Google开源C++单元测试框架Google Test系列(转载)
    C++11之后,对源代码增加了UTF8和UCS4的支持(Windows内部使用Unicode,因为nt内核用的是ucs2,那是89年,utf8到了92年才发明出来)
    当年写的俄罗斯方块(现在更喜欢研究别人的代码)
    Stack的三种含义(数据超过栈的大小,就发生stack overflow)
    64位平台C/C++开发注意事项(转载)
    Redis集群方案
    Hadoop处理大量小文件的问题和解决方法
    Lazy Scheduler
    Solr与MongoDB集成,实时增量索引
  • 原文地址:https://www.cnblogs.com/huey/p/6009207.html
Copyright © 2020-2023  润新知