page contents
发现
问答
发起
提问
文章
文章
更多
专家
讲堂
话题
财富榜
商城
Toggle navigation
问答
文章
精品课
商城
冒泡
搜索
我要提问
立即登录
免费注册
首页
问答
正文
说一下 atomic 的原理?
小柒
发布于 2022-10-25 13:57
阅读 771
收藏 0
答案
1
分类:
高并发架构
高并发
编程论坛
默认排序
时间排序
4360
王昭君
2022-10-25 14:05
Atomic
包中的类基本的特性就是在多线程环境下,当有多个线程同时
对单个(包括基本类型及引用类型)变量进行操作时,具有排他性,
即当多个线程同时对该变量的值进行更新时,仅有一个线程能成功,
而未成功的线程可以向自旋锁一样,继续尝试,一直等到执行成功。
AtomicInteger
类的部分源码:
// setup to use Unsafe.compareAndSwapInt for updates
(更新操作时提供
“
比较并替换
”
的作用)
private static final
Unsafe unsafe
=
Unsafe
.
getUnsafe
();
private static final long
valueOffset
;
static
{
try
{
valueOffset
=
unsafe
.
objectFieldOffset
(
AtomicInteger
.
class
.
getDeclaredField
(
"value"
));
}
catch
(
Exception ex
) {
throw new
Error
(
ex
); }
}
private volatile int
value
;
AtomicInteger
类主要利用
CAS (compare and swap) + volatile
和
native
方法来保证原子操作,从而避免
synchronized
的高开销,执
行效率大为提升。
CAS
的原理是拿期望的值和原本的一个值作比较,如果相同则更新成
新的值。
UnSafe
类的
objectFieldOffset()
方法是一个本地方法,这
个方法是用来拿到
“
原来的值
”
的内存地址,返回值是
valueOffset
。另
外
value
是一个
volatile
变量,在内存中可见,因此
JVM
可以保证
任何时刻任何线程总能拿到该变量的最新值。
评论 (
0
)
请先
登录
后评论
您需要登录后才可以回答问题,
登录
或者
注册
关注
1
关注
小柒
提出于 2022-10-25 13:57
全部
小柒 的其他提问
类似问题
运行时异常与一般异常有何异同?
1 回答
771 阅读
String 和StringBuffer的区别?
2 回答
771 阅读
怎样将字符串中第一个字母大写?
3 回答
771 阅读
在Python中如何生成一个随机数?
1 回答
771 阅读
Python中的不可变集合(frozenset)是什么?
1 回答
771 阅读
在Python中怎样获取输入?
1 回答
771 阅读
×
发送私信
发给:
内容:
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因: