36.基于CAS实现的java类

JUC, java.util.concurrent并发工具包下。

1.原子整数

AtomicInteger

AtomicLong

AtomicBoolean

底层用的CAS来实现。

AtomicInteger类的incrementAndGet方法,addAndGet方法

public static void main(String[] args) {AtomicInteger atomicInteger = new AtomicInteger();int i = atomicInteger.incrementAndGet(); //i++log.info("i=={}", i);//这里返回的是1,但是atomicInteger中的值已经变成2了int j = atomicInteger.getAndIncrement();//++ilog.info("j=={}", j);log.info("value=={}", atomicInteger.get());//先返回原来的值int andAdd = atomicInteger.getAndAdd(2);log.info("andAdd={}", andAdd);//返回加运算之后的值int i1 = atomicInteger.addAndGet(3);log.info("i1=={}", i1);}
int andAdd = atomicInteger.getAndAdd(-1 * 2); //减法

 AtomicInteger类的updateAndGet方法的原理分析:

public final int updateAndGet(IntUnaryOperator updateFunction) {int prev, next;do {prev = get();next = updateFunction.applyAsInt(prev);} while (!compareAndSet(prev, next));return next;
}

IntUnaryOperator这个接口中定义了方法 int applyAsInt(int prev),所以调用者只需要传入applyAsInt方法的实现逻辑即可。

AtomicInteger atomicInteger = new AtomicInteger(5);
//**乘法
int i2 = atomicInteger.updateAndGet(e -> e * 10);
log.info("i2=={}", i2);

2.原子引用类型

 AtomicReference

AtomicMarkableReference

AtomicStampedReference

public class AccountDemo {public static void main(String[] args) {BigdecimalAccountCAS bigdecimalAccountCAS = new BigdecimalAccountCAS(new BigDecimal("10000"));BigDecimalAccount.demo(bigdecimalAccountCAS);}
}class BigdecimalAccountCAS implements BigDecimalAccount{private AtomicReference<BigDecimal> balance;public BigdecimalAccountCAS (BigDecimal balance) {this.balance = new AtomicReference<>(balance);}@Overridepublic BigDecimal getBalance() {return this.balance.get();}@Overridepublic void withDraw(BigDecimal amont) {while(true) {BigDecimal prev = balance.get();BigDecimal subtract = prev.subtract(amont);if (balance.compareAndSet(prev, subtract)) {break;}}
//        this.balance.updateAndGet(e -> e.subtract(amont));}
}interface BigDecimalAccount {//获取余额BigDecimal getBalance();//取款void withDraw(BigDecimal amont);static void demo(BigDecimalAccount account) {//定义一个线程集合List<Thread> ts = new ArrayList<>();long start = System.nanoTime();//创建一千个线程,每个线程取出10元for (int i = 0; i < 1000; i++) {ts.add(new Thread(() -> account.withDraw(BigDecimal.TEN)));}//启动每一个线程ts.forEach( e -> e.start());//等所有线程执行完毕ts.forEach( e -> {try {e.join();} catch (InterruptedException e1) {e1.printStackTrace();}});long duration = System.nanoTime() - start;System.out.println("花费时长:"+duration);System.out.println("余额:"+ account.getBalance());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/594086.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macU盘在电脑上读不出来 u盘mac读不出来怎么办 macu盘不能写入

对于Mac用户来说&#xff0c;使用U盘是很常见的操作&#xff0c;但有时候可能会遇到Mac电脑无法读取U盘的情况&#xff0c;这时候就需要使用一些特定的工具软件来帮助我们解决问题。本文就来告诉大家macU盘在电脑上读不出来是怎么回事&#xff0c;u盘mac读不出来怎么办。 一、m…

LABVIEW--正弦+高斯噪声信号及滤波

前面板信号 后面板 LABVIEW源程序链接&#xff1a;https://pan.baidu.com/s/11B-75i4fHZwWQyjxn9yCyQ?pwd7tfj 提取码&#xff1a;7tfj

能源照明运作机制与智能调控技术实现途径

随着城市化进程的加速&#xff0c;智慧城市已成为现代城市发展的重要方向。能源照明作为城市基础设施的重要组成部分&#xff0c;其运作机制与智能调控技术的实现对于提高城市能源利用效率、促进可持续发展具有重要意义。 能源照明是一个涵盖广泛、错综复杂的领域&#xff0c;它…

【C++】哈希思想的应用(位图、布隆过滤器)及海量数据处理方法

文章目录 前言位图什么是位图简单实现一个自己的位图位图的应用场景 布隆过滤器位图的缺陷及布隆过滤器的提出布隆过滤器的概念简单实现一个自己的布隆过滤器布隆过滤器的优缺点布隆过滤器的应用场景 海量数据处理 前言 哈希思想的在实际中的应用除了哈希表这个数据结构之外还…

NIO基础知识

在学习Netty之前先要学习一下NIO相关的知识&#xff0c;因为Netty是基于NIO搭建的一套网络编程框架。 一. NIO 基础 non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从…

蓝桥杯 - 穿越雷区

解题思路&#xff1a; dfs 方法一&#xff1a; import java.util.Scanner;public class Main {static char[][] a;static int[][] visited;static int[] dx { 0, 1, 0, -1 };static int[] dy { 1, 0, -1, 0 };static long min Long.MAX_VALUE;static long count 0;publi…

Java异常入门

目录 前言 异常 什么是异常 异常&#xff08;Exception&#xff09;和错误&#xff08;Error&#xff09; 异常的处理 异常的作用 前言 我们用一个简单情形引入异常&#xff1a; class Devide{public int divide(int a ,int b ){return a / b ;} }public class Main{pu…

myql join连接 全部

学习了mysql 连接查询和子查询&#xff0c;把连接查询的所有情况&#xff0c;做一个介绍。 1&#xff0c;数据&#xff1a; 部门数据&#xff1a; DROP TABLE IF EXISTS department; CREATE TABLE department (id int(11) NOT NULL AUTO_INCREMENT,deptName varchar(30) DEFAU…

【资源分享】-免费-的论文查重软件-论文照妖镜下载-使用教程

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

Python输出不了中文怎么解决

在文件头加上#encoding&#xff1a;utf-8即可。 # encoding: utf-8 print helloworld print u"学习" print (unicode("学习", encoding"utf-8")) shell输出&#xff1a; helloworld 学习 学习 还可以用#-*- coding: UTF-8 -*- 来指定。

C++--对象作为返回值-----拷贝构造函数不执行的问题解决方案

1.问题现象 本来func函数返回p1&#xff0c;实际上p1会先拷贝一份传递给test函数里面的p,这个时候会执行拷贝构造函数&#xff0c;但是实际上的输出并没有&#xff1b; 而且执行拷贝构造函数的时候&#xff0c;因为生成p1的副本&#xff0c;所以我们打印的地址应该不相同&…

数码管与译码器

目录 数码管 显示的基本原理 LED数码管的显示方式 静态显示方式 动态显示方式 具体案例 数码管静态显示 电路图 keil文件 数码管动态显示 电路图 keil文件 74LS138译码器 简介 译码表 译码器案例 电路图 keil文件 74HC595译码器 前言 举例解释 简单案例 …