JDK提供的原子类原理与使用
原子更新基本类型
原子更新数组
原子更新抽象类型
原子更新字段
原子更新基本类型:
package com.roocon.thread.t8; import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicIntegerArray; public class Sequence { private AtomicInteger value = new AtomicInteger(0); private int [] s = {2,1,4,6}; AtomicIntegerArray a = new AtomicIntegerArray(s); public int getNext(){ a.getAndIncrement(2);//给下标为2的元素加1 a.getAndAdd(2, 10);//获取下标为2的元素,并且加10 for (int i=0; i < a.length(); i++){ System.out.println(a.get(i)); } return value.getAndIncrement(); } public static void main(String[] args) { Sequence sequence = new Sequence(); new Thread(new Runnable() { @Override public void run() { while (true){ System.out.println(Thread.currentThread().getName()+" "+sequence.getNext()); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true){ System.out.println(Thread.currentThread().getName()+" "+sequence.getNext()); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true){ System.out.println(Thread.currentThread().getName()+" "+sequence.getNext()); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); }}
运行结果:
Thread-0 0 Thread-1 1 Thread-2 2 Thread-0 3 Thread-1 4 Thread-2 5 ...
package com.roocon.thread.t8;import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicIntegerArray; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.atomic.AtomicReference;public class Sequence {private AtomicInteger value = new AtomicInteger(0);AtomicReference<User> user = new AtomicReference<>(); //对user的set和get执行原子操作AtomicIntegerFieldUpdater<User> old = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");public int getNext(){User user = new User();System.out.println(old.getAndIncrement(user));System.out.println(old.getAndIncrement(user));System.out.println(old.getAndIncrement(user));return value.getAndIncrement();}public static void main(String[] args) {Sequence sequence = new Sequence();new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}).start();} }
运行结果:
0 1 2 Thread-0 0
对CAS的源码理解:--初步理解
在AtomicInteger中有这样一段源码:
public final int getAndUpdate(IntUnaryOperator updateFunction) {int prev, next;do {prev = get();next = updateFunction.applyAsInt(prev);} while (!compareAndSet(prev, next));return prev;}
public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}
其中,compareAndSwap就是CAS的缩写。如果prev和next不相等,则返回true。否则,返回false。最终是通过unsafe来实现的。
以上代码表示,如果compareAndSet返回true,则while条件为false,退出循环,返回prev值。如果compareAndSet返回false,则while为true,继续执行循环体,重新获取prev的值,重新获取更新值,直到返回的compareAndSet值为true。
演示源码大致步骤如下:
Object prev = get(); //1next = prev + 1;boolean flag = cas(prev, next);if (flag) {return prev;}else {go to 1}
转载于:https://www.cnblogs.com/sunnyDream/p/8137588.html
JDK提供的原子类原理与使用相关推荐
- JDK1.5提供的原子类原理及使用
JDK提供的原子类原理及使用 volatile只能保障可见性,不能保障原子性,如value++操作,就不是一个原子性操作,value++共分为以下三步操作(假如value的值是0): 1.取出valu ...
- 高并发编程-07-JDK提供的原子类操作及原理
1,原子类介绍: 针对数据类型的操作,JDK提供的原子类来方便我们的线程安全控制. 所有的类保存在 java.util.concurrent.atomic 包中 基本数据类型 AtomicIntege ...
- cas无法使用_【漫画】CAS原理分析!无锁原子类也能解决并发问题!
本文来源于微信公众号[胖滚猪学编程].转载请注明出处 在漫画并发编程系统博文中,我们讲了N篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大BOSS:CAS ...
- 并发笔记(八)JUC原子类以及线程池(Executors)
一.原子类 JUC中提供了针对一个变量的修改的简单原子操作,提供了原子类,相对于我们自己采用锁的方式实现来说,原子类的性能更好. 1.1原子类的底层实现原理理论:volatile+(循环的CAS) C ...
- 16.Atomic原子类体系概览
老王:小陈啊,从今天开始我们就要进入Atomic原子类系列的学习了,首先啊给你看一下JDK中提供给我们使用的原子类有哪些? 小陈:好啊,我记得JUC下面提供的原子类还是挺多的,所有的原子类的使用和底层 ...
- 6.Atomic原子类
Atomic原子类 JUC包下提供的原子类底层的实现原理基本都是差不多的,都是基于volatile和CAS操作来保证线程安全的. AtomicInteger.AtomicLong整型的原子类 Atom ...
- Java中常用的原子类
文章目录 一.什么是原子类 二.原子类的底层实现 三.常用的原子类 3.1.AtomicInteger与AtomicLong 3.2.LongAdder 四.原子类的性能测试 4.1.测试程序 4.2 ...
- JUC多线程:Atomic原子类与CAS原理
一.Atomic 原子类的原理: Atomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全.而 CAS 算法的具体实现方 ...
- atomic原子类实现机制_JDK中Atomic开头的原子类实现原子性的原理是什么?
JDK Atomic开头的类,是通过 CAS 原理解决并发情况下原子性问题. CAS 包含 3 个参数,CAS(V, E, N).V 表示需要更新的变量,E 表示变量当前期望值,N 表示更新为的值.只 ...
最新文章
- WSE 3.0 文档翻译:安装WSE3.0
- virtualenv创建python项目虚拟环境
- 1080 MOOC期终成绩 (25 分)
- 世纪互联云和华为共同打造的数据中心是一个很好的一步标志!
- Android学习笔记44:JSON数据解析
- 的优缺点_浅谈桉木家具的优缺点
- 插值法补齐缺失数据_数据处理——缺失值处理
- SQL2000系統表的應用
- 10个最好的免费响应式Joomla模板
- CTEX编译Xelatex以及如何更新Miktex
- 通过UDR扩展GBase8s查询行为的工程实践
- android版本5.1下载,嘉兴禾点点下载-禾点点 安卓版v5.1.1-PC6安卓网
- 精准营销的神器:小蜜蜂获客系统助你成功
- Flutter安装后出现HTTP host not reachable.
- Java常用的IO流
- python中什么的布尔值不是false_不是python中的布尔值
- java反编译+回编教程
- C#串口设计SerialPort类(维修电工Demo)
- linux 性能测试 antutu,跑分软件测试性能提升幅度
- NetDevice 配置转以太网模块 YC8000-FX的使用步骤
热门文章
- 在IDEA中为项目引入maven中央仓库中的依赖包
- STM32 BOOT0连接不当造成死机
- Android studio导出的apk在真机上安装提示“文件不存在或已失效”的解决方法
- caffe中mnist数据集的运行
- 录取5秒钟的KNN取景效果gif(Opencv) Python实现
- 【解决方案】本次安装Visual Studio 所用的安装程序不完整
- Numpy.tile() (Python)
- 使用OpenVINO遇到No name 'IENetwork' in module 'openvino.inference_engine'解决
- express快速入门
- 数据插入INSERT