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、锁以及并发工具相关推荐

  1. 线程池,Volatile,原子性类AtomicInteger,乐观锁悲观锁,并发工具类Hashtable,ConcurrentHashMap类,Semaphore类

      目录 一.线程的状态 二.线程池 1.创建线程池的方式 1.1线程池-Executors默认线程池 1.2线程池-Executors创建指定上限的线程池 1.3线程池-ThreadPoolExec ...

  2. 线程池、volatile、原子性、并发工具类

    目录 线程状态 线程池-基本原理 线程池 - Executors默认线程池 线程池 - ThreadPoolExecutor 线程池参数-拒绝策略 volatile 原子性 原子性 - AtomicI ...

  3. 常用并发工具类(锁和线程间通信工具类)

    常用并发工具类总结 JUC 下的常用并发工具类(锁和线程间通信工具类),主要包括 ReentrantLock.ReentrantReadWriteLock.CountDownLatch.CyclicB ...

  4. 锁与并发工具包与线程池与LockSupport与Fork/Join框架与并行流串行流与阻塞队列与JPS,jstack命令查看死锁查看线程状态与AQS个人笔记九

    朝闻道,夕死可矣 本文共计 86564字,估计阅读时长1小时 点击进入->Thread源码万字逐行解析 文章目录 本文共计 86564字,估计阅读时长1小时 一锁 二Java中13个原子操作类 ...

  5. 多线程-使用大全 基础使用 / 锁 / 线程池 / 原子类 / 并发包 / CAS / AQS (2022版)

    一.多线程描述 1.什么是cpu CPU的中文名称是中央处理器,是进行逻辑运算用的主要由运算器.控制器.寄存器三部分组成, 运算器:从字面意思看就是运算就是起着运算的作用, 控制器:就是负责发出cpu ...

  6. Java并发指南9:AQS共享模式与并发工具类的实现

    一行一行源码分析清楚 AbstractQueuedSynchronizer (三) 转自:https://javadoop.com/post/AbstractQueuedSynchronizer-3 ...

  7. 线程执行完之后会释放吗_java多线程并发:CAS+AQS+HashMap+volatile+ThreadLocal,乐分享...

    CyclicBarrier.CountDownLatch.Semaphore 的用法 CountDownLatch(线程计数器 ) CountDownLatch 类位于 java.util.concu ...

  8. 深入理解并发编程之CAS无锁机制与ABA问题

    深入理解并发编程之CAS无锁机制与ABA问题 文章目录 深入理解并发编程之CAS无锁机制与ABA问题 前言 一.什么是CAS无锁机制 二.CAS原理分析 1.AtomicLong自增分析 2.基于At ...

  9. Java并发工具学习(五)——CAS和final关键字

    文章目录 前言 CAS 什么是CAS 简单的模拟 缺点 final关键字 final修饰变量 普通的类属性 类的静态变量 普通方法中的变量 final修饰方法 final修饰类 不变性 一个面试题 总 ...

  10. 死磕Java并发:J.U.C之并发工具类:Exchanger

    作者:chenssy 来源:Java技术驿站 前面三篇博客分别介绍了CyclicBarrier.CountDownLatch.Semaphore,现在介绍并发工具类中的最后一个Exchange.Exc ...

最新文章

  1. 一个毕业生初入社会的历程 (四)一次简单的面试...
  2. Mysql 索引-1
  3. 设计模式初学者系列-策略模式 -------为什么总是继承
  4. java大作业私人管家系统_重庆管家婆软件丨管家婆工贸PRO的E-MES管理详解
  5. ICCV NAS Workshop 最佳论文提名:通过层级掩码实现高效神经网络架构搜索
  6. 绘制多个折线图_精品图表 | Excel绘制面板折线图
  7. 原生js将数组分割成固定个数一组的小数组
  8. 教你写一个弹幕库,确定不了解一下?
  9. phpwind升级php7,phpwind v8.7 升级教程图文说明
  10. 智慧农业IOT-onenet平台简单介绍
  11. ssm大型分布式商城项目实战视频教程下载java分布式开发教程
  12. ASP.NET设置背景图案
  13. 我喜欢的作品风格: 韩国daksha作品IF YOU GO AWAY…
  14. unity3d学习笔记-报错
  15. 世界上最好的拍照手机,华为拍照的四种功能揭晓,拍出你想拍的
  16. 自动更新Selenium驱动chromedriver
  17. 微服务开放平台接口设计
  18. Android 控件 之 Adapter
  19. 使用Egret粒子编辑器实现烟雾效果
  20. 三星note升级android9,Verizon版三星Note 9正式升级Android 10

热门文章

  1. 基于SSM的在线商城系统(最新)
  2. phalcon index.php,除了Phalcon php中的indexAction之外,无法调用indexController的动作
  3. python语法学习第一天--变量、运算符、数据类型
  4. 还在重复写空指针检查代码?考虑使用 Optional 吧!
  5. MAC中JAVA安装和环境变量设置,java 11
  6. HTML/CSS/js 日期等其他函数 相关收藏
  7. HTTP的请求头 Last-Modified 与 If-Modified-Since 和 If-None-Match 与 ETags
  8. 阿里百川SDK初始化失败 错误码是203
  9. 【MVC】VS常用技巧
  10. Journal of BitcoinJ 从clone开始