ReentranceLock 和 Semaphore有很多共同点,他们都像是一个gate一样, 来控制让哪些线程阻塞,让哪些线程通过. 不同的是,ReentranceLock允许通过的量是1,Semaphore允许多个线程通过, 所以在这个角度看,ReentranceLock和Semaphore是可以相互实现的. 另外他们还提供了公平或非公平的竞争,超时等等特性

他们都是由AQS作为基类来实现的.AQS  is  a  framework  for  building  locks  and  synchronizers,  and  a  surprisingly  broad  range  of
synchronizers can be built easily and efficiently using it. Not only are  ReentrantLock  and  Semaphore  built using AQS,
but so are  CountDownLatch ,  ReentrantReadWriteLock ,  SynchronousQueue , [12]  and  FutureTask .

使用AQS而不是其他的锁或同步器来实现新的锁, 因为AQS提供了很多好处: 1.省去了很多精力 2.我们在使用别的同步器的来实现新的同步器的时候,很可能为了获取一次锁而实际产生多次获取锁的操作,而造成了额外的线程切换. 比如,我们在锁的内部使用了wait,这种情况下,为了一次获取锁,实际进行了俩次锁的获取操作.而如果使用AQS的话,只会有一次获取锁的操作, AQS就是为了更好的扩展性才设计的

Synchronizer解析(为AQS打个铺垫)的更多相关文章

  1. Java高级:条件队列与同步器Synchronizer的原理+AQS的应用

    14.构建自定义的同步工具 类库中包含了许多存在状态依赖性的类,例如FutureTask,Semaphore和BlockingQueue等.在这些类中的一些操作中有着基于状态的前提条件,例如,不能从一 ...

  2. 源码解析之AQS源码解析

    要理解Lock首先要理解AQS,而要理解并发类最好的方法是先理解其并发控制量不同值的含义以及该类运作流程,然后配合一步步看源码.该类有一个重要的控制量是WaitStates,节点的状态值. /** w ...

  3. 【JUC源码解析】AQS

    简介 AQS,也即AbstractQueuedSynchronizer,抽象队列同步器,提供了一个框架,可以依赖它实现阻塞锁和相关同步器.有两种类型,独占式(Exclusive)和共享式(Share) ...

  4. AQS学习(二) AQS互斥模式与ReenterLock可重入锁原理解析

    1. MyAQS介绍    在这个系列博客中,我们会参考着jdk的AbstractQueuedLongSynchronizer,从零开始自己动手实现一个AQS(MyAQS).通过模仿,自己造轮子来学习 ...

  5. 4.从AbstractQueuedSynchronizer(AQS)说起(3)——AQS结语

    前两节的内容<2.从AbstractQueuedSynchronizer(AQS)说起(1)——独占模式的锁获取与释放> .<3.从AbstractQueuedSynchronize ...

  6. gulp源码解析(一)—— Stream详解

    作为前端,我们常常会和 Stream 有着频繁的接触.比如使用 gulp 对项目进行构建的时候,我们会使用 gulp.src 接口将匹配到的文件转为 stream(流)的形式,再通过 .pipe() ...

  7. 并发系列3:Lock锁以及核心类AQS

    Java Lock类提供了语言级别的Synchronized,Lock与Condition配合与Synchronized配合object一样实现了等待/通知机制.但它提供了更高的灵活性,有:1尝试非阻 ...

  8. Java并发编程3-抽象同步队列AQS详解

    AQS是AtractQueuedSynchronizer(队列同步器)的简写,是用来构建锁或其他同步组件的基础框架.主要通过一个int类型的state来表示同步状态,内部有一个FIFO的同步队列来实现 ...

  9. java并发编程实战:第十四章----构建自定义的同步工具

    一.状态依赖性管理 对于单线程程序,某个条件为假,那么这个条件将永远无法成真 在并发程序中,基于状态的条件可能会由于其他线程的操作而改变 可阻塞的状态依赖操作的结构 acquire lock on o ...

随机推荐

  1. 不同复制模式下,如何忽略某些binlog事件

    在MySQL复制中,如果slave节点上遇到错误,比如数据不存在或者主键冲突等错误时,想要忽略这些错误,可以采用以下几种方法: 1.未启用GTID模式时 只需通过设定 SQL_SLAVE_SKIP_C ...

  2. C# 实现快速闪电关机、快速重启

    using System; using System.Runtime.InteropServices; namespace FastReboot { static class Program { pr ...

  3. unittest框架出报告乱码的问题解决

    跟着上面的步骤修改好后,unittest断言写法要写成下面这样才能展示非乱码

  4. zabbix触发器函数 count

    转摘至梅总文章 一直没用过这个函数,今天研究了下,确实很有用(用过的忽略): 之前很多功能都是用max,min,avg曲线实现的,其实用count最合理(如典典刚用的高防持续N次ping超时).   ...

  5. Java之POI的excel导入导出

    一.Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件.这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Offic ...

  6. 配置spring的log4j日志记录

    1.导入依赖包pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http: ...

  7. 0908期 HTML Frameset框架和选择器

    frameset框架 frameset与body没法同时使用,frameset用来分割页面,frame在frameset用于引用其他网页 <frameset rows="100,*&q ...

  8. springboot 邮件服务

    springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...

  9. java的方法传参,最容易混淆的问题!!!

    参数传递 参数传递,可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了.这种传递方式,我们称为参数传递. 在这里 ...

  10. 控制 TextBox 的滚动条

    利用 EM_LINESCROLL 信息控制 TextBox 的卷动. 在含有卷动轴的 TextBox 中, 如何以程序控制 TextBox 的卷动? 传送 EM_LINESCROLL 信息给 Text ...