低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

JavaOne:Cliff Click 谈论可伸缩、非阻塞的编码方式 -- 不要发布

2008 年 5 月 15 日

你的并发代码能有多快?早在 1967 年,Gene Amdahl 就指出了影响这一问题的主要限制。程序中只有一部分可以完全并行地运行,也只有这部分才能直接在拥有越来越多处理器内核的机器上获得良好的伸 缩性。程序的剩余部分则只能顺序执行。Amdahl 法则强调的主要问题是锁争夺,这个问题会随着处理器内核数的增加而逐渐恶化。多数共享存储器硬件的大型 CPU 控制系统都支持非常快速的并发读操作,但会限速于“1-cache-miss-per-write”或者“1-memory-bus- update-per-write”,因此避免所有 CPU 对同一位置进行写操作是非常关键的。即使利用读写锁,系统伸缩度也很难超越 50-100 个 CPU。多核处理器是一个正在发展的产业趋势,几乎全部硬件供应商都在不遗余力地朝着多核的方向努力。Azul 即将开发出可投入使用的 768 核的处理 器,Sun 的 Rock 拥有 64 核,就连基于 x86 的商用硬件也在增加核的数量。因此锁争夺的问题将成为程序员编写高性能代码的拦路虎。

Azul Systems 的资深工程师 Cliff Click 博士在今年的 JavaOne 大会上进行了演讲(下载幻灯片),介绍了一些可以帮助我们用Java 编写出可伸缩、非阻塞代码的技术。总体来说,他介绍的方法实现了一个非阻塞算法,这个算法可以保证停止某个特定线程并不会导致整体进程的停止。

Click 的演讲主要包括下面几部分:

  1. 一个大型的、快速的包含所有数据的数组,该数组允许快速的并行数据读取,也允许并行的、递增的并发复制。
  2. 数组元素的原子更新(需要使用 java.util.concurrent.Atomic.*)。在 Azul/Sparc/x86 处理器上,原子更新将使用“比较并交换(CAS)”原语实现,而在 IBM 的平台上,将使用“链接加载 / 条件存储(Load Linked/Store-conditional,LL/SC)”原语。
  3. 从对每个数组元素的原子更新与逻辑上的复制操作中抽象出来的有限状态机(FSM)。FSM 支持数组的大小调整,并用于控制写操作。

有了这些基本概念和元素后,Click 接着将大量锁自由的 FSM 步骤(比如每个 CAS 步进)组合成一个非阻塞算法。每个 CAS 的成功都是局部成功,同时一个 CAS 的失败则意味着另一个 CAS 会继续。如果一个 CAS 成功,状态机就会前进,同时失败的 CAS 就会重试。

Click 已经实现了两个示例,分别是位向量(Bit Vector)和哈希表(Hash Table),它们的源代码可 以在SourceForge 上获得。同时Click 正在开发第三个示例(FIFO 队列)。让我们以哈希表为例来深入研究一些细节,哈希表是一个由键值对组 成的数组,其中Key 在偶数的位置上、Value 在奇数的位置上。每个元素都独立地进行CAS 操作,但是状态机会同时跨越两个元素,甚至在复制阶段包括来 自两个数组的不同元素。Click 实现的哈希表支持并发插入、移除测试(remove test)、重置大小,同时该实现还通过了ConcurrentHashMap 的Java 兼容性测试集(JCK)。在Azul 的768 核的硬件系统上,该 哈希表在每秒超过十亿次读操作、同时每秒超过千万次更新操作时,可以获得线性的伸缩性。

InfoQ 与 Click 博士还谈到了他目前研究工作的一些背景。在这次 JavaOne 的演讲期间,他特意强调了几个用 Java 编写哈希表时存在的问题,因 此在被问到 Java 做这样的工作有多合适时,他回答说:“事实上是非常合适的……它非常准确地应用了存储模型(并且实现得非常好)。但是它在细粒度控制上 存在不足,这些不足只带来很小的性能损耗,我可以忽略它们。缺乏细粒度控制(也就是直接 ASM 存取)可能会在 OS 设计或者设备驱动程序中带来问题,但是对 数据结构不会产生影响。”

