码迷,mamicode.com
首页 > 其他好文 > 详细

ReentrantLock源码(一)

时间:2018-08-28 14:25:09      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:ros   unlock   没有   先来   strong   简介   sof   详细介绍   获取   

一、简介。    

   ReentrantLock 是一个互斥锁,在基本行为和机制上与synchonized一样,只不过synchonized用方法和声明访问了隐式的锁监视器,但是ReentrantLock 做了功能上的扩展。ReentrantLock 被最后一个成功lock,但是还没unlock的线程拥有。当锁不被其他线程拥有,一个线程会成功的申请锁资源并立即返回。如果当前线程已经拥有了锁,再申请时也会立即返回。通过调用方法isHeldByCurrentThread()获取是否当前线程获得了锁,getHoldCount()得到获得几次锁资源。此类的构造方法接受一个可选的公平 参数。当设置为 true 时,在多个线程的争用下,这些锁倾向于将访问权授予等待时间最长的线程。否则此锁将无法保证任何特定访问顺序。

       与采用默认设置(使用不公平锁)相比,使用公平锁的程序在许多线程访问时表现为很低的总体吞吐量(即速度很慢,常常极其慢),但是在获得锁和保证锁分配的均衡性时差异较小。不过要注意的是,公平锁不能保证线程调度的公平性。因此,使用公平锁的众多线程中的一员可能获得多倍的成功机会,这种情况发生在其他活动线程没有被处理并且目前并未持有锁时还要注意的是,未定时的 tryLock 方法并没有使用公平设置。因为即使其他线程正在等待,只要该锁是可用的,此方法就可以获得成功。

   在这篇文章里,我们会按照以下流程来对 ReentrantLock 进行解析:

    1. ReentrantLock 的数据结构(或者说锁结构)
    2. ReentrantLock 加锁的流程
    3. ReentrantLock 解锁的流程
    4. ReentrantLock 的示例 Demo 以及相关源码解析

ReentrantLock 的数据结构

在分析 ReentrantLock 的数据结构之前,我们先来介绍两个名词:

  • CAS (compare and swap):是一个比较交换的操作,先通过 “比较” 确定原有值没有被改动,再通过 “交换” 把原有值更新为新的值。在 Java 里面这是一个原子操作,更多详细介绍可以看我之前写的《AtomicInteger 源码解析》

ReentrantLock源码(一)

标签:ros   unlock   没有   先来   strong   简介   sof   详细介绍   获取   

原文地址:https://www.cnblogs.com/igoodful/p/9547545.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!