读写锁的实现

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

/**
 * @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----结束

本人介绍:研究生期间主要从事NLP学习和研究,毕业后在银行从事2年Java后端开发,目前在一家垂直领域TOP1互联网公司大数据部门工作。以下是我运营的一个公众号,会不定期发布一些文章,主要记录工作中使用到的技术和面临的技术难题,涉及后端,大数据和系统架构方面的知识,欢迎大家订阅交流。
 

 

 


Process finished with exit code 0
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值