- 浏览: 2651872 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
现象描述
exodus2在启动不久后就挂住,用kill -3后发觉线程大量停在了Hashmap.get/put 方法。 原因是随意将HashMap用于多线程环境中
代码:
定义成员变量
程序是设想在第一次开始对该map变量进行初始化
线程1:
线程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/
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/
发表评论
-
JVM锁实现探究:synchronized初探
2014-03-26 12:40 5879原文: http://www.majin163.com/2 ... -
ThreadPoolExecutor入门
2013-08-21 16:09 966一、corePoolSize和maximumPoolSiz ... -
SynchronousQueue
2013-07-07 22:02 1567SynchronousQueue 一种阻塞队列,其中每个 ... -
深入JVM锁机制2-Lock
2013-07-07 00:47 870前文(深入JVM锁机制-synchronized)分析了JV ... -
深入JVM锁机制1-synchronized
2013-07-07 00:34 907目前在Java中存在两种锁 ... -
java与python多线程wait,notify操作比较
2013-07-06 23:36 2229wait 和notify的应用场景 在学习wait,no ... -
Java中容易踩到的“坑”系列之线程池篇
2013-03-29 13:49 2846原文:http://hellojava.info ... -
淘宝工程师分享并发系列文章
2012-12-31 00:11 28聊聊并发(一)深入分析Volatile的实现原理 ... -
一种高效无锁内存队列的实现
2012-11-25 02:20 96Disruptor是LMAX公司开源的一个高效的内存无 ... -
HashTable, hashmap ,ConcurrentHashMap
2012-11-18 23:20 1075http://www.ibm.com/developerwor ... -
并发编程文档集合
2012-11-04 21:54 0【并发编程】深入研究并发编程 【并发编程】深入分析V ... -
并发导致计数不准确问题总结
2012-08-26 15:17 1243并发问题多多!!!! 实际已经395个参与者了,页 ... -
并发的常见问题和对应的解决方案
2012-08-29 18:22 10951、 最简单的,页面的《提交》按钮,在点击后(校 ... -
java多线程学习
2012-02-07 16:31 1010CyclicBarrier 在java多线程中,很多时候需要 ...
相关推荐
Exodus是一款基于Delphi编程语言开发的即时通讯软件的源代码,它能够与Jabberd2服务器进行通信。在本文中,我们将深入探讨Exodus的源代码结构、Delphi编程语言、Jabber协议、Jabberd2服务器以及即时通讯的相关知识点...
2. **BUILDING EXODUS 的硬件KEY (软件狗)**:用于授权许可的关键设备,确保软件只能在合法授权的计算机上运行。 3. **技术支持**:提供了技术支持的相关信息,包括联系方式、支持范围等。 4. **信息反馈**:鼓励...
### BUILDING_EXODUS 使用指南知识点详述 #### 一、概述 《BUILDING_EXODUS 使用指南》是一份详尽介绍了如何使用BUILDING_EXODUS软件的文档,旨在帮助用户更好地理解和掌握这款用于模拟人群疏散过程的专业软件。...
2. **分析二进制**:运行`Python-Exodus`对源系统上的ELF文件进行分析,获取其依赖和重定位信息。 3. **重定位**:将分析结果应用到目标系统上的相同或相似的ELF文件,调整其内部地址以匹配新的运行环境。 4. **...
资源分类:Python库 所属语言:Python 资源全名:pubtools_exodus-0.1.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
exodus20.github.io
2. **加密通信**:Exodus支持端到端的加密,确保聊天内容的隐私和安全。 3. **联系人管理**:用户可以创建和管理联系人列表,设置不同的分组,方便查找和沟通。 4. **文件传输**:能够与联系人之间发送文件,支持大...
将用gmsh编写的网格转换为exodus II格式,该格式用于常见的仿真工具(如 引用代码 您是否出于研究目的使用此代码? 请花点时间使用此DOI引用它: 用法: python convert.py -i input.msh -o output.g 请注意, 与 ...
由生存游戏迷们制作的Metro Exodus高清壁纸的新Tab主题,专为Metro Exodus的粉丝而设计。 METRO EXODUS NEW TAB-由FreeAddon提供安装我的Metro Exodus New Tab主题,并在每次打开新标签时享受Metro Exodus的各种高清...
Exodus Project是一款MMO游戏,在持续的太空世界中融合了动作,策略和RPG。 它使用Crystal Space 3d,并且可以在Win32和Linux下运行。
本文重点介绍了思科的Cisco CSS 11000系列内容服务交换机如何帮助网站运营商Exodus提升竞争力。这种交换机专为应对高流量网站的需求而设计,通过智能地管理和分发网络内容,确保了网站性能的高效和稳定。 首先,...
用于rsync的exodus-aware替代产品。 概述 exodus-rsync是一个命令行文件传输工具,与部分兼容。 exodus-rsync不是通过rsync协议传输内容,而是通过上传和发布内容。 有关 -rsync如何与Exodus CDN项目系列中的其他...
docker run -v $( pwd ) / < your> :/app.apk --rm -i exodusprivacy/exodus-standalone 手动使用 安装 克隆此存储库: git clone https://github.com/Exodus-Privacy/exodus-standalone.git cd exodus-standalone ...
Metro Exodus的每个粉丝都可以获取高清壁纸的newtab背景主题 如果您希望有机会将高质量的高质量图像装饰在计算机或智能手机的桌面上,则每次打开新标签时,Metro Exodus HD Wallpapers墙纸的新标签页都有机会欣赏...
语言: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页面带来了全
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 ...
两个例外是 Exodus Intellegence 硬件接口板,它不是开放硬件或商业可用的,以及TIMEP,它是这个项目的起源和遗产。 软件功能 一般来说,Tigard 旨在与已经支持 x232H 系列芯片的多个工具和库一起工作。这包括: ...
Exodus是由专业软件工程师编写的Android ROM,并得到社区贡献者的支持。 此ROM供贡献者和开发人员使用。 我们很高兴分享我们的工作,但我们并不是在这里迎合您或为您提供服务。 如果您有功能要求:编写代码。 如果要...
埃克索德斯 εxodus是适用于Android应用程序的隐私审核平台。 它可以检测到可能危害用户隐私的行为,例如广告,跟踪,分析等。 εxodus的官方实例可用。有助于识别跟踪器关于跟踪的所有数据都存储在 (εxodus跟踪...