Java AtomicInteger incrementAndGet也会存在线程不安全情况
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java AtomicInteger incrementAndGet也会存在线程不安全情况,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2113字,纯文字阅读大概需要4分钟。
内容图文
![Java AtomicInteger incrementAndGet也会存在线程不安全情况](/upload/InfoBanner/zyjiaocheng/848/27808cd88b364b13b27a7a8c3ac95fb3.jpg)
Java AtomicInteger incrementAndGet也会存在线程不安全情况
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
以上是AtomicInteger的源码,使用自旋CAS的方式保证在最新值上修改。但是如果程序在compareAndSet以后,return之前其他线程执行了int next = current + 1;那么返回的值不一样不是我想要的吗?
例如:一开始的值是1,自旋加1以后应该返回2,但在更新值以后、return之前另外一个线程执行了int next = current + 1;那么返回的值不就是3了吗???
编辑于:2016.12.08 11:28
0
声望: 0
3个回答
按赞数排序
也许你没有理解线程的私有性。
线程的并发是出现在共享的变量的。
也就是说,能出现并发的值是value;
也就是对value的读取和修改;
而方法中的
current和next的都是在线程的栈内存中的,每个线程都会维护线程的栈帧。
两个线程的改变是没有关系的,
如果当前线程修改后next=2;
第二个线程的next=3是没有关系的,他们之间的联系是value。
在第一个线程的value=2就够了,第二个线程是value=3那么得到的自然是3
如果有帮助,希望结帖
发布于:2016.07.01 14:09
|评论 1
声望: 0
1已采纳
qq756161569 抱歉,结贴有点晚,您说的是对的,谢谢您
接近 2 年之前 回复
这个魔法的秘密恐怕在get();
get()应该是线程安全的方法.
保证获取的值只和当前线程有关...
发布于:2016.07.01 13:52
|评论 0
声望: 0
0
去研究了一下源码,我觉得和线程间的变量私有共享没有关系,注意一下,这个方法内部是用无限for循环包着的,就是说compareAndSet方法是会返回false的,
compareAndSet方法内部是用一个Unsafe对象来做的,看不到源码,看了下Unsafe对象被调用的方法的说明,是用来保证拿到的当前值就是真正的当前值,
当不是当前真正的值,就返回false,这样应该就能保证线程安全了
发布于:2016.07.02 20:06
|评论 3
声望: 0
0
qq756161569 其实是因为方法内部的变量是属于线程私有的,不会引发线程不安全,当它调用compareAndSet刷新到内存的时候如果不对它会返回false
接近 2 年之前 回复
willkinson 呵呵 我可不觉得会有问题
2 年多之前 回复
w172087242 要理解线程安全在什么情况下出现,方法内变量是影响不了共享变量的,cas模型也就是你说的Unsafe提供的对数据原子性改变的支持,就足以保证其安全了。为什么你们会觉得,第二个线程的值会影响第一个线程的返回呢
2 年多之前 回复
内容总结
以上是互联网集市为您收集整理的Java AtomicInteger incrementAndGet也会存在线程不安全情况全部内容,希望文章能够帮你解决Java AtomicInteger incrementAndGet也会存在线程不安全情况所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。