美文网首页
并发编程--读写锁

并发编程--读写锁

作者: 守住阳光 | 来源:发表于2018-09-15 10:22 被阅读0次

        读写锁维护一对锁,一个读锁和一个写锁。读写锁在同一时刻允许多个读线程获取读锁;但是同一时刻只能有一个线程获取到写锁,此时其他读写操作均被阻塞。并发性相比其他排他锁有了很大的提升。

一、读写锁的特性

        1、公平性与非公平性选择

        支持非公平(默认)和公平的锁获取方式,吞吐量非公平优于公平。

        2、重进入

        支持重进入,以读写线程为例:读线程在获取读锁能再次获取读锁。而写线程在获取写锁之后,能再次获取写锁,同时也可以获取读锁。

        3、锁降级

        遵循获取写锁,获取读锁在释放写锁的次序,写锁能降级为读锁。

二、接口与示例

        ReadWriteLock仅定义了获取读锁和写锁的两个方法,即eadLock()方法和writeLock()方法,而其实现——ReentrantReadWriteLock,除了接口方法之外,还提供了一些便于外界监控其内部工作状态的方法,如下:

        1、int getReadLockCount()

        返回当前读锁被获取的次数。

        2、int getReadHoldCount()

        返回当前线程获取读锁的次数。

        3、boolean isWriteLocked()

        判断写锁是否被获取。

        4、int getWriteHoldCount()

        判断当期写锁被获取的次数。

        下面是通过缓存展示读写锁的使用方式。

public class SafeCache {

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

        //读写锁

        private static  ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

        //读锁

        private static Lock rl = rwl.readLock();

        //写锁

        private static Lock wl = rwl.writeLock();

        //获取元素

        public final Object get(String key){

                rl.lock();

                try{

                        return map.get(key);

                }finally{

                        rl.unlock();

                }

         }

        //插入操作

        public final Object put(String key , Object value){

                wl.lock();

                try{

                    return map.put(key, value);

                }finally{

                    wl.unlock();

                }

         }

        //清空元素

        public void clear(){

                wl.lock();

                try{

                    map.clear();

                }finally{

                    wl.unlock();

                }

        }

}

        Cache组合一个非线程安全的HashMap作为缓存的实现,同时使用读写锁的读锁和写锁来保证Cache是线程安全的。在读操作get(String key)方法中,需要获取读锁,这使得并发访问该方法时不会被阻塞。写操作put(String key,Object value)方法和clear()方法,在更新HashMap时必须提前获取写锁,当获取写锁后,其他线程对于读锁和写锁的获取均被阻塞,而只有写锁被释放之后,其他读写操作才能继续。Cache使用读写锁提升读操作的并发性,也保证每次写操作对所有的读写操作的可见性,同时简化了编程方式。

相关文章

  • 并发编程--读写锁

    读写锁维护一对锁,一个读锁和一个写锁。读写锁在同一时刻允许多个读线程获取读锁;但是同一时刻只能有一个线程获...

  • 读写锁应用实例(ReentrantReadWriteLock)及

    以下知识参考至《Java并发编程的艺术》 这里使用的是读写锁:ReentrantReadWriteLock 在Ja...

  • java并发编程-StampedLock高性能读写锁

    [TOC] 一、读写锁 在我的《java并发编程》[https://mp.weixin.qq.com/mp/app...

  • golang 基础(31) 锁

    在 go 语言中提供了并发编程模型和工具外,还提供传统的同步工具锁,包括互斥锁和读写锁有关互斥锁有些内容我们必须清...

  • 并发编程之——读锁源码分析(解释关于锁降级的争议)

    1. 前言 在前面的文章 并发编程之——写锁源码分析中,我们分析了 1.8 JUC 中读写锁中的写锁的获取和释放过...

  • Java并发编程-读写锁(ReentrantReadWriteL

    章节目录 ReentrantReadWriteLock 特性 读写锁接口示例 读写锁的实现分析读写状态设计写锁的释...

  • java并发

    1.并发编程中的锁 并发编程中的各种锁java高并发锁的3种实现Java并发机制及锁的实现原理 2.线程池核心线程...

  • 1.MySQL的架构与历史

    MySQL逻辑架构 并发控制 读写锁sharelock共享锁,exclusivelock排他锁 锁粒度table ...

  • ZooKeeper实现读写锁

    1 读写锁的概念 读写锁是计算机程序的并发控制的一种同步机制,用于解决读写问题,读操作可并发重入,写操作是互斥的。...

  • java锁的概念

    参考文档探究分布式并发锁并发编程-锁的发展和主流分布式锁比较总结从构建分布式秒杀系统聊聊分布式锁探索并发编程(六)...

网友评论

      本文标题:并发编程--读写锁

      本文链接:https://www.haomeiwen.com/subject/lacagftx.html