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

        /**
         * 设计一个缓存系统
         * 读写锁的应用。
         * 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();
        }

    }
相关文章
相关标签/搜索