在开发当中需要经常用到synchronized保证代码线程安全,在竞争条件下会阻塞等待资源,如果允许竞争不到资源返回失败,就可以使用cas减少阻塞时间。先来看一个cas的单例模式。

public class NonBlock {private static volatile NonBlock nonBlock;private static AtomicBoolean atomicBoolean = new AtomicBoolean(false);public static NonBlock getInstance() {if (nonBlock == null) {if (atomicBoolean.compareAndSet(false, true)) {nonBlock = new NonBlock();}}return nonBlock;}
}

在这个单例模式中,不同于synchronized的阻塞,多线程环境下,getInstance确保只会创建一个对象的情况下,可能返回的nonBlock是一个空对象。但,如果允许返回空对象的情况下,

 public class RedPacket {private long balance;private int num;public RedPacket(long balance, int num) {this.balance = balance;this.num = num;}public long get() {if (balance < 1 || num < 1) {return -1;}if (num == 1) {long result = balance;balance = 0;num--;return result;}long average = balance / num;long result = ThreadLocalRandom.current().nextLong(1, average * 2);balance -= result;num--;return result;}

我们还可以使用cas达到非阻塞的目的,这样能保证线程安全,出现竞争情况就提示抢失败,确点就是提示抢失败还可能余额大于0,先来不一定能抢到,后来人还能抢。

public class RedPacket {private long balance;private AtomicInteger num;public RedPacket(long balance, int num) {this.balance = balance;this.num = new AtomicInteger(num);}public long get() {int number = num.get();long balan = balance;if (balan < 1 || number < 1) {return -1;}if (num.compareAndSet(number, number - 1)) {if (number - 1 == 0) {balance = 0;return balan;}long average = balan / number;long result = ThreadLocalRandom.current().nextLong(1, average * 2);balance -= result;}return -1;}}

使用CAS代替synchronized相关推荐

  1. java基础-CAS、synchronized和AQS的理解

    乐观锁与悲观锁的区别? 悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程 ...

  2. java让线程空转_Java锁:悲观/乐观/阻塞/自旋/公平锁/闭锁,锁消除CAS及synchronized的三种锁级别...

    JAVA LOCK 大全 [TOC] 一.广义分类:乐观锁/悲观锁 1.1 乐观锁的实现CAS (Compare and Swap) 乐观锁适合低并发的情况,在高并发的情况下由于自旋,性能甚至可能悲观 ...

  3. 【Java】什么是CAS、synchronized升级概述、偏向锁/轻量级锁详解 - 笔记

    引入 CAS lock cmpxchg在硬件层面实现:在操作过程中不允许被其他CPU打断,避免CAS在写数据的时候被其他线程打断,相比操作系统级别的锁,效率要高很多. 加锁才能让多线程的访问变为序列化 ...

  4. CAS和Synchronized知识

    一. CAS 何为CAS. CAS(Compare And Swap )是乐观锁的一种实现方式,是一种轻量级锁.JAVA1.5开始引入了CAS,JUC下很多工具类都是基于CAS. CAS的实现方式 C ...

  5. 锁,CAS,Synchronized 原理

    作者:~小明学编程 文章专栏:JavaEE 格言:热爱编程的,终将被编程所厚爱. 目录 常见的锁 悲观锁与乐观锁 悲观锁 乐观锁 读写锁 重量级锁 vs 轻量级锁 挂起等待锁和自旋锁 公平锁和非公平锁 ...

  6. 锁策略、CAS、synchronized原理

    1.常见的锁策略 (1)乐观锁 和 悲观锁 乐观锁:预测锁竞争的情况不激烈(工作量较少) 悲观锁:预测锁竞争的情况很激烈(工作量较多) (2)轻量级锁 和 重量级锁 轻量级锁:加锁和解锁的开销较小,效 ...

  7. CAS(比较并交换)学习CAS实现原子性+volatile实现可见性,cas与synchronized比较的优缺点

    1.CAS底层原理? 自旋锁(cas思想)+unsafe类,保证原子性靠的是unsafe类 1.首先可以看到: atomicInteger.getAndIncrement(); getAndIncre ...

  8. Java并发(4)- synchronized与CAS

    引言 上一篇文章中我们说过,volatile通过lock指令保证了可见性.有序性以及"部分"原子性.但在大部分并发问题中,都需要保证操作的原子性,volatile并不具有该功能,这 ...

  9. CAS、volatile、synchronized

    进程 操作系统资源分配的基本单位.分配内存.网络等. 线程 操作系统.CPU执行的基本单位 CAS CAS定义 CAS Compare And Swap 比较并交换 (自旋锁.无锁).不需要加锁能保证 ...

最新文章

  1. 去重仅保留一条_清水出芙蓉,天然去雕饰,牛仔背带裤配针织上衣的清纯温柔穿搭...
  2. python跳出双层for循环的解决方法
  3. maven 编译mybatis项目时xml文件无法编译到target目录下的解决方法
  4. CPA相关功耗分析(二)
  5. 天池读书会六月场来啦,零基础也能听的懂的编程分享!
  6. scrollView的几个属性contentSize contentOffset contentInset
  7. smartdns使用指南_Windows10 玩SmartDNS告别污染
  8. 存根类 测试代码 java_有关为旧版代码创建存根的更多信息–测试技术7
  9. stylus之选择器(Selectors)
  10. java 打印 模板_Java输入输出模板
  11. 真格量化——做空波动率策略
  12. 动态载入树 (ASP+数据库)
  13. 移动端实时3D目标检测,谷歌开源出品,安卓下载就能用
  14. mate40升级鸿蒙系统教程,mate40鸿蒙系统怎么升级 教程如下
  15. 虚拟主机网站搬到服务器上,如何把网页文件放到云虚拟主机
  16. 微信公众号推送封面尺寸
  17. Python数据库同步神器(一键同步)
  18. python 列表写入excel_python怎么读取和写入excel表格
  19. CSS基础五(盒模型)
  20. ps图层锁定后如何解锁

热门文章

  1. timer purge_Java Timer purge()方法与示例
  2. java 集合addall_Java集合的addAll()方法和示例
  3. kadane算法_使用KADANE的算法求最大子阵列和
  4. sonar扫描普通JAVA执行,SonarQube扫描源代码的方法
  5. oracle sys连接不上,oracle – 为什么我不能在SYS拥有的对象上创建触发器?
  6. java nextlong_Java Random nextLong()方法与示例
  7. Java LinkedHashMap forEach()方法与示例
  8. scala 函数中嵌套函数_如何在Scala中将函数转换为部分函数?
  9. nodejs Error: request entity too large解决方案
  10. Python禁止最大化按钮和禁止拉伸窗口大小