`
san_yun
  • 浏览: 2655036 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

exodus2线程总结

 
阅读更多
现象描述
exodus2在启动不久后就挂住,用kill -3后发觉线程大量停在了Hashmap.get/put 方法。 原因是随意将HashMap用于多线程环境中


代码:

定义成员变量

private static Map cachedMap = new HashMap(7000);

private static Boolean firstInvoke = true;



程序是设想在第一次开始对该map变量进行初始化

线程1:

Public Object  getMyValue(){

     If(firstInvoke){

        While(i<7000){

…………

cachedMap.put("new","newValue");

i++;

}

firstInvoke = false;

}

}


线程2:

在线程1对cachedMap对象put的时候,线程2从这个cachedMap中取值

cachedMap.get("new");

问题分析:

单步Debug是没问题,但代码在多线程情况下工作会出现线程安全。 Hashmap不是读写线程安全的,只有全部只读才是线程安全的,Hashmap在被并发读写使用的时候会出现线程安全问题,一般理解的线程安全问题导致的是数据错误。 而Hashmap多线程同时读写操作时,可能使程序挂起。

以下摘自校长bolg( http://sdh5724.javaeye.com/blog/619130 )
分析: 我们知道Hashmap在被并发读写使用的时候, 会抛出ConcurrentModificationException这个异常, 但是JDK文档明确指出, 这个异常抛出是属于 fail-fast 的一个设计方法, 目的是为了开发者能及早的意识到线程安全问题发生。 但是, 这个fail-fast不是一定会发生, 而是可能会发生的行为。 因此, 在一个不确定状态下的下,jvm线程发生持续100%cpu行为是比较容易理解了(for (Entry<K,V> e = table[i]; e != null; e = e.next), 目前只能估计是这个代码进入死循环的状态,还不能非常明确)

补充知识
这个HashMap不当使用的问题很经典。很多时候我们用“单线程”思维习惯去写代码,不知不觉就忘记了运行时的多线程场景。

其实,我觉得下面的例子中还是有隐含的race condition问题的,那就是在这个if(firstInvoke) then load data and firstInvoke=false这个逻辑中。

即:If(firstInvoke){…  // 这里可能会导致多条线程同时进入,导致多次load data

通常我们用一个boolean变量来实现lazy操作, 那么在多线程环境下,要记得使用synchronize关键词 或者 采用volatile类型变量+CAS操作,确保变量被每条线程都能正确的读取和写入。

    1.保险的做法:(在最新JVM中,这种方式是最安全,最可读,性价比最高的,如果JVM支持锁逃逸即Biased Locking,性能也会非常好)

Synchronized(lock){

         If(firstInvoke){

             Then load data…

             firstInvoke = false

}

}

    2.或者,用volatile变量+DCL

Private volatile boolean firstInvoke = true;

If(firstInvoke){

     Synchronized(lock){

       If(firstInvoke){

          Then load data …

           firstInvoke = false;

}

}

}

3.SMP友好,但是偷懒的做法,用AtomicBoolean,里面用到了CompareAndSet操作。(volatile只保证变量可见性,Spinning CAS保证操作原子性)

Private AtomicBoolean firstInvoke = new AtomicBoolean(true);

If(firstInvoke.getAndSet(false)){ // cas spinning inside the AtomicBoolean::getAndSet() method

  Then load  data…

}

4.最后,最复杂,但是同时满足SMP友好,及性能最佳的:

private AtomicBoolean firstInvoke = new AtomicBoolean(true);

for(;;){

  Boolean current = firstInvoke.get();

  If(!current){     // the most likely condition branch, see http://pt.alibaba-inc.com/wp/dev_related/optimization_363/likely-unlikely.html

     Break;

}

If(firstInvoke.compareAndSet(current,false){

   Then load data…

   Break;

}

}

在dubbo代码中,为了确保SMP状态下性能最优,我们在某一些关键地方也用到了上面的CAS+spinning的技巧。

我们也许并不会时时刻刻用到“回字的四种写法”,但是搞清楚JVM内存可见性和操作原子性的基本概念还是必须的,这也是确保写出线程安全代码的前提条件)。

参考资料:《 The Art of Multiprocessor Programming》  http://book.douban.com/subject/3024605/

分享到:
评论

相关推荐

    [新]exodus代码

    Exodus是一款基于Delphi编程语言开发的即时通讯软件的源代码,它能够与Jabberd2服务器进行通信。在本文中,我们将深入探讨Exodus的源代码结构、Delphi编程语言、Jabber协议、Jabberd2服务器以及即时通讯的相关知识点...

    BUILDING EXODUS使用指南

    2. **BUILDING EXODUS 的硬件KEY (软件狗)**:用于授权许可的关键设备,确保软件只能在合法授权的计算机上运行。 3. **技术支持**:提供了技术支持的相关信息,包括联系方式、支持范围等。 4. **信息反馈**:鼓励...

    BUILDING_EXODUS使用指南

    ### BUILDING_EXODUS 使用指南知识点详述 #### 一、概述 《BUILDING_EXODUS 使用指南》是一份详尽介绍了如何使用BUILDING_EXODUS软件的文档,旨在帮助用户更好地理解和掌握这款用于模拟人群疏散过程的专业软件。...

    Python-Exodus这个工具可以轻松地将LinuxELF二进制文件从一个系统重定位到另一个系统

    2. **分析二进制**:运行`Python-Exodus`对源系统上的ELF文件进行分析,获取其依赖和重定位信息。 3. **重定位**:将分析结果应用到目标系统上的相同或相似的ELF文件,调整其内部地址以匹配新的运行环境。 4. **...

    Python库 | pubtools_exodus-0.1.0-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:pubtools_exodus-0.1.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    exodus20.github.io

    exodus20.github.io

    Exodus-开源

    2. **加密通信**:Exodus支持端到端的加密,确保聊天内容的隐私和安全。 3. **联系人管理**:用户可以创建和管理联系人列表,设置不同的分组,方便查找和沟通。 4. **文件传输**:能够与联系人之间发送文件,支持大...

    gmsh-exodus-converter:将用gmsh编写的网格转换为exodus II格式,以与Peridigm一起使用

    将用gmsh编写的网格转换为exodus II格式,该格式用于常见的仿真工具(如 引用代码 您是否出于研究目的使用此代码? 请花点时间使用此DOI引用它: 用法: python convert.py -i input.msh -o output.g 请注意, 与 ...

    Metro Exodus HD Wallpapers New Tab Themes-crx插件

    由生存游戏迷们制作的Metro Exodus高清壁纸的新Tab主题,专为Metro Exodus的粉丝而设计。 METRO EXODUS NEW TAB-由FreeAddon提供安装我的Metro Exodus New Tab主题,并在每次打开新标签时享受Metro Exodus的各种高清...

    Exodus Project-开源

    Exodus Project是一款MMO游戏,在持续的太空世界中融合了动作,策略和RPG。 它使用Crystal Space 3d,并且可以在Win32和Linux下运行。

    思科内容服务交换机为网站运营商Exodus提高竞争力

    本文重点介绍了思科的Cisco CSS 11000系列内容服务交换机如何帮助网站运营商Exodus提升竞争力。这种交换机专为应对高流量网站的需求而设计,通过智能地管理和分发网络内容,确保了网站性能的高效和稳定。 首先,...

    exodus-rsync:用于rsync的exodus-aware替代产品

    用于rsync的exodus-aware替代产品。 概述 exodus-rsync是一个命令行文件传输工具,与部分兼容。 exodus-rsync不是通过rsync协议传输内容,而是通过上传和发布内容。 有关 -rsync如何与Exodus CDN项目系列中的其他...

    exodus-standalone:εxodusCLI客户端用于本地分析

    docker run -v $( pwd ) / &lt; your&gt; :/app.apk --rm -i exodusprivacy/exodus-standalone 手动使用 安装 克隆此存储库: git clone https://github.com/Exodus-Privacy/exodus-standalone.git cd exodus-standalone ...

    Metro Exodus高清壁纸新标签「Metro Exodus HD Wallpapers New Tab」-crx插件

    Metro Exodus的每个粉丝都可以获取高清壁纸的newtab背景主题 如果您希望有机会将高质量的高质量图像装饰在计算机或智能手机的桌面上,则每次打开新标签时,Metro Exodus HD Wallpapers墙纸的新标签页都有机会欣赏...

    Metro Exodus Wallpapers and New Tab-crx插件

    语言:Bahasa Indonesia,Bahasa Melayu,Deutsch,English,Filipino,Français,Kiswahili,Nederlands,Norsk,Tiếng Việt,Türkçe,catal...Metro Exodus Wallpapers和New Tab扩展程序为默认的Chrome New Tab页面带来了全

    Android代码-ExodusPrivacy

    Exodus Privacy Exodus Privacy is an Android application. Exodus Privacy application let you know what trackers are embedded in apps installed on your smartphone. It let you also know the permissions ...

    一种基于 FTDI FT2232H 的多协议硬件 工具_设计_文档_相关文件_下载

    两个例外是 Exodus Intellegence 硬件接口板,它不是开放硬件或商业可用的,以及TIMEP,它是这个项目的起源和遗产。 软件功能 一般来说,Tigard 旨在与已经支持 x232H 系列芯片的多个工具和库一起工作。这包括: ...

    Team Exodus:着眼于常见功能的改进版本和改进。-开源

    Exodus是由专业软件工程师编写的Android ROM,并得到社区贡献者的支持。 此ROM供贡献者和开发人员使用。 我们很高兴分享我们的工作,但我们并不是在这里迎合您或为您提供服务。 如果您有功能要求:编写代码。 如果要...

    exodus:审核Android应用程序使用的跟踪器的平台

    埃克索德斯 εxodus是适用于Android应用程序的隐私审核平台。 它可以检测到可能危害用户隐私的行为,例如广告,跟踪,分析等。 εxodus的官方实例可用。有助于识别跟踪器关于跟踪的所有数据都存储在 (εxodus跟踪...

Global site tag (gtag.js) - Google Analytics