CAS、AQS、锁以及并发工具
1. CAS原理
中文名叫比较交换---Compare And Swap
CAS(V,E,N)
V表示要更新的值;
E表示预期值;
N表示新值。
比较原则:当V和E相等时,才把N赋值给V;如果V和E不相等时,放弃当前修改。
1.1 如何保证原子性
基于硬件的汇编指令实现原子性,使用CPU指令保证原子性;
// Unsafe 后门类,用于直接操作内存中的数据
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;static {try {valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }
}private volatile int value;/*** CAS实现*/
public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}/*** 使用自旋的方式保证线程安全*/
public final int getAndUpdate(IntUnaryOperator updateFunction) {int prev, next;do {prev = get();next = updateFunction.applyAsInt(prev);} while (!compareAndSet(prev, next));return prev;
}
1.2 CAS的缺点
循环时间太长
有些类限制了自旋的次数
只能保证一个共享变量的原子操作
ABA问题
如果一个值原来是A,变成了B,然后又变成了A,那么在CAS检查的时候会发现没有改变,但是实质上它已经发生了改变,这就是所谓的ABA问题。
使用类AtomicStampedReference来解决ABA问题。
如果当前引用 == 预期值,并且当前标志值 == 预期标志值,则就将当前引用和当前标志值赋值为更新值。
/*** CAS实现** @param expectedReference 引用的预期值* @param newReference 引用的新值* @param expectedStamp 标志的预期值* @param newStamp 标志的新值*/public boolean compareAndSet(V expectedReference,V newReference,int expectedStamp,int newStamp) {Pair<V> current = pair;returnexpectedReference == current.reference &&expectedStamp == current.stamp &&((newReference == current.reference &&newStamp == current.stamp) ||casPair(current, Pair.of(newReference, newStamp)));}
2. AQS原理
AQS----AbstractQueuedSynchronizer的缩写
子类定义为非公共内部帮助器类(私有的内部类继承AQS);写锁的时候的一个帮助器,提供获取锁和是释放锁的功能模板。
acquire(int arg) 以独占模式获取对象,忽略中断。
acquireShared(int arg) 以共享模式获取对象,忽略中断。
tryAcquire(arg) 试图在独占模式下获取对象状态。
tryAcquireShared(int arg) 试图在共享模式下获取对象状态
release(int arg) 以独占模式释放对象。
releaseShared(int arg) 以共享模式释放对象
3. 自定义锁
4. 并发工具类
4.1 CountDownLatch(查询航班)
/*** 新建一个latch为3的锁计数器*/
CountDownLatch latch = new CountDownLatch(3);
/*** 减少计数,直到计数为0,则释放所有线程*/
latch.countDown();
/*** 导致当前线程等待,直到计数器为0时。*/
latch.await();
4.2 CyclieBarries
CyclicBarrier barrier=new CyclicBarrier(8);/*** 在所有参与者都调用 `await` 方法之前,所有线程一直等待。*/
barrier.await();
4.3 Semaphore
是一个计数信号量。
/*** 创建Semaphore*/
Semaphore sp=new Semaphore(5);
/*** 从信号量获取一个许可,如果许可不够,会一直将线程阻塞,否则中断线程。*/
sp.acquire();
/*** 释放一个许可,将其返回给信号量。*/
sp.release();
转载于:https://www.cnblogs.com/zhangqirong/p/11489398.html
CAS、AQS、锁以及并发工具相关推荐
- 线程池,Volatile,原子性类AtomicInteger,乐观锁悲观锁,并发工具类Hashtable,ConcurrentHashMap类,Semaphore类
目录 一.线程的状态 二.线程池 1.创建线程池的方式 1.1线程池-Executors默认线程池 1.2线程池-Executors创建指定上限的线程池 1.3线程池-ThreadPoolExec ...
- 线程池、volatile、原子性、并发工具类
目录 线程状态 线程池-基本原理 线程池 - Executors默认线程池 线程池 - ThreadPoolExecutor 线程池参数-拒绝策略 volatile 原子性 原子性 - AtomicI ...
- 常用并发工具类(锁和线程间通信工具类)
常用并发工具类总结 JUC 下的常用并发工具类(锁和线程间通信工具类),主要包括 ReentrantLock.ReentrantReadWriteLock.CountDownLatch.CyclicB ...
- 锁与并发工具包与线程池与LockSupport与Fork/Join框架与并行流串行流与阻塞队列与JPS,jstack命令查看死锁查看线程状态与AQS个人笔记九
朝闻道,夕死可矣 本文共计 86564字,估计阅读时长1小时 点击进入->Thread源码万字逐行解析 文章目录 本文共计 86564字,估计阅读时长1小时 一锁 二Java中13个原子操作类 ...
- 多线程-使用大全 基础使用 / 锁 / 线程池 / 原子类 / 并发包 / CAS / AQS (2022版)
一.多线程描述 1.什么是cpu CPU的中文名称是中央处理器,是进行逻辑运算用的主要由运算器.控制器.寄存器三部分组成, 运算器:从字面意思看就是运算就是起着运算的作用, 控制器:就是负责发出cpu ...
- Java并发指南9:AQS共享模式与并发工具类的实现
一行一行源码分析清楚 AbstractQueuedSynchronizer (三) 转自:https://javadoop.com/post/AbstractQueuedSynchronizer-3 ...
- 线程执行完之后会释放吗_java多线程并发:CAS+AQS+HashMap+volatile+ThreadLocal,乐分享...
CyclicBarrier.CountDownLatch.Semaphore 的用法 CountDownLatch(线程计数器 ) CountDownLatch 类位于 java.util.concu ...
- 深入理解并发编程之CAS无锁机制与ABA问题
深入理解并发编程之CAS无锁机制与ABA问题 文章目录 深入理解并发编程之CAS无锁机制与ABA问题 前言 一.什么是CAS无锁机制 二.CAS原理分析 1.AtomicLong自增分析 2.基于At ...
- Java并发工具学习(五)——CAS和final关键字
文章目录 前言 CAS 什么是CAS 简单的模拟 缺点 final关键字 final修饰变量 普通的类属性 类的静态变量 普通方法中的变量 final修饰方法 final修饰类 不变性 一个面试题 总 ...
- 死磕Java并发:J.U.C之并发工具类:Exchanger
作者:chenssy 来源:Java技术驿站 前面三篇博客分别介绍了CyclicBarrier.CountDownLatch.Semaphore,现在介绍并发工具类中的最后一个Exchange.Exc ...
最新文章
- 一个毕业生初入社会的历程 (四)一次简单的面试...
- Mysql 索引-1
- 设计模式初学者系列-策略模式 -------为什么总是继承
- java大作业私人管家系统_重庆管家婆软件丨管家婆工贸PRO的E-MES管理详解
- ICCV NAS Workshop 最佳论文提名:通过层级掩码实现高效神经网络架构搜索
- 绘制多个折线图_精品图表 | Excel绘制面板折线图
- 原生js将数组分割成固定个数一组的小数组
- 教你写一个弹幕库,确定不了解一下?
- phpwind升级php7,phpwind v8.7 升级教程图文说明
- 智慧农业IOT-onenet平台简单介绍
- ssm大型分布式商城项目实战视频教程下载java分布式开发教程
- ASP.NET设置背景图案
- 我喜欢的作品风格: 韩国daksha作品IF YOU GO AWAY…
- unity3d学习笔记-报错
- 世界上最好的拍照手机,华为拍照的四种功能揭晓,拍出你想拍的
- 自动更新Selenium驱动chromedriver
- 微服务开放平台接口设计
- Android 控件 之 Adapter
- 使用Egret粒子编辑器实现烟雾效果
- 三星note升级android9,Verizon版三星Note 9正式升级Android 10
热门文章
- 基于SSM的在线商城系统(最新)
- phalcon index.php,除了Phalcon php中的indexAction之外,无法调用indexController的动作
- python语法学习第一天--变量、运算符、数据类型
- 还在重复写空指针检查代码?考虑使用 Optional 吧!
- MAC中JAVA安装和环境变量设置,java 11
- HTML/CSS/js 日期等其他函数 相关收藏
- HTTP的请求头 Last-Modified 与 If-Modified-Since 和 If-None-Match 与 ETags
- 阿里百川SDK初始化失败 错误码是203
- 【MVC】VS常用技巧
- Journal of BitcoinJ 从clone开始