javaone
Tobias Lindaaker ( 新技术 )的演讲“原子数据结构如何工作?” 在希尔顿的金门大桥3/4/5会议室区域举行。 Lindaaker自从最初提交摘要以来就更改了演讲标题 。 摘要的标题(以及会议材料中列出的标题)是“原子数据结构如何工作?”,但他已将其重命名为“非阻塞数据结构如何工作?”。
Lindaaker解释说,“原子”来自希腊语,意思是“不可分割的”。 他解释说,“无锁数据结构”是“在对数据结构执行操作(读或写)时不会阻塞任何线程的数据结构”。 他说,一个人要尽可能避免“ 等待旋转 ”。
Lindaaker谈到了同步区域。 他说,这些地区“通过代码创建了序列化的路径”和“保证安全的发布”。 他将“安全发布”定义为“退出同步[block]之前编写的所有内容”和“保证在进入同步[block]时可见”。 他的项目符号之一说,“ 可变字段使您无需序列化即可安全地发布。” Lindaaker在他的“ volatile
字段”幻灯片中更加关注volatile
关键字修饰符。
幻灯片“什么是内存障碍?” 提供了内存屏障概念的简单直观表示。
Lindaaker在他的幻灯片“原子更新”中指出,访问原子引用的最简单方法是使用java.util.concurrent.atomic 。 AtomicReference <V> 。 Lindakker提供了使用杯垫的物理演示,以说明compareAndSet (如果条件有利地匹配,则设置一个值)与getAndSet之间的区别 。 (设置新值将返回旧值)。
Lindaaker更喜欢java.util.concurrent.atomic.AtomicReferenceFieldUpdater <T,V>,因为它的“内存开销较低”(“对象标头较少”)和“更好的内存局部性”(“无引用间接”)。
Lindaaker解释说,基于阵列的队列确实会阻塞(有时由于有限的硬件资源而需要限制工作量时会有所裨益),而链接队列不会阻塞。 Lindaaker使用超市队列作为差异的示例。 在基于链接的队列中,您总是站在队列中前面同一客户的后面。 在基于数组的队列中,您始终保持在同一位置。 有界队列“经常会表现更好”,但满时将阻塞。
本演讲的主题之一是学习新想法,然后逐一进行进一步研究的想法。 Lindaaker建议受众成员查看JDK的代码,以查看一些令人印象深刻的代码示例。
Lindaaker引用LMAX ( 伦敦多资产交易所 ) Disruptor作为“环形缓冲区”(“带有读标记和写标记的阵列”)的示例。 他说,“读者争夺阅读标记,作家争夺书写标记”,并强调了这样的结果,“对于单一读者/单一作家,没有争执。” Disruptor页面将Disruptor描述为“高性能线程间消息传递库”。
Lindaaker表示java.util.concurrent.ConcurrentHashMap是一个不错的常规选择,但是对于他的演示文稿中的讨论并不十分令人兴奋。 他说,通过适当的调整,它“可以在当前的商用硬件上很好地扩展”(少于100个CPU)。
Neo Technology提供了非关系的数据库实现( Neo4j )( 图形数据库 )。 Lindaaker将Neo Technology基于图的数据库描述为“将数据存储为节点以及节点之间的关系”。
别忘了分享!
参考: JavaOne 2012:非阻塞数据结构如何工作? 由我们的JCG合作伙伴 Dustin Marx在“ 实际事件启发”博客中获得。
翻译自: https://www.javacodegeeks.com/2012/10/javaone-2012-how-do-non-blocking-data.html
javaone