找回密码
 立即注册

本文来自

电脑/上网

电脑/上网

订阅|关注

致力于提供软件新闻发布,和软件知识学习,包括常用软件应用技巧及评测,创意设计相关的图文及视频教程

AtomicLong介绍

[复制链接]
220 hlzzgh 发表于 2017-9-14 15:26:14
AtomicLong的代码很简单,下面仅以incrementAndGet()为例,对AtomicLong的原理进行说明。
incrementAndGet()源码如下:

public final long incrementAndGet() {
for (;;) {
// 获取AtomicLong当前对应的long
long current = get();
// 将current加1
long next = current 1;
// 通过CAS函数,更新current的
if (compareAndSet(current, next))
return next;
}

说明:
(01) incrementAndGet()首先会根据get()获取AtomicLong对应的long 。该 是volatile类型的变量,get()的源码如下:
// value是AtomicLong对应的long
private volatile long value;
// 返回AtomicLong对应的long
public final long get() {
return value;
}
(02) incrementAndGet()接着将current加1,然后通过CAS函数,将新的 赋 给value。
compareAndSet()的源码如下:
public final boolean compareAndSet(long expect, long update) {
return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
}
compareAndSet()的作用是更新AtomicLong对应的long 。它会比较AtomicLong的原始 是否与expect相等,若相等的话,则设置AtomicLong的 为update。
以上为AtomicInteger中的部分源码,在这里说下其中的value,这里value使用了volatile关键字,volatile在这里可以做到的作用是使得多个线程可以共享变量,但是问题在于使用volatile将使得VM优化失去作用,导致效率较低,所以要在必要的时候使用,因此AtomicInteger类不要随意使用,要在使用场景下使用
AtomicInteger是在使用非阻塞算法实现并发控制,在一些高并发程序中非常适合,但并不能每一种场景都适合,不同场景要使用使用不同的数 类。
对比如下代码
一段是Integer的,一段是AtomicInteger的,为以下:
public class Sample1 {
private static Integer count = 0;
synchronized public static void increment() {
count++;
以下是AtomicInteger的:
public class Sample2 {
private static AtomicInteger count = new AtomicInteger(0);
public static void increment() {
count.getAndIncrement();
}
AtomicInteger 通俗地解释:
对某个内存 拷贝一个副本,某个线程若读到该副本,并对其进行计算,输出结果,在写入内存时,再次取出内存 和该副本比较,若副本和内存 相同,则把新的 写入内存。 较为官方的解释: 通过CAS(AtomicInteger)实现,CAS简而言之就是。CAS有3个操作数,内存 V,旧的预期 A,要修改的新 B。当且仅当预期 A和内存 V相同时,将内存 V修改为B,否则什么都不做。 两个问题: (1)CAS算法仍然可能会出现冲突,例如A、B两个线程,A已经进入写内存但未完成,此时A读取到的副本且读取成功,AB两个线程同时进入写内存操作,必然会造成冲突。
CAS算法本质并非完全无锁,而是把获得锁和释放锁推迟至CPU原语实现,相当于尽可能的缩小了锁的范围;直接互斥地实现系统状态的改变,它的使用基本思想是copy-on-write——在修改完对象的副本之后再用CAS操作将副本替换为正本。 (2)ABA问题,若其中一个线程修改A- B- A,另外一个线程仍然读取到A,虽然 是预期 ,但并不能说明该内存 没有变化。
笑谈java并发编程五之AtomicLong*介绍
关于AtomicLong,AtomicLongArray,AtomicLongFieldUpdater我在这就不多做介绍了,这些和AtomicInteger*都是类似的,只是AtomicLong*操作...
JUC原子类-02之 AtomicLong原子类
0.本文目录本文目录
AtomicLong介绍和函数列表
AtomicLong源码分析基于JDK170_40
AtomicLong示例1.开篇明志AtomicInteger, AtomicL...
如何成为一名机器学习的大咖? 对于机器学习,很多人的观点是:机器学习技术是今后所有技术人员都绕不过的一个门槛。 那么,普通程序员该学习机器学作为一名对机器学习心有向往的程序员,我该以什么样的姿势开始呢?
Java多线程系列--“JUC原子类”02之 AtomicLong原子类 (r)
AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似。本章以AtomicLong对基本类型的原子类进行介绍。内容包括:
Atom...
java.util.concurrent介绍
java.util.concurrent 包含许多线程安全、测试良好、高性能的并发构建块。不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
4,本网站内容均摘自其他网站,如涉及侵权定当第一时间删除
5、如侵犯您的权益请联系936144721@qq.com



上一篇:医疗纠纷医疗事故防范及处理预案
下一篇:资阳到吉田多少公里路
转载请说明出处,本文地址:http://bbs.imicun.com/thread-15469668-1-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表