美文网首页
【Java 多线程之ReadWriteLock 读写锁,偏向锁,

【Java 多线程之ReadWriteLock 读写锁,偏向锁,

作者: 热血趁年华 | 来源:发表于2018-08-03 10:42 被阅读0次

    前言

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

    源码分析

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

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

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

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

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

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

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

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

    JVM中使用 -XX:+UseBiasedLocking

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

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

    相关文章

      网友评论

          本文标题:【Java 多线程之ReadWriteLock 读写锁,偏向锁,

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