java读写锁是什么?什么应用场景需要用到读写锁?

Java 投稿 62100 0 评论

java读写锁是什么?什么应用场景需要用到读写锁?

为什么会有写锁和读锁

原来我们使用ReentrantLock创建锁的时候,是独占锁,也就是说一次只能一个线程访问。但是有一个读写分离场景,读的时候想同时进行,因为读锁并不会造成数据不一致的问题,因此可以多个人共享读。

多个线程同时去读一个资源类没有任何问题,如果一个线程想去写共享内存,就不应该有其他线程对该资源进行读或写。

在高并发的情况下,读取共享资源应该是可以同时进行的;但是,如果一个线程想要去写共享资源,就不应该再有其他线程同时对该共享资源进行读或者是写操作了。 我们想要的是:允许多个线程同时读,但只要有一个线程在写,其他线程就必须等待,这个时候我们就需要对它进行加锁,来防止多个线程同时对它进行操作引起的冲突。

java读写锁是什么,有什么用?以下几点简要说明下:

  1. 读写锁将一个资源(如文件)的访问分为两个锁,一个读写锁。

  2. 因为读写锁,多个线程之间的读写操作才不会发生冲突。

  3. ReadWriteLock是读写锁,它是一个界面,RentrantReadWriteLock实现了这个界面。

public class MyCache{

    private Map<String, Object> cache = new HashMap<>();

    private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    public static void main(String[] args) {

    }

    public Object getData(String key) {
        Object value = null;
        //首先开启读锁,从缓存中去取
        readWriteLock.readLock().lock();

        try {
            value = cache.get(key);
            //如果缓存中没有释放读锁,上写锁
            if (value == null) {
                //对应queryDB()
                readWriteLock.readLock().unlock();
                //读锁必须unlock之后才能获取写锁
                readWriteLock.writeLock().lock();

                try {

                    //对应queryDB()
                    value = queryDB();
                } finally {

                    //释放写锁
                    readWriteLock.writeLock().unlock();
                }
                //然后再上读锁
                readWriteLock.readLock().lock();
            }

        } finally {
            //最后释放读锁
            readWriteLock.readLock().unlock();
        }
        return value;
    }

    public Object queryDB() {
        return "bbbb";
    }
}

编程笔记 » java读写锁是什么?什么应用场景需要用到读写锁?

赞同 (69) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