- 浏览: 3016289 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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 16144以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10337先看看下面这个代码例子, 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 22258(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 21745之前有同学在做龙书(第二版)题目,做到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 48118刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
第六章 时间同步……………………………………………….……….………………….111 第七章 带时间事件的二进制输入…………………………………………………………112 第八章 文件传输……………………………………...
高中语文呱……呱……同步练习2 苏教版 必修2.doc
9 实验四:并发与调度 4.1 Windows 2000线程同步……………………………………13 4.2 Windows 2000线程间的通讯(选作)…………………….15 实验五:存储管理 5.1 提高Windows 2000内存性能(阅读)………………...
4.33 同步函数(Synchronization) ……………………………………………………745 4.34 系统信息函数(System Information)……………………………………………766 4.35 系统消息函数(System Message)……...
第六章 时间同步……………………………………………….……….………………….111 第七章 带时间事件的二进制输入…………………………………………………………112 第八章文件传输……………………………………...
6.1.2不同功用的同步………. 6.2位同步……………………. L 21 插入导领法……………. 62.2直接法 ………………. 62.3 位同步的性能指标……. 6.3 群同步……………………. 6.L1 群同步的帧格式...
4.33 同步函数(Synchronization) ……………………………………………………745 4.34 系统信息函数(System Information)……………………………………………766 4.35 系统消息函数(System Message)…………...
4.33 同步函数(Synchronization) ……………………………………………………745 4.34 系统信息函数(System Information)……………………………………………766 4.35 系统消息函数(System Message)…………...
和播放列表管理器,用于按需保存和加载(自动)播放列表、同步……以及更多实用程序。 特征 管理播放列表文件和自动播放列表。 播放列表文件链接到物理文件(.m3u8、.m3u、.pls 或 .fpl)。 自动播放列表保存为 ...
…………………… 线程同步 …………………… 事件信号 …………………… 线程区域储存空间(TLS) 21. 动态链接库 …………………… 动态链接库的基本知识 …………………… 各式各样的DLL讨论 22. 声音与...
5. 同步通信方式…………………………………………………………16 6. 通信协议…………………………………………………………………19 7. 实战串行通讯……………………………………………………………25 8. 全双工...
5. 同步通信方式…………………………………………………………16 6. 通信协议…………………………………………………………………19 7. 实战串行通讯……………………………………………………………25 8. 全双工...
5. 同步通信方式…………………………………………………………16 6. 通信协议…………………………………………………………………19 7. 实战串行通讯……………………………………………………………25 8. 全双工...
5. 同步通信方式…………………………………………………………16 6. 通信协议…………………………………………………………………19 7. 实战串行通讯……………………………………………………………25 8. 全双工...
5. 同步通信方式 …………………………………………………………16 6. 通信协议…………………………………………………………………19 7. 实战串行通讯……………………………………………………………25 8. 全双工...
java线程同步程序:消费者与生产者………………………………………………………………………………………………………………………………………………………………………………………………………………………………...