资讯专栏INFORMATION COLUMN

AtomicLong.lazySet 是如何工作的?

CoderStudy / 2184人阅读

摘要:上有人提问是如何工作的答道为一个对象设置一个值,会确保其他线程读取到最新值,原子类和变量也是一样的,这是由依赖于硬件的系统指令如的实现的。深入查看你会发现其实他们是相同的,是一个的包装。这里是里关于如何获得装配的一个描述。

Quora上有人提问AtomicLong.lazySet是如何工作的?

Jackson Davis答道:

  

为一个AtomicLong对象设置一个值,jvm会确保其他线程读取到最新值,原子类和voliatile变量也是一样的,这是由依赖于硬件的系统指令(如x86的xchg)实现的。lazySet却是无法保证这一点的方法,所以其他线程在之后的一小段时间里还是可以读到旧的值。这有什么好处呢?性能:在多核处理器下,内存以及cpu缓存的读和写常常是顺序执行的,所以在多个cpu缓存之间同步一个内存值的代价是很昂贵的。

  

如何实现呢?大多数的原子类,比如AtomicLong本质上都是一个Unsafe和一个volatile Long变量的包装类。值得注意的是AtomicLong.lazySet方法实际是调用了本地方法Unsafe.putOrderedLong,本地方法Unsafe.putOrderedLong的实现可以参考http://hg.openjdk.java.net/jdk7/…。从Unsafe的代码中可以发现Unsafe_setOrderedLong是一个本地方法(c++实现),它仅调用了SET_FIELD_VOLATILE,这很是奇怪,我们期望共享的Unsafe_setLongVolatile拥有不同的语义。PS:在非增强版本中,setOrdered仅仅是调用了setVolatile方法,很是让人失望。深入查看你会发现其实他们是相同的,SET_FIELD_VOLATILE是一个OrderAccess:release_store_fence的包装。可以在Linux x86的代码http://hg.openjdk.java.net/jdk7/…中找到此方法的实现,在64bit x86系统中采用xchgq来代码,64位版本指令的问题我上面有提到过,上火。

  

ps:从理论上讲lazySet能比一个标准的volatile变量的写性能更好。但是我在openJdk里没有找到相关代码。

Felix Sulima补充道:

  

sun.misc.unsafe很多方法被jvm增强了,JIT(just in time运行时编译执行的技术)直接解释而忽略原始的实现。可以在这里找到这个例子:src/share/vm/classfile/vmSymbols.hpp@3facbb14e873列表中的native方法仅仅是非JIT环境下的一个备份的内部方法。例如,如果它没有被调用(我也不知道是什么原因),因此这些方法缺乏一些必要的优化。从Talk from JAX London的幻灯片11-12可以看到AtomicLong.lazySet(…)在x86系统上会被编译成“mov”指令。这里是Google Group里关于如何获得JIT装配的一个描述。


原文 How-does-AtomicLong-lazySet-work
翻译 孙文强

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64018.html

相关文章

  • JavaScript 如何工作系列文章已更新到22篇

    摘要:为了方便大家共同学习,整理了之前博客系列的文章,目前已整理是如何工作这个系列,可以请猛戳博客查看。以下列出该系列目录,欢迎点个星星,我将更友动力整理理优质的文章,一起学习。 为了方便大家共同学习,整理了之前博客系列的文章,目前已整理 JavaScript 是如何工作这个系列,可以请猛戳GitHub博客查看。 以下列出该系列目录,欢迎点个星星,我将更友动力整理理优质的文章,一起学习。 J...

    lx1036 评论0 收藏0
  • JavaScript 如何工作:JavaScript 内存模型

    摘要:调用堆栈是存放原始数据类型的地方除了函数调用之外。上一节中声明变量后调用堆栈的粗略表示如下。解释改变的正确方法是更改内存地址。在声明时,将在调用堆栈上分配内存地址,该值是在堆上分配的内存地址。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第 21 篇。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 如果你错过了前面的章节,可以在这里找到它们:...

    baoxl 评论0 收藏0
  • 追寻终极数据库 - 事务/分析混合处理系统交付挑战 (4)(完结篇)

    摘要:评估选项本报告涵盖了为了支持工作负载涵盖运营和分析,查询引擎面临的挑战的细节,这些细节也可以作为访问数据库引擎查询引擎和存储引擎组合以及满足事务运营分析或混合工作负载需求的指南。 评估HTAP选项 本报告涵盖了为了支持工作负载(涵盖OLTP、运营、BI和分析),查询引擎面临的挑战的细节,这些细节也可以作为访问数据库引擎、查询引擎和存储引擎组合以及满足事务、运营、分析或混合工作负载需求的...

    Charlie_Jade 评论0 收藏0
  • 追寻终极数据库 - 事务/分析混合处理系统交付挑战 (4)(完结篇)

    摘要:评估选项本报告涵盖了为了支持工作负载涵盖运营和分析,查询引擎面临的挑战的细节,这些细节也可以作为访问数据库引擎查询引擎和存储引擎组合以及满足事务运营分析或混合工作负载需求的指南。 评估HTAP选项 本报告涵盖了为了支持工作负载(涵盖OLTP、运营、BI和分析),查询引擎面临的挑战的细节,这些细节也可以作为访问数据库引擎、查询引擎和存储引擎组合以及满足事务、运营、分析或混合工作负载需求的...

    nanchen2251 评论0 收藏0
  • 追寻终极数据库 - 事务/分析混合处理系统交付挑战 (4)(完结篇)

    摘要:评估选项本报告涵盖了为了支持工作负载涵盖运营和分析,查询引擎面临的挑战的细节,这些细节也可以作为访问数据库引擎查询引擎和存储引擎组合以及满足事务运营分析或混合工作负载需求的指南。 评估HTAP选项 本报告涵盖了为了支持工作负载(涵盖OLTP、运营、BI和分析),查询引擎面临的挑战的细节,这些细节也可以作为访问数据库引擎、查询引擎和存储引擎组合以及满足事务、运营、分析或混合工作负载需求的...

    Yi_Zhi_Yu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<