`

读写锁总结

 
阅读更多
1. ReadWriteLock
对象的方法中一旦加入了synchronized关键字,则任何时刻只能有一个线程访问synchronized修饰的块。假设有个数据对象用户拥有写方法和读方法,那么多线程环境下要保证数据的安全,需要对该对象的读、写方法都加synchronized关键字。 这样,
    1)对于任何线程在写入时,其他线程都无法读,也无法写;
    2)如果有线程在读时,其他线程也无法读,也无法写。
这样的规则,对于写入操作时,没有问题。但对于读操作时,会造成不必要的性能瓶颈。因为读操作是可以多线程同时进行的,而synchronized限制了数据的并发读。

ReadWriteLock解决了这个问题:
    1)当写操作时,其他线程无法读,也无法写
    2)当读操作时,其他线程可以读,但无法写。


2. ReentrantReadWriteLock

1) 可重入概念

若一个程序或子程序可以“安全的被并行执行(Parallel computing)”,则称其为可重入(reentrant或re-entrant)的。即当该子程序正在运行时,可以再次进入并执行它(并行执行时,个别的执行结果,都符合设计时的预期)。可重入概念是在单线程操作系统的时代提出的。

3. 互斥锁:
所谓互斥锁,只指一次最多只能有一个线程持有的锁。在jdk1.5之前,只能用synchronized控制多线程对共享资源的访问。现在Lock提供了比synchronized更强大的锁定操作。

Lock与synchronized的主要区别:
    -- synchronized机制提供了对与每个对象相关的隐式的监视器锁,并强制所有锁的获取和释放都必须在同一个块结构中。当获取了多个锁时,他们必须以相反的顺序释放。即synchronized对于锁的释放是隐式的。
    -- 而Lock机制必须显式的调用Lock对象的unlock()方法,这样,获取锁和释放锁可以不在同一个块中,这样可以以更自由的顺序释放锁。

ReentrantLock比Synchronized强大在哪?
1)ReentrantLock可以实现fair lock (所谓fair lock就是获得锁的顺序和申请锁的时间的顺序是一致的 )
public ReentrantLock(boolean fair) {
    sync = (fair) ? new FairSync() : new NonfairSync();
}

2) ReentrantLock支持中断处理
public final void acquireInterruptibly(int arg) throws InterruptedException {
    if (Thread.interrupted()) {
        throw new InterruptedException();
    }
    if (!tryAcquire(arg)) {
        doAcquireInterruptibly(arg);
    }
}

3) ReentrantLock可以和condition结合使用
public boolean hasWaiters(Condition condition) {
    if (condition == null) {
        throw new NullPointerException();
    }
    if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject)) {
        throw new IllegalArgumentException("not owner");
    }
    return sync.hasWaiters((AbstractQueuedSynchronizer.ConditionObject)condition);
}










分享到:
评论
1 楼 qindongliang1922 2016-04-14  
代码可以加上格式

相关推荐

    Linux系统编程-(pthread)线程通信(条件变量).pdf

    **读写锁总结:** 1. 读写锁分为读锁和写锁。 2. 如果资源被读写锁保护,多个线程可以同时获取读锁—也就是读支持多个线程同时读。 3. 资源加了写锁之后,在写资源的时候只能被一个线程占用,其他读锁就会阻塞。 ...

    面试官:有没有比读写锁更快的锁?

    目录面试三连什么是读写锁StampedLock横空出世StampedLock三种模式基本语法StampedLock完整的demo让StampedLock性能更上一楼的乐观读你了解乐观读的应用场景吗使用StampedLock的注意事项总结 面试三连 面试官:了解...

    asp.net 细说文件读写操作(读写锁)

    开发过程中,我们玩玩需要大量与文件交互,读文件,写文件已成家常便饭,本地运行完美,但一上到投产环境,往往会出现很多令人措手不及的意外,或开发中的烦恼,因此,我对普通的C#文件操作做了一次总结

    python互斥锁、加锁、同步机制、异步通信知识总结

    互斥锁保证了每次只有一个线程进入写入操作,从而保证了多线程情况下数据的正确性。 采用f_flag的方法效率低 创建锁 mutex=threading.Lock() 锁定 mutex.acquire([blocking])#里面可以加blocking(等待的时间)或者...

    FileShare枚举的使用小结(文件读写锁)

    开发过程中,我们往往需要大量与文件交互,读文件,写文件已成家常便饭,本地运行完美,但一上到投产环境,往往会出现很多令人措手不及的意外,或开发中的烦恼,因此,我对普通的C#文件操作做了一次总结,问题大部分...

    InnoDB怎么应对高并发

    (2)普通锁串行,读写锁读读并行,数据多版本读写并行; (3)redo日志保证已提交事务的ACID特性,设计思路是,通过顺序写替代随机写,提高并发; (4)undo日志用来回滚未提交的事务,它存储在回滚段里; (5)InnoDB是...

    android安卓app开发教程之--总结了50条安卓开发经验.zip

    (123代表不同线程,轮流插入一个记录),读和写均不会锁住db,读写交替并没有规律,执行次数和程度看cpu分配给哪个线程的时间片长 43. 选择正确的集合类型使你能够在集合性能与内存占用之间达到合理的平衡。除此...

    多线程性能测试总结文档

    1、单线程加锁读写全局数据,每秒读多少次?建议使用读XXX万次,用多少时间来计算。 2、多线程加锁读写全局...3、每个线程每秒只读500次并且读后不要立即释放锁的情况下(执行一段for循环代码),执行2与2.1两个步骤

    go语言开发技巧入门教程总结.docx

    解决方案:使用互斥锁(sync.Mutex)、读写锁(sync.RWMutex)或channels进行同步;使用原子操作(sync/atomic包);遵循最小权限原则,尽量减少共享数据。 错误处理 问题描述:错误处理代码冗余,影响可读性。 解决方案...

    关于GD32芯片读保护的描述和解决办法1.pdf

    该文档总结arm芯片,内部flash写保护的解决的一般通用方法,适用于stm32,gd32系列芯片,具体请查看文档内容

    最新单片机课程设计电子密码锁设计通信班-免费下载.doc

    9 2.3.4 修改密码程序 10 2.3.5 LCD显示程序 11 2.4 仿真测试结果 12 3 总结 14 参考文献 15 附录 16 1 引言 随着科技和人们的生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出, 传统机械锁由于构造简单...

    C#多线程编程中的锁系统(二)

    4:总结 一:volatile 简单来说: volatile关键字是告诉c#编译器和JIT编译器,不对volatile标记的字段做任何的缓存。确保字段读写都是原子操作,最新值。 这不就是锁吗? 其这货它根本不是锁, 它的原子操作是基于...

    【2018最新最详细】并发多线程教程

    11.深入理解读写锁ReentrantReadWriteLock 12.详解Condition的await和signal等待通知机制 13.LockSupport工具 14.并发容器之ConcurrentHashMap(JDK 1.8版本) 15.并发容器之ConcurrentLinkedQueue 16.并发容器之...

    SQL 数据库性能调优方面的总结

    将数据均匀分布在磁盘上可以提高i/o利用率,提高数据的读写性能;适当程度的非规范化可以改善系统查询性能;建立索引和编写高效的sql语句能有效避免低性能操作;通过锁的调优解决并发控制方面的性能问题。数据库调优...

    深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

    并发优化包括volatile的大量、正确使用,CAS和原子类的广泛使用,线程安全容器的使用,以及通过读写锁提升并发性能等。 总的来说,Java源码的学习和理解是提升技术功底,深度掌握技术框架,快速定位

    2019 年终总结,240+篇,已分类整理

    code小生 一个专注大前端领域的技术平台 ...以下内容按照技术模块来划分,每个大的分类下文章顺序是按照难易程序来的,这样学习起来方便些。...Android 读写锁的应用,以及最佳的磁盘缓存设计 RxJava2

    Java并发编程原理与实战

    读写锁认识与原理.mp4 细读ReentrantReadWriteLock源码.mp4 ReentrantReadWriteLock锁降级详解.mp4 线程安全性问题简单总结.mp4 线程之间的通信之wait notify.mp4 通过生产者消费者模型理解等待唤醒机制.mp4 ...

    python学习应用手册(上册)

    1、pycharm环境安装与使用、常用快捷键、操作指南 2、详尽的基本的数据类型讲解,配套现成代码:字符串、数字、列表、元组、字典、集合...12、进程、线程、协程、互斥锁、递归锁、升序锁、yield表达式、async/await异步

    Android开发性能优化总结

    一. 加载 预加载:1.反射注解框架Reflect信息,在Application内多线程预加载至缓存。...2. 并发操作多用读写锁,少用synchronized,Android虚拟机Art直到Android6.0为止尚未对synchronized做CAS优化,而sy

    [14本经典Android开发教程]-8-Linux内核阅读心得体会

    [14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核感悟 Linux内核启动 从hello world说起 3 ...读核感悟 文件读写 内核态是否支持非direct I O方式的AIO ...

Global site tag (gtag.js) - Google Analytics