`
alphafox
  • 浏览: 18005 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

对 AtomicInteger 源码 的理解

 
阅读更多

java.util.concurrent.atomic 包提供了若干个类能实现对int,long,boolean,reference的几个特殊方法非阻塞原子性,这一系列类的主要基于以下两点

1.volatile修饰变量,保证get()/set()的原子性
2.利用系统底层的CAS原语来实现非阻塞的其它方法原子操作

private volatile int value;

public final int getAndIncrement() {
for (;;) {
1 int current = get();
2 int next = current + 1;
3 if (compareAndSet(current, next))
return current;
}
}

单看这段 代码 别说 保证原子性 即使+1 ,他都很难保证, 因为根本没有更新value 的操作

重点在于compareAndSet() 函数

compareAndSet

public final boolean compareAndSet(int expect,
                                   int update)
如果当前值 == 预期值,则以原子方式将 当前值 设置为给定的更新值

参数:
expect - 预期值
update - 新值
返回:
如果成功,则返回 true。返回 False 指示实际值与预期值不相等。

该函数 只有两个参数,可操作的确实三个值 ,即 value ,expect, update. 他使用了 由硬件保证其原子性的指令 CAS (compare and swap)。


compareAndSet 函数保证了 比较,赋值这两步操作可以通过一个原子操作完成。

然后看整个函数, 所有代码被放到了一个循环里面, 如果compareAndSet()执行失败,则说明 在int current = get(); 以后,其他线程对value进行了更新, 于是就循环一次,重新获取当前值,直到compareAndSet()执行成功为止。

综上,getAndIncrement() 方法并不是原子操作。 只是保证了他和其他函数对 value 值得更新都是有效的。

他所利用的是基于冲突检测的乐观并发策略。 可以想象,这种乐观在线程数目非常多的情况下,失败的概率会指数型增加。

分享到:
评论

相关推荐

    java并发之AtomicInteger源码分析

    AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。下面小编和大家一起学习一下

    Java中对AtomicInteger和int值在多线程下递增操作的测试

    主要介绍了Java中对AtomicInteger和int值在多线程下递增操作的测试,本文得出AtomicInteger操作 与 int操作的效率大致相差在50-80倍上下的结论,需要的朋友可以参考下

    AtomicInteger并发测试

    测试java.util.concurrent.atomic.AtomicInteger的类 与直接使用int做区别

    AtomicInteger 浅谈

    NULL 博文链接:https://zcmor.iteye.com/blog/1535524

    Java AtomicInteger类使用方法实例讲解

    主要介绍了Java AtomicInteger类使用方法实例讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java AtomicInteger类的使用方法详解

    主要介绍了Java AtomicInteger类的使用方法详解,文中有具体实例代码,具有一定参考价值,需要的朋友可以了解下。

    AtomicInteger的使用,CAS的工作原理

    AtomicInteger atomicInteger = new AtomicInteger(5); atomicInteger.compareAndSet(5, 2020) + \t current data is + atomicInteger.get()) /** * Atomically sets the value to the given updated value * if ...

    ViewPager+AtomicInteger实现广告轮播

    利用ViewPager实现的广告轮播,没有触摸事件的时候可以定时轮播广告,有触摸事件实施触摸事件。自动轮播使用的是线程加AtomicInteger的方式实现。

    Java并发编程相关源码集 包括多任务线程,线程池等.rar

    Java并发编程常见知识点源码集锦,涉及到对象锁,Executors多任务线程框架,线程池等示例,列出一些源码包中包括的内容:  volatile关键字的非原子性、volatile关键字的使用、AtomicInteger原子性操作、线程安全小...

    AtomicIntegerExample:AtomicInteger示例

    AtomicInteger示例AtomicInteger用于原子增量计数器之类的应用程序。 简短的示例代码: public class AtomicIntegerExample { private final ExecutorService execService = Executors . newFixedThreadPool( 100 );...

    JAVA初级面试题(release)

    NULL 博文链接:https://it-fan.iteye.com/blog/1183175

    线程基础,线程池,生命周期

    线程基础,线程池,生命周期

    Redis数据结构与对象总结

    空间预分配:对字符串进行增长操作时的优化,SDS API 会检查SDS当前空间是否符合修改条件,如果不符合 不但会分配修改所需空间还会分配给free属性额外的未使用空间 惰性空间释放:对字符串进行缩减操作时

    java多线程自增效率比较及原理解析

    同时,本文也对这些方法的原理进行了简单解析,如synchronized关键字的互斥锁机制、AtomicInteger的CAS机制、LongAdder的分段累加机制以及LongAccumulator的自定义函数累加机制等。适用于Java开发人员和多线程编程...

    java 分页、批量删除

    包含了jsp的简单分页,有首页、尾页、上下页、设置页面数字等,有完整的注释、包、ppt等,mysql数据库的,对后台管理的删除有不错的参考价值,非常适合web初学者,改改就可以在多少场合运用。

    一篇看懂Java中的Unsafe类

    在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以花了点时间研究了下,下面这篇文章主要给大家介绍了关于Java中Unsafe类的相关资料,需要的朋友可以参考借鉴,下面来一起学习学习吧

    用Java代码所写的简单计数器

    用Java代码所写的简单计数器,功能:根据选票人投票,最后记录数据并用立方图显示结果

    使用Java的Memory Model实现一个简单的计数器.txt

    这个代码实现了一个简单的计数器,使用了Java的`AtomicInteger`类来保证多线程环境下的原子性操作。`AtomicInteger`是一个支持原子操作的整数类,它内部使用了CAS(Compare And Swap)算法来实现线程安全的操作。在...

    CAS源码分析,以及ABA问题的解决

    CAS(比较并交换)一个小demo ... AtomicInteger atomicInteger = new AtomicInteger(5); //compareAndSet期望并交换,期望是第一个参数,期望拿走内存时和放回时实际内存值相同,更新值是更新到多少 Sys

    java8集合源码-IteRace:Java并行循环的竞争检测

    java8集合源码赛马 IteRace 是伊利诺伊大学开发的静态竞态检测工具。 静态竞争检测器存在不精确性(由于保守的假设),这通常表现为程序员需要检查的数量难以管理的警告。 ItRace 通过专业化来解决这个问题: 它了解...

Global site tag (gtag.js) - Google Analytics