乐趣区

ReadWriteLock读写锁

读写锁, 分场景优化, 提升性能。

读写锁遵守的基本原则:

  1. 允许多个线程同时读共享变量。
  2. 只允许一个线程写共享变量。
  3. 如果一个写线程正在执行写操作,此时禁止多线程读共享变量。
  4. 读锁与写锁是互斥的;写锁与写锁也是互斥的。

读写锁适用于读多写少的场景。

读写锁与互斥锁的区别:读写锁运行多个线程同时读共享变量。

ReadWriteLock 是一个接口,ReentrantReadWriteLock 可重入读写锁是他的实现类。

读写锁实例:

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @Description:
 * @Author: LYQ
 * @Date: 2019/9/10 11:12
 * @Version: V1.0
 **/
public class Cache<K,V> {final Map<K,V> m = new HashMap<>();
    final ReadWriteLock rwl = new ReentrantReadWriteLock();
    // 读锁
    final Lock r =  rwl.readLock();
    // 写锁
    final Lock w = rwl.writeLock();

    /**
     * 读缓存
     * @param key
     * @return
     */
    V get(K key){
        // 获取读锁
        r.lock();
        try {return  m.get(key);
        }finally {r.unlock();
        }
    }

    /**
     * 写缓存
     * @param key
     * @param value
     * @return
     */
    V put(K key,V value){w.lock();
         try{return m.put(key,value);
         }finally {w.unlock();
         }
    }

}

锁的升级与降级

锁升级:读锁 -> 写锁;先获取读锁,然后升级为写锁。

锁降级:写锁 -> 读锁;先获取写锁,人后升级为读锁。

ReadWriteLock 支持锁的降级,不支持升级。

由读锁变写锁需要先把读锁释放掉再获取写锁,由写锁变读锁无需释放写锁。


码字不易如果对你有帮助请给个关注

爱技术爱生活 QQ 群: 894109590

退出移动版