标签:
在Java 并发编程书里有个例子程序清单3-7 谈到 this escape。 开始没有想明白, 仔细琢磨了些时间发现代码主要的问题是在建构函数中创建了一个匿名类,然后发布了这个匿名类。
这段代码如果被 编译,然后JD-GUI 反编译看到得 doSomething(e); 就会变成
ThisEscape.this.doSomething(e); 这个应该是 java inner class 调用外部class的标准方式 - 外部类名.this.方法名
如果进一步的深究, 我们知道 ThisEscape编译后会有两个class 文件。一个是 ThisEscape.class, 另个一个会是 ThisEscape$1.class 给这个匿名类。
它们的内容差不多是这个样子的
这样如果 new ThisEscape$1(this) 在另外的线程中被执行的话, 就可能导致 逃逸出去的this 的 num 还没有 执行 num = 42; Race condition detected 会不时的显示在console 里面。
标签:
原文地址:http://www.cnblogs.com/binyue/p/4384006.html