JUC并发编程九 并发架构--CAS
compare and set(或者 compare and swap)
原子整数
AtomicBoolean, AtomicInteger, AtomicLong
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.IntUnaryOperator;public class TestAtomic {public static void main(String[] args) {AtomicInteger i = new AtomicInteger(5);// System.out.println(i.incrementAndGet()); // ++i 先自增再获取
// System.out.println(i.getAndIncrement()); // i++ 先获取再自增
//
// i.getAndAdd(10);
// i.addAndGet(5);i.updateAndGet(value -> value * 10);System.out.println(i.get());updateAndGet(i,value->value/2);System.out.println(i.get());}public static void updateAndGet(AtomicInteger i, IntUnaryOperator updateFunction){int value;int next;do{value = i.get();next = updateFunction.applyAsInt(value);}while(!i.compareAndSet(value,next));}
}
原子引用
AtomicReference, AtomicMarkableReference,AtomicStampedReference
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;public class TestAtomicReference {public static void main(String[] args) {DecimalAccount.demo(new DecimalAccountCas(new BigDecimal("10000")));}
}class DecimalAccountCas implements DecimalAccount{private AtomicReference<BigDecimal> balance;public DecimalAccountCas(BigDecimal balance){this.balance = new AtomicReference<>(balance);}@Overridepublic BigDecimal getBalance() {return balance.get();}@Overridepublic void withdraw(BigDecimal amount) {while(true){BigDecimal prev = balance.get();BigDecimal next = prev.subtract(amount);if(balance.compareAndSet(prev,next)){break;}}}
}interface DecimalAccount{// 设置余额BigDecimal getBalance();void withdraw(BigDecimal amount);static void demo(DecimalAccount account){List<Thread> ts = new ArrayList<>();for (int i = 0; i < 1000; i++) {ts.add(new Thread(()->{account.withdraw(BigDecimal.TEN);}));}ts.forEach(Thread::start);ts.forEach(t->{try {t.join();} catch (InterruptedException e) {e.printStackTrace();}});System.out.println(account.getBalance());}
}
JUC并发编程九 并发架构--CAS相关推荐
- JUC并发编程九 并发架构--循环打印
使用wait-notify方式实现循环打印 import lombok.extern.slf4j.Slf4j;@Slf4j(topic = "c.TestCycle") publi ...
- 【檀越剑指大厂--并发编程】并发编程总结
并发编程 一.并发基础 1.什么是并行和并发? 并行,表示两个线程同时(同一时间)做事情. 并发,表示一会做这个事情,一会做另一个事情,存在着调度. 单核 CPU 不可能存在并行(微观上). 2.什么 ...
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- 【Java并发编程】并发编程大合集
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...
- 【转】Java并发编程:并发容器之ConcurrentHashMap
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...
- Java并发编程,无锁CAS与Unsafe类及其并发包Atomic
为什么80%的码农都做不了架构师?>>> 我们曾经详谈过有锁并发的典型代表synchronized关键字,通过该关键字可以控制并发执行过程中有且只有一个线程可以访问共享资源,其 ...
- java并发编程——九 AbstractQueuedSynchronizer AQS详解
文章目录 AbstractQueuedSynchronizer概述 AbstractQueuedSynchronizer的使用 AQS实现分析 同步队列 独占锁的获取与释放 独占式超时获取 共享式锁的 ...
- atomic原子类实现机制_并发编程:并发操作原子类Atomic以及CAS的ABA问题
本文基于JDK1.8 Atomic原子类 原子类是具有原子操作特征的类. 原子类存在于java.util.concurrent.atmic包下. 根据操作的数据类型,原子类可以分为以下几类. 基本类型 ...
- cas内外网同时访问_并发编程高手必知——CAS详解
一.java内存模型:JMM 在内存模型当中定义一个主内存,所有声明的实例变量都存在于主内存当中,主内存的数据会共享给所有线程,每一个线程有一个块工作内存,工作内存当中主内存数据的副本当更新数据时,会 ...
最新文章
- 华科发布报告:41%研究生学霸是单身!
- Java如何转换protobuf-net中的bcl.DateTime对象
- excel实战应用案例100讲(十四)-Excel可直接分析的大数据语义层
- oracle存储过程 --1
- reload端口 tomcat_tomcat上部署网站的三种方式
- ANTLR-语法树遍历机制
- matlab 异步程序代码,正弦波电压源供电时三相异步电动机系统动态运行MATLAB仿真源程序...
- SQLSERVER函数判断当天是星期几
- 第 14 章 SMS
- 前端性能优化--图片懒加载(lazyload image)
- 智能机械按摩椅的改进设计
- 用css制作网站首页
- RS码(Reed-Solomon码)
- 快捷方式查看系统的配置信息 使用dxdiag
- 《数独游戏的设计与实现》
- 为什么Android系统比ios系统卡?
- (42)2021-03-01(物体运动、swiper软件、自执行函数)
- 百择电商:抖音什么情况下会被限流?
- 美的 Dell 国信证券面经整理
- 平均值、标准差、相关系数、回归线及最小二乘法