【Java 多线程之ReadWriteLock 读写锁,偏向锁,自旋锁分析】

前言

ReadWriteLock是一个抽象类,实现类为ReentrantReadWriteLock,其管理两组锁,一个读锁,一个写锁。读锁可以在没有写锁的情况下被多个线程持有,写锁是独占的。读写锁更多应用在读多写少的情况下。

源码分析

ReentrantReadWriteLock有两个构造方法,默认的构造方法是不带参数,内部调用的是带布尔参的构造方法,参数为FALSE。构造内部生一个NonfairSync类,采用的是非公平模式。当为true的时候生成一个FairSync类,采用公平模式。

公平模式和非公平模式的区别

非公平模式:线程获取读锁和写锁的顺序不确定,采取竞争方式获取,吞吐量比较高

公平模式:线程会以队列有序的方式获取锁

公平模式和非公平模式继承了一个抽象类,该抽象类有两个比较重要的方法


读线程和写线程是否需要阻塞,在公平模式和非公平模式的选择上是不一样的。非公平模式下当线程获取写线程时候,不阻塞,获取读线程会判断是否有写锁,有的话会阻塞。在公平模式下,首先会判断线程队列中是否有等待的线程,如果有则放入队列中,则等待时间久的线程会获取锁。   

    在多线程中,要注意线程优化,经常使用的线程优化就是,偏向锁和旋转锁。

偏向锁:当某一个线程获得锁之后,该线程再次获取锁的时候,不需要执行相关的同步操作,就可直接获取锁。如果再次期间,其它的线程获取了这个锁,那么该锁就退出偏向模式。该情况不适合锁竞争比较激烈的情况。

JVM中使用 -XX:+UseBiasedLocking

自旋锁:在多线程中线程的上下文切换会消耗计算机的资源影响其性能,自旋锁可以减少这种上下文切换的时间,当一个线程获取锁没有成功时,会自转几个CPU周期,直到该线程获取这个锁。

在JDK1.6中,Java虚拟机提供-XX:+UseSpinning参数来开启自旋锁,使用-XX:PreBlockSpin参数来设置自旋锁等待的次数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容