AtomicLong的原理
AtomicLong定义
在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型
所以平常用long的时候,多线程重复操作同一个long类型数据时,结果会不准确
AtomicLong相当于Synchrnized的long。
类结构:
public class AtomicLong extends Number implements java.io.Serializable
成员变量
private static final Unsafe unsafe = Unsafe.getUnsafe();//通过这个类去调用底层虚拟机的方法,原子性就是通过这个类实现的
private static final long valueOffset;
static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8();
private volatile long value;
构造函数
public AtomicLong() {}public AtomicLong(long initialValue) {value = initialValue;}
方法
public final long get():获取当前值public final void set(long newValue):设置当前值public final void lazySet(long newValue):最终设置为给定的值public final long getAndSet(long newValue) :设置成指定的值,返回旧的值public final boolean compareAndSet(long expect, long update):如果当前值等于预期值(expected),就改成当前值public final boolean weakCompareAndSet(long expect, long update):如果当前值等于预期值(expected),就改成当前值(调用的就是上诉方法)public final long getAndIncrement() :将当前值+1后返回所有方法都是原子性的
例子
用两个线程,每个线程给一个成员变量加10000次,如果是原子操作,最后一个线程结束时,打印出20000,如果不是原子操作,最后一个线程结束时,打印的是小于20000的值让一个Long类型的数自增,因为不是原子操作,所以数据会混乱AtomicLong类型的数组自增,因为是原子操作,最终的数据是正确的public class Tools extends TestCase{private static AtomicLong l = new AtomicLong(0L);private static Long ll = 0L;@Testpublic void testAtomicWithThreadTest() throws Throwable {TestRunnable runner = new TestRunnable(){@Overridepublic void runTest() throws Throwable {for (int i = 0; i < 10000; i++) {l.incrementAndGet();ll++;}System.out.println(String.format("Long:%s,AtomicLong:%s",String.valueOf(ll),String.valueOf(l.get())));}};TestRunnable[] run = new TestRunnable[2];for (int i = 0; i < 2; i++) {run[i] = runner;}// 用于执行多线程测试用例的Runner,将前面定义的单个Runner组成的数组传入MultiThreadedTestRunner multithreadedtestrunner = new MultiThreadedTestRunner(run);multithreadedtestrunner.runTestRunnables();}
}
输出结果:
Long:12464,AtomicLong:19461
Long:13155,AtomicLong:20000long不是原子操作,所以会出现无效的加1操作,所以最后累加打不到20000
AtomicLong的原理相关推荐
- AtomicLong和LongAdder的区别
转载自 https://blog.csdn.net/yao123long/article/details/63683991 前言 最近在看到不少框架里面使用到了LongAdder这个类,而并非At ...
- 线程安全之原子性Atomic(AtomicInteger|LongAdder|AtomicLong)
线程安全性 当多线程访问某个类时,不管运行环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何的同步或者协同,这个类都能表现出正确的行为,那么这个类就是线程安全的. 原子性 提供 ...
- LongAdder及AtomicLong
AtomicLong原理 就像我们所知道的那样,AtomicLong的原理是依靠底层的cas来保障原子性的更新数据,在要添加或者减少的时候,会使用死循环不断地cas到特定的值,从而达到更新数据的目 ...
- atomiclong 初始化_AtomicLong与LongAdder的区别
AtomicLong的原理 AtomicLong是通过依靠底层的CAS来保障原子性的更新数据,在要添加或者减少的时候,会使用死循环不断地cas到特定的值,从而达到更新数据的目的. LongAdder的 ...
- JAVA并发-AtomicLong
AtomicLong 类提供了long类型的变量与AtomicInteger非常类似,变量可以原子写和读,同时还包括先进的原子操作例如 compareAndSet(). AtomicLong 类位于j ...
- Java多线程系列--“JUC原子类”03之 AtomicLongArray原子类
概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...
- LongAdder源码分析
AtomicLong是作用是对长整形进行原子操作,显而易见,在java1.8中新加入了一个新的原子类LongAdder,该类也可以保证Long类型操作的原子性,相对于AtomicLong,LongAd ...
- 并发编程-并发编程的挑战
并发编程的挑战 并发编程中,我们或多或少会遇到线程上下文切换.死锁.受限于软硬件资源限制的挑战. 上下文切换 CPU会通过时间片分配算法给各个线程分配时间片来实现多线程机制.获得CPU时间片的线程将可 ...
- 阿里四面经验总结,月薪36K定级P6(含面试题答案)
阿里技术岗位要求及体系图: 好多人对阿里巴巴技术岗的体系结构及级别的技术要求设置不太清楚,想去面试也不知道面试什么级别的岗位,下面说说阿里的技术体系又是一个怎么样的水平划分! 阿里P6(技术主管) 工 ...
最新文章
- JAVA猴子选大王问题
- 工程师忽略的隐形成本
- js/jquery学习笔记
- 各类数据类型的用法java_Java各种数据类型详细介绍及其区别
- JMS的两种消息模型(Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub))应用举例
- AppiumDriver java部分api
- vue-Resource(与后端数据交互)
- 19复变函数的积分(五)
- spring 包的依赖问题
- php smtp.163 端口号,常用的邮箱服务器(SMTP、POP3)地址、端口
- 你不是痘痘肌,你只是管不住嘴
- Kafka 之 HW 与 LEO
- 中国农大计算机保研,中国农业大学2021届保研情况
- pytorch之warm-up预热学习策略
- 倒序输出数组 (彩蛋:抖机灵)
- 单击屏幕亮屏流程分析
- 怎么让上下两排对齐_Word文档如何让让上下两排对齐 - 卡饭网
- 《UNIX环境高级编程(第3版)》
- 【小记】LaTex 语法说明
- 解决pytest运行时报错ModuleNotFoundError
热门文章
- Cyanine5 amine/Cy5 amine/Cy5 NH2是一种含氨基的活性染料
- nfc 蓝牙快速配对 android,索尼WF-SP900耳机怎么通过NFC连接
- 关于HTTP缓存Cache-Control
- linux蓝牙连接手环,华为发布了一款「手脚并用」的智能手环
- 用python爬微博数据_怎样用python爬新浪微博大V所有数据?
- 注册百家号以后如何快速度过新手期
- 怎样使用PDF阅读器浏览查看PDF文档
- mysql使用group_concat()连接构造json对象数组时长度受限
- 破壁,宝藏艺术家登场!(二)
- UDP数据包的延迟及丢包检测(C++)