zoukankan      html  css  js  c++  java
  • Java多线程之ReentrantLock

    今天简单的分析一下ReentrantLock的源码,碍于水平有限,如有疏漏或者错误之处请指正。
    

    JDK版本:jdk1.8.0_121

    切入正题:

    当我们使用它的时候一般都是这样new对象的:Lock lock = new ReentrantLock();那么先看一下ReentrantLock的构造函数。
    
    	public ReentrantLock() {
    	//当没有参数的时候,默认创建的是非公平锁。
            sync = new NonfairSync();
        }
    	
    	//当指定 fair这个是否公平参数时进行相应的创建。
    	public ReentrantLock(boolean fair) {
            sync = fair ? new FairSync() : new NonfairSync();
        }
    

    以上代码中出现了一个sync和两个new FairSync() ; new NonfairSync();对象,那么他们又分别是什么呢?

    private final Sync sync;//它是ReentrantLock的私有对象引用
    
    /*
    *而Sync则是ReentrantLock内部的抽象类,它继承自*AbstractQueuedSynchronizer 
    */
    abstract static class Sync extends AbstractQueuedSynchronizer {
    	abstract void lock();
    	....其他的不一一列举
    }
    
    

    **关于AbstractQueuedSynchronizer队列同步器,推荐文章:**http://www.jianshu.com/p/ac0fb814e1a3

    而NonfairSync 和FairSync 则都是继承自上述抽象类Sync,他们同样是ReentrantLock的内部类

    static final class NonfairSync extends Sync {
    }
    
    static final class FairSync extends Sync {
    }
    

    Synchorized区别

    • 可重入性
    • 锁的实现 显示锁基于JDK实现 synchorized是jvm实现
    • 性能区别 jdk6以后性能已经不存在太大区别,都是避免用户态进入内核阻塞状态

    ReentrantLock独有的功能

    • 可以指定是否公平锁
    • 提供了Condition类,可以分组唤醒需要唤醒的线程
    • 提供中断等待锁的线程机制 lock.lockInterruptibly()
  • 相关阅读:
    tkinter中text文本与scroll滚动条控件(五)
    tkinter中entry输入控件(四)
    tkinter中button按钮控件(三)
    tkinter中lable标签控件(二)
    tkinter简介(一)
    Pycharm激活方法使用的是(license server)
    教你如何解决WIN 10系统睡眠无法唤醒
    命令查询windows&Linux系统版本信息
    文本溢出显示省略号,CSS未加载时a标签仍可用处理方法
    Vue.js 中的动态路由
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608418.html
Copyright © 2011-2022 走看看