AbstractQueueSynchronizer

1.AbstractQueuedSynchronizer(以下简称AQS)是Java并发包提供的一个同步基础机制,是并发包中实现Lock和其他同步机制(如:Semaphore、CountDownLatch和FutureTask等)的基础。

2.AQS内部包含一个FIFO的同步等待队列,简单的说,没有成功获取控制权的线程会在这个队列中等待。

3.AQS内部管理了一个原子的int域作为内部状态信息,并提供了一些方法来访问该域,基于AQS实现的同步机制可以按自己的需要来灵活使用这个int域, 比如:ReentrantLock用它记录锁重入次数;CountDownLatch用它表示内部的count;FutureTask用它表示任务运行状 态(Running,Ran和Cancelled);Semaphore用它表示许可数量。

4.AQS提供了独占和共享两种模式。在独占模式下,当一个线程获取了AQS的控制权,其他线程获取控制权的操作就会失败;但在共享模式下,其他线程 的获取控制权操作就可能成功。并发包中的同步机制如ReentrantLock就是典型的独占模式,Semaphore是共享模式;也有同时使用两种模式 的同步机制,如ReentrantReadWriteLock。  AQS内部提供了一个ConditionObject类来支持独占模式下的(锁)条件,这个条件的功能与Object的wait和notify/notifyAll的功能类似,但更加明确和易用。

状态位+队列

ReentrantLock

1.与Synchronized相比较而言,ReentrantLock有以下优势:支持公平/非公平锁、支持可中断的锁、支持非阻塞的tryLock(可超时)、支持锁条件、可跨代码块使用(一个地方加锁,另一个地方解锁),总之比Synchronized更加灵活

ReentrantReadWriteLock

  • ReentrantReadWriteLock提供了读写锁的机制,读锁使用AQS的共享模式,写锁使用独占模式。
  • ReentrantReadWriteLock也支持公平/非公平锁。
  • ReentrantReadWriteLock的写锁会阻塞读锁和写锁,读锁只会阻塞写锁。
  • ReentrantReadWriteLock的写锁可以降级为读锁,但读锁不能升级为写锁。

CountDownLatch

  • CountDownLatch称为闭锁。可以让一个或多个线程等待另外一个或多个线程执行完毕后再执行。
  • CountDownLatch也是基于AQS构建,使用共享模式。

  

Semaphore

   是一种基于计数的信号量,管理了一组许可。线程可以申请许可,当信号量中有许可时,线程申请成功,拿走一个许可;没有许可时, 线程阻塞等待其他线程用完了许可,归还给信号量。这个许可不是真正的许可(比如凭证),只是一个计数,线程也不会真正使用这些许可。

  • Semaphore一般用来构建一些对象池,资源池之类的,比如数据库连接池。
  • 可以创建一个count为1的Semaphore作为一种类似互斥锁的机制,也叫二元信号量,表示两种互斥状态。但和Lock有些区别,Lock只能又获取锁的线程来释放锁,而Semaphore允许其他线程来做释放动作。
  • Semaphore也支持公平和非公平策略。

ArrayBlockingQueue

  • ArrayBlockingQueue是一种基于数组实现的有界的阻塞队列。队列中的元素遵循先入先出(FIFO)的规则。新元素插入到队列的尾部,从队列头部取出元素。
  • 和普通队列有所不同,该队列支持阻塞操作。比如从空队列中取元素,会导致当前线程阻塞,直到其他线程将元素放入队列;将元素插入已经满的队列,同样会导致当前线程阻塞,直到其他线程从队列中取出元素。
  • ArrayBlockingQueue也支持公平和非公平策略(针对队列中元素的存取线程,也可认为是元素的生产者和消费者)。

不能为null insert extract

时间: 2024-10-04 04:08:23

AbstractQueueSynchronizer的相关文章

队列同步器AbstractQueueSynchronizer

