读写锁的实现

读写锁主要用来解决读-读能共存,读-写不能共存,写-写不能共存的情况,它的使用场景主要是读写分离,比如自己实现一个缓存,在刷新缓存的时候就需要用到读写锁。下面撸上一段代码,简单实现以下。

/**
 * @author Administrator
 * @date 2019/3/3
 */
public class Cache {
    static Map<String,String> map=new HashMap<String,String>();
    static ReentrantReadWriteLock rwl=new ReentrantReadWriteLock();
    static Lock r=rwl.readLock();
    static Lock w=rwl.writeLock();

    /**
     * 获取key对应的value
     * @param key
     * @return
     */
    public static final String get(String key){
        r.lock();
        try{
            System.out.println("正在做读操作,key: "+key+"----开始");
            String value=map.get(key);
            System.out.println("正在做读操作,key: "+key+"----结束"+" value:"+value);
            System.out.println();
            return value;
        }catch (Exception e){
            return null;
        }finally {
            r.unlock();
        }
    }

    /**
     * 设置key对应的value,
     * @param key
     * @param value
     * @return
     */
    public static final void put(String key,String value){
        w.lock();
        try{
            System.out.println("正在做写的操作,key:" + key + ",value:" + value + "----开始");
            Thread.sleep(1000);
            map.put(key, value);
            System.out.println("正在做写的操作,key:" + key + ",value:" + value + "----结束");
            System.out.println();
        }catch (Exception e){

        }finally {
            w.unlock();
        }
    }

    /**
     * 清除所有的内容
     */
    public static final void clear(){
        w.lock();
        try{
            map.clear();
        }finally {
            w.unlock();
        }
    }

    public static void main(String[] args){
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    Cache.put(i+" ",i+"");
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    Cache.get(i+" ");
                }
            }
        }).start();
    }
}

结果:

正在做写的操作,key:0 ,value:0----开始
正在做写的操作,key:0 ,value:0----结束

正在做写的操作,key:1 ,value:1----开始
正在做写的操作,key:1 ,value:1----结束

正在做写的操作,key:2 ,value:2----开始
正在做写的操作,key:2 ,value:2----结束

正在做写的操作,key:3 ,value:3----开始
正在做写的操作,key:3 ,value:3----结束

正在做读操作,key: 0 ----开始
正在做读操作,key: 0 ----结束 value:0

正在做写的操作,key:4 ,value:4----开始
正在做写的操作,key:4 ,value:4----结束

正在做写的操作,key:5 ,value:5----开始
正在做写的操作,key:5 ,value:5----结束

正在做写的操作,key:6 ,value:6----开始
正在做写的操作,key:6 ,value:6----结束

正在做写的操作,key:7 ,value:7----开始
正在做写的操作,key:7 ,value:7----结束

正在做读操作,key: 1 ----开始
正在做读操作,key: 1 ----结束 value:1

正在做读操作,key: 2 ----开始
正在做读操作,key: 2 ----结束 value:2

正在做读操作,key: 3 ----开始
正在做读操作,key: 3 ----结束 value:3

正在做读操作,key: 4 ----开始
正在做读操作,key: 4 ----结束 value:4

正在做读操作,key: 5 ----开始
正在做读操作,key: 5 ----结束 value:5

正在做读操作,key: 6 ----开始
正在做读操作,key: 6 ----结束 value:6

正在做读操作,key: 7 ----开始
正在做读操作,key: 7 ----结束 value:7

正在做读操作,key: 8 ----开始
正在做读操作,key: 8 ----结束 value:null

正在做读操作,key: 9 ----开始
正在做读操作,key: 9 ----结束 value:null

正在做写的操作,key:8 ,value:8----开始
正在做写的操作,key:8 ,value:8----结束

正在做写的操作,key:9 ,value:9----开始
正在做写的操作,key:9 ,value:9----结束


Process finished with exit code 0
 

猜你喜欢

转载自blog.csdn.net/FutureFlyme/article/details/88086577