- 浏览: 3056107 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
昨天在用findbugs扫我们的代码时看到了类似这样的bug提示:(嗯……真的方法名忽略吧)
那段代码看起来与下面的Foo.bar()类似:
可以看到输出经常是:
嗯,在synchronized块里用了Thread.sleep(),是很邪恶。正准备看看有没有什么办法去修一下,突然发现更糟糕的问题是那synchronized块完全是废的:每次Foo.bar()被调用的时候,“key”都是一个新生成的String对象;于是锁住的根本不是同一个对象,实际上没达到锁的目的。
如果把“+”去掉,并且确保输入的参数是指向同一个String对象(Java里字符串字面量由VM保证会被intern),再看程序的行为就很不同了:
输出总是:
然而String这东西,普遍来说在运行时即便equals也无法保证是“同一对象”,所以这代码本身的设计就很有问题,不光是在Thread.sleep()上了。
诶,生产力就消磨在起JBoss,看错误log,关JBoss刷Maven,改代码,刷Maven来build然后再起JBoss……而且遗留下来的问题各种诡异。findbugs默认抓的虫也还不够多 =_=|||| =o) TvT||||
诶其实我遇到的那段代码根本不用锁,也不用Thread.sleep()...纯粹是原本的代码逻辑有问题而已。
findbugs 写道
Bug: alpha.beta.charlie.Foo.bar(String) calls Thread.sleep() with a lock held
Pattern id: SWL_SLEEP_WITH_LOCK_HELD, type: SWL, category: MT_CORRECTNESS
This method calls Thread.sleep() with a lock held. This may result in very poor performance and scalability, or a deadlock, since other threads may be waiting to acquire the lock. It is a much better idea to call wait() on the lock, which releases the lock and allows other threads to run.
Pattern id: SWL_SLEEP_WITH_LOCK_HELD, type: SWL, category: MT_CORRECTNESS
This method calls Thread.sleep() with a lock held. This may result in very poor performance and scalability, or a deadlock, since other threads may be waiting to acquire the lock. It is a much better idea to call wait() on the lock, which releases the lock and allows other threads to run.
那段代码看起来与下面的Foo.bar()类似:
public class TestSync { public static void main(String[] args) throws Exception { Foo foo = new Foo(); Thread t1 = new Thread(new MyRunnable(foo)); Thread t2 = new Thread(new MyRunnable(foo)); t1.start(); t2.start(); } } class MyRunnable implements Runnable { private Foo foo; public MyRunnable(Foo foo) { this.foo = foo; } public void run() { foo.bar("alpha"); } } class Foo { public void bar(String name) { String key = name + "_"; // this will create a new "key" object every time invoked synchronized (key) { try { System.out.println("1: " + name); Thread.sleep(1000); System.out.println("2: " + name); Thread.sleep(5000); } catch (InterruptedException e) { System.err.println("interrupted"); } } } }
可以看到输出经常是:
1: alpha 1: alpha 2: alpha 2: alpha
嗯,在synchronized块里用了Thread.sleep(),是很邪恶。正准备看看有没有什么办法去修一下,突然发现更糟糕的问题是那synchronized块完全是废的:每次Foo.bar()被调用的时候,“key”都是一个新生成的String对象;于是锁住的根本不是同一个对象,实际上没达到锁的目的。
如果把“+”去掉,并且确保输入的参数是指向同一个String对象(Java里字符串字面量由VM保证会被intern),再看程序的行为就很不同了:
public class TestSync { public static void main(String[] args) throws Exception { Foo foo = new Foo(); Thread t1 = new Thread(new MyRunnable(foo)); Thread t2 = new Thread(new MyRunnable(foo)); t1.start(); t2.start(); } } class MyRunnable implements Runnable { private Foo foo; public MyRunnable(Foo foo) { this.foo = foo; } public void run() { foo.bar("alpha"); } } class Foo { public void bar(String name) { String key = name; // notice this doesn't create a new object synchronized (key) { try { System.out.println("1: " + name); Thread.sleep(1000); System.out.println("2: " + name); Thread.sleep(5000); } catch (InterruptedException e) { System.err.println("interrupted"); } } } }
输出总是:
1: alpha 2: alpha 1: alpha 2: alpha
然而String这东西,普遍来说在运行时即便equals也无法保证是“同一对象”,所以这代码本身的设计就很有问题,不光是在Thread.sleep()上了。
诶,生产力就消磨在起JBoss,看错误log,关JBoss刷Maven,改代码,刷Maven来build然后再起JBoss……而且遗留下来的问题各种诡异。findbugs默认抓的虫也还不够多 =_=|||| =o) TvT||||
评论
3 楼
liaofeng_xiao
2010-04-03
嗯,同步锁对象必须是公共对象,否则就好像每个人都有一把锁的钥匙,那这把锁也就没有存在实际意义了。。。
2 楼
RednaxelaFX
2009-12-30
icewubin 写道
建议用读写锁,全控制。
诶其实我遇到的那段代码根本不用锁,也不用Thread.sleep()...纯粹是原本的代码逻辑有问题而已。
1 楼
icewubin
2009-12-30
建议用读写锁,全控制。
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16316以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10482先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22419(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21890之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48421刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
词类活用是文言文的一个显著特点,诸如“舞幽壑之潜蛟”中的“舞”,使动用法表示“使……起舞”。理解词类活用有助于学生更精确地理解句子结构和意义,从而提高其文言文阅读和翻译的准确性。 “之”的用法在文言文...
安装了网吧语音呼叫的软件久了,发现这样一个问题:服务员、技术员服务态度不是非常好,客户经常乱按呼叫,网吧里呈现的不是往日的温馨,而且是一个让人烦燥的环境…… 网吧语音服务中心是一套全新的软件,它拥有...
7. 阅读理解:通过课外类文阅读《春天的柳絮》,学习如何从文章中提取信息,找寻比喻句(如“它们有的好似雪花吹来,有的像正在演习的伞兵,还有的像天上的云朵……”)和拟人句(如“它们随风在地上迅速地乱滚着,...
例如,“故天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为”,这句话中,“故”、“必”、“所”等关键字的准确理解,对于掌握文言文的修辞手法至关重要。此外,通假字的识别也是...
6. 时间表达:第六段中,“It has been one year after Miss Green came” 应改为 “It has been one year since Miss Green came”,since引导的时间状语从句常与完成时态搭配,表示“自从……以来”。 7. 语言...
":凶暴的官吏来到我们乡里,到处乱叫乱闯,闹得鸡犬不宁。 - "殚其地之出,竭其庐之入。":他们用尽了地里的产出,榨干了家里的收入。 - "退而甘食其土之有,以尽吾齿。":回家后心满意足地吃着自己土地上的产物...
“望峰息心”的“息”是使动用法,意为使……平息,即看到山峰使人心境平和。 8. 从听觉角度描绘富春江的迷人景色的句子是:“泉水激石,泠泠作响,好鸟相鸣,嘤嘤成韵。蝉则千转不穷,猿则百叫无绝。”这些句子...
年来,A 市大搞形象工程,耗资巨大,然而市民的文明素质并没有同步提高,交通违规、乱丢垃圾等现象普遍存在。这说明了什么?给我们什么启示? 答:这说明城市文明建设不能仅仅停留在物质层面的建设,还需要精神文明...
1、新增填写简历同步上传照片功能; 2、新增邮件模板及内容管理模块,管理员可设置邮件通知的具体内容; 3、后台批量刷新过期企业、过期职位功能; 4、新增自定义消费项目添加、管理功能(会员自主购买); 5、...
那样会很乱很难。本系统就是针对 这个情况还产生的。系统可以在线管理。只要你是管理员。你可以在家管理电教资料。如果你是单位用 户。你可以在家查询资料在不在。有没有借出。而且。本系统还有新到电教资料介绍。...
“亲”在“故人不独亲其亲”中,前一个“亲”表示以……为亲,后一个“亲”则指父母亲。 3. 主题解说: “大同”社会是一个理想化的社会模型,其中强调了对所有人的关爱、公平分配资源以及和谐共处。它表达了作者对...
“望峰息心”的“息”使动用法,表示“使……平息”。 8. 从听觉角度描绘富春江的句子有:“泉水激石,泠泠作响,好鸟相鸣,嘤嘤成韵。蝉则千转不穷,猿则百叫无绝。”这些句子生动地描绘了鸟鸣泉响的自然和谐之音...
标记所有你正在开发的网络应用程序的实例,这样你就永远不会弄乱一个错误的程序。 您是网页开发人员吗? 熟悉同时从事大量项目吗? 当然,您正在使用版本控制来简化协作和部署过程,但是在浏览器中查看同一应用程序...
1.超级家庭影院:新颖的媒体播放器,能够四画面同步播放电影。 2.家庭卡拉OK:在电脑上唱卡拉OK歌曲最有情趣。您别忘了首先要在声卡上安装一个微型麦克风…… 3.Flash影院:非常实用的FLASH 媒体播放器,可以象...
实验一 程控交换原理实验系统及控制单元实验 一、 实验目的 1、熟悉该程控交换原理实验系统的电路组成与主要部件的作用。 2、体会程控交换原理实验系统进行电话通信时的工作过程。 3、了解CPU中央集中控制处理器...