同步器是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作. 同步器主要使用的方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态.子类推荐被定义为自定义同步组件的静态内部类,同步器本身没有实现任何同步接口,仅仅是定义了若干同步状态获取和释放的方法来供自定义同步组件使用. 同步器的设计是基于模版方法模式的,即使用者需要继承同步器并重写指定的方法.同步器支持独占式获取同步状态和共享式获取同步状态 Java.co

Java基础】并发 - 多线程

Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java 目录(?)[+] 介绍 Java多线程 多线程任务执行 大多数并发应用程序时围绕执行任务(task)进行管理的:所谓任务就是抽象的,离散的工作单元. 围绕执行任务来管理应用程序时,第一步是要指明一个清晰的任务边界.大多数应用服务器程序都选择了下面这个自然的任务辩解:单独的客户请求: 任务时逻辑上的单元: 任务 Runnable 表示一个任务单元(java.lang)

JDK之ReentrantLock,AbstractQueuedSynchronizer源码分析

ReentrantLock默认使用非公平锁 public ReentrantLock() { sync = new NonfairSync(); } 所谓公平锁就是先阻塞的程序先获得锁.非公平锁则有操作系统的调度系统来调度. NonfairSync就是一个同步器 final static class NonfairSync extends Sync { private static final long serialVersionUID = 7316153563782823691L; /** *

第一章 Java常用的并发类

注:本系列博客主要参考于<分布式Java应用:基础与实践>,林昊 著 1.常用的并发集合类 ConcurrentHashMap:线程安全的HashMap的实现 CopyOnWriteArrayList:线程安全且在读操作时无锁的ArrayList CopyOnWriteArraySet:基于CopyOnWriteArrayList,不添加重复元素 ArrayBlockingQueue:基于数组.先进先出.线程安全,可实现指定时间的阻塞读写,并且容量可以限制 LinkedBlockingQueu

java并发编程知识要点总结

java并发编程 一.关于并发 并发是什么? 并发是指在同一时间间隔内,有多个程序处于运行状态.当然,同一时刻只有一个程序在运行.与之对应的是并行,并行是指同一时刻有多个程序同时执行(宏观上) 为什么需要并发? 为了提高系统的资源利用率 和 吞吐量.就好比全班需要填表时,可以发给每个人,然后填完之后在收起来,这样的效率远比一个一个的发,然后等第一个人填完了再发给第二人填写要快的多 什么是线程安全? 线程作为独立调用的单位,当使用线程实现并发时,由于处理机的调度,可能存在线程安全问题.那什么是线程

《Java并发编程的艺术》--Java中的锁

No1: Lock接口 Lock lock = new ReentrantLock(); lock.lock(); try{ }finally{ lock.unlock(); } No2: 不要讲获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故释放 No3: No4: 队列同步器(同步器)是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,并发包的作者期望它能

队列同步器

队列同步器AbstractQueueSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础. 同步器是实现锁(也可以是任意同步组件)的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义.可以这样理解二者之间的关系:锁是面向使用者的,它定义了使用者与锁交互的接口(比如可以允许两个线程并行访问),隐藏了实现细

java 线程池(1)

ThreadPoolExecutor概述 ThreadPoolExecutor 下文简称 TPE ,我们使用它都是从Executror 这个类中的方法 : 1 public static ExecutorService newFixedThreadPool(int nThreads) { 2 return new ThreadPoolExecutor(nThreads, nThreads, 3 0L, TimeUnit.MILLISECONDS, 4 new LinkedBlockingQueu

聊聊我的知识体系

不知不觉树义已经工作 5 年了,一路走来磕磕碰碰但总算有了自己的一点小体会.对于一个 Java 开发人员来说,到了 5 年的关键节点,需要掌握哪些知识点呢?经过我自己的总结,我列出了下面的思维导图. 从上面的图片我们可以看出大致分为三个部分:JDK 源码.JVM 原理.框架源码. JDK源码 JDK 源码是一切的基础,许多框架都参考了 JDK 源码的实现思路,因此弄懂 JDK 源码是一件非常重要的事情.而 JDK 源码又可以分为下面 4 大块: 集合源码 并发集合源码 并发包源码 阻塞队列源码