- 浏览: 2594954 次
- 来自: 杭州
文章分类
- 全部博客 (1190)
- webwork (4)
- 网摘 (18)
- java (104)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (15)
- 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 (8)
- 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)
最新评论
-
Aqu415:
,默认是netty还是hassion?
dubbo入门 -
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介
现象描述
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 5815原文: http://www.majin163.com/2 ... -
ThreadPoolExecutor入门
2013-08-21 16:09 912一、corePoolSize和maximumPoolSiz ... -
SynchronousQueue
2013-07-07 22:02 1530SynchronousQueue 一种阻塞队列,其中每个 ... -
深入JVM锁机制2-Lock
2013-07-07 00:47 844前文(深入JVM锁机制-synchronized)分析了JV ... -
深入JVM锁机制1-synchronized
2013-07-07 00:34 871目前在Java中存在两种锁 ... -
java与python多线程wait,notify操作比较
2013-07-06 23:36 2160wait 和notify的应用场景 在学习wait,no ... -
Java中容易踩到的“坑”系列之线程池篇
2013-03-29 13:49 2778原文: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 1004http://www.ibm.com/developerwor ... -
并发编程文档集合
2012-11-04 21:54 0【并发编程】深入研究并发编程 【并发编程】深入分析V ... -
并发导致计数不准确问题总结
2012-08-26 15:17 1174并发问题多多!!!! 实际已经395个参与者了,页 ... -
并发的常见问题和对应的解决方案
2012-08-29 18:22 10311、 最简单的,页面的《提交》按钮,在点击后(校 ... -
java多线程学习
2012-02-07 16:31 980CyclicBarrier 在java多线程中,很多时候需要 ...
相关推荐
系统的BUILDING_EXODUS 使用指南
BUILDING EXODUS使用指南
exodus源代码,用delphi开发的,可以和jabberd2通讯..... <br>AnyQ就是在它的基础开发的... <br>想要AnyQ的代码吗? .....马上传给大家哈
Exodus:这个工具可以轻松地将Linux ELF二进制文件从一个系统重定位到另一个系统
资源分类:Python库 所属语言:Python 资源全名:pubtools_exodus-0.1.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
用于rsync的exodus-aware替代产品。 概述 exodus-rsync是一个命令行文件传输工具,与部分兼容。 exodus-rsync不是通过rsync协议传输内容,而是通过上传和发布内容。 有关 -rsync如何与Exodus CDN项目系列中的其他...
exodus20.github.io
由生存游戏迷们制作的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下运行。
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墙纸的新标签页都有机会欣赏...
下一代Winjab客户端。 为多种类型的Jabber用户(包括高级用户)构建的健壮的jabber客户端。 所有开发都移至:http://exodus.jabberstudio.org
语言: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是由专业软件工程师编写的Android ROM,并得到社区贡献者的支持。 此ROM供贡献者和开发人员使用。 我们很高兴分享我们的工作,但我们并不是在这里迎合您或为您提供服务。 如果您有功能要求:编写代码。 如果要...
埃克索德斯 εxodus是适用于Android应用程序的隐私审核平台。 它可以检测到可能危害用户隐私的行为,例如广告,跟踪,分析等。 εxodus的官方实例可用。有助于识别跟踪器关于跟踪的所有数据都存储在 (εxodus跟踪...
将用gmsh编写的网格转换为exodus II格式,该格式用于常见的仿真工具(如 引用代码 您是否出于研究目的使用此代码? 请花点时间使用此DOI引用它: 用法: python convert.py -i input.msh -o output.g 请注意, 与 ...
黑马java笔记源码决定退出 Freenode 的项目和频道 这是已决定永久移出 Freenode 的项目和频道的持续列表(除非另有说明)。 如果有补充或更正,例如添加引用链接,请在 IRC (siraben) 上打开一个问题,公关或 ...
网站运营商Exodu采用Cisco CSS 11000系列交换机作为客户Web服务器以及缓存集群的前端设备,能够动态实时地将内容请求重定向到最适合的站点以及服务器上,将最繁忙的内容均匀分布到整个网络中,缓解网站负载过重的...