本次内容主要介绍AQS、AQS的设计及使用、ReentrantLock、ReentrantReadWriteLock以及手写一个可重入独占锁 1、什么是AQS? AQS,队列同步器AbstractQueuedSynchronizer的简写,JDK1.5引入的,是用来构建锁或者其他同步组件的基础框架, ...
分类:
编程语言 时间:
2020-03-23 09:48:43
阅读次数:
73
1.简介 AbstractQueuedSynchronizer (抽象队列同步器,以下简称 AQS)出现在 JDK 1.5 中,由大师 Doug Lea 所创作。AQS 是很多同步器的基础框架,比如 ReentrantLock、CountDownLatch 和 Semaphore 等都是基于 AQS ...
分类:
其他好文 时间:
2020-03-22 19:22:40
阅读次数:
75
一,谈一谈什么是AQS AQS是一个用来创建锁和同步器的框架,使用AQS能够简单且高效的构造出应用广泛的大量的同步器,比如常用的ReentrantLock,Semaphore‘,其他的诸如ReentrantReadWriteLock,FutureTask等等皆是基于AQS非常轻松容易的构造出符合我们 ...
分类:
其他好文 时间:
2020-03-03 00:35:23
阅读次数:
77
一、AQS概念 队列同步器AQS(AbstractQueuedSynchronizer)是用来构建锁或者其它同步组件的基础框架,使用int成员变量state表示同步状态,通过内部的FIFO双向等待队列来完成线程的排队工作。同步器中的等待队列可以简单的理解为"等待锁的线程队列"。 子类通过继承AQS并 ...
分类:
其他好文 时间:
2020-03-02 23:22:27
阅读次数:
113
AQS介绍 AbstractQueuedSynchronizer简称AQS,即队列同步器。它是JUC包下面的核心组件,它的主要使用方式是继承,子类通过继承AQS,并实现它的抽象方法来管理同步状态,它分为独占锁和共享锁。很多同步组件都是基于它来实现的,比如我门常见的ReentrantLock,它是基于 ...
分类:
其他好文 时间:
2020-02-29 18:57:36
阅读次数:
81
在多线程情景下,如果不会某一共享变量采取一些同步机制,很可能发生数据不安全现象,比如购买车票时,当多个人购买时,不加锁就会产生多人买同一张票的现象,显然这是不可取的。所以要有一种同步机制,在某一时刻只能有一个线程处理该共享变量。 同步器的加锁 我将自己实现的同步器成为RoadAQS. 主要变量如下: ...
分类:
其他好文 时间:
2020-02-27 01:02:39
阅读次数:
97
整个的体系图 悲观锁,乐观锁 是一个广义概念;体现的是看待线程同步的不同角度。 悲观锁 认为在自己使用数据的时候一定有别的线程来修改数据,在获取数据的时候会先加锁,确保数据不被别的线程修改。 实现:关键字synchronized,接口Lock的实现类 适用场景:写操作多,先加锁可以保证写操作时的数据 ...
分类:
编程语言 时间:
2020-02-20 22:14:44
阅读次数:
64
Semaphore也是一个同步器,和前面两篇说的CountDownLatch和CyclicBarrier不同,这是递增的,初始化的时候可以指定一个值,但是不需要知道需要同步的线程个数,只需要在同步的地方调用acquire方法时指定需要同步的线程个数; 一.简单使用 同步两个子线程,只有其中两个子线程 ...
分类:
其他好文 时间:
2020-02-18 13:15:39
阅读次数:
66
AQS是什么 AbstractQueuedSynchronizer抽象同步队列简称AQS,它是实现同步器的基础组件,并发包中锁的底层就是使用AQS实现的。 先看下一下AbstractQueuedSynchronizer的说明文档 通过官方文档可以知道它是用来构建锁或者其他同步组件的基础框架,它使用了 ...
分类:
其他好文 时间:
2020-02-13 22:52:57
阅读次数:
63
CountDownLatch 基于AQS实现的同步器,允许一个或者多个线程通过 方法进入阻塞等待,直到一个或者多个线程执行 完成。 在创建时需要传入一个 值,一旦某个或者多个线程调用了 方法,那么需要等待 值减为0,才能继续执行。 方法每执行一次,count(state)值减1,直到减为0。一个线程 ...
分类:
其他好文 时间:
2020-02-01 12:17:53
阅读次数:
67