InfoQ 还问他建议人们何时使用他实现的数据结构。Click 的回答是,在那些“久经考验”的实现变得太慢、难以使用之时:

“如果单独的数据结构被激烈争夺;而且你已经尝试过 java.util.concurrent.ConcurrentHashMap 等实现了。那么我的实现在没有负载的情况下并不会显著提升性能(也就没有什么理由使用它),但在下面的情况下,却完全不同了:

  • 当有超过 32 个 CPU 同时争夺时,或者
  • 写操作占读写操作总数的比例很高时。
    这种转变会带来很大的变化,因此,使用它以前要先进行测试。”

目前,围绕 Java 中的并发有很多动作,Click 博士的研究工作所解决的问题与 fork/join 框架基本类似,后者正被考虑加入 Java 7。尽管 Click 本人不是专家组的成员,但他经常向专家组提供帮助。

查看英文原文 JavaOne: Cliff Click on a Scalable Non-Blocking Coding Style

2008 年 5 月 15 日 21:55276
用户头像

发布了 53 篇内容, 共 93205 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

Mybatis系列全解(二):Mybatis简介与环境搭建

潘潘和他的朋友们

Java 后端 mybatis mybatis源码

Java9模块化指南

程序员小毕

Java 编程 程序员 面试 开发

作业:挑一个你喜欢的产品平台,列出产品的利益相关方。

嫉妒的耗子

第二次作业提交

涅米丶

第四次工业革命与龙的故事

脑极体

Springboot使用jasypt需要注意的一个小地方

Sky彬

springboot jasypt

产品经理训练营 - 第二章作业

Ryun

一看就懂的网络传输介质介绍

阿里开始“拆”中台?!中台建设何去何从?

博文视点Broadview

阿里发布2021年Redis“神级”手册:基础+原理+应用+集群+拓展+源码,六管齐下

Java架构追梦

Java redis 阿里巴巴 源码 架构

Spring 是如何解决循环依赖的?

程序员小航

Java spring 源码 循环依赖

Java 程序经验小结:反射机制勿滥用

后台技术汇

28天写作

Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

潘潘和他的朋友们

Java 后端 mybatis 后端开发 mybatis源码

70 张图带你彻底掌握红黑树

云流

Java 数据结构 红黑树

【并发编程的艺术】Java内存模型的顺序一致性

程序员架构进阶

架构 JMM Java内存模型 28天写作

Mybatis系列全解(三):Mybatis简单CRUD使用介绍

潘潘和他的朋友们

Java 后端 mybatis 后端开发 mybatis源码

拆解 抽奖助手 的利益相关者

Sicolas Flamel

产品经理 产品经理训练营 无码科技

抽奖小助手——利益相关者

墨狂之逸才

面试学习!我们究竟还要学习哪些Android知识?讲的明明白白!

欢喜学安卓

android 程序员 面试 移动开发

阿里开源Redis“神级”手册我粉了!理论源码实战起飞(2021最新)

程序员小毕

Java redis 源码 架构 面试

第二章作业

白知之明

深入了解HashMap!

xcbeyond

Java hashmap HashMap底层原理 28天写作

面试加分项!Android项目开发如何设计整体架构?学习路线+知识点梳理

欢喜学安卓

android 程序员 面试 移动开发

产品训练营-第二周-作业

邹小胖

产品经理训练营

「Android渲染」图像是怎样显示到屏幕上的?

李小四

Android渲染 AndroidUI RenderingPipeline

【网络篇】- https

双木之林

Mybatis系列全解(一):手写一套持久层框架

潘潘和他的朋友们

Java 后端 mybatis mybatis源码

Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件

潘潘和他的朋友们

Java 后端 mybatis 后端开发 mybatis源码

全网首发!普通程序员快速成为架构师的不传之秘,阿里年薪20W——200W的学习计划路线终开源

程序员小毕

Java 人工智能 大数据 架构 分布式

【百度官方技术分享】百度智能小程序框架性能优化实践

百度Geek说

百度智能小程序 小程序云开发 百度 前端开发 技术宅

产品经理的大局观——

Sicolas Flamel

产品经理 产品经理训练营

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

JavaOne:Cliff Click谈论可伸缩、非阻塞的编码方式--不要发布-InfoQ