码迷,mamicode.com
首页 > 编程语言 > 详细

[转]Java内存对象的逃逸分析

时间:2015-04-01 16:54:06      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

逃逸分析英文作Escape Analysis。在计算机语言编译器优化原理中,逃逸分析是指分析指针动态范围的方法,它同编译器优化原理的指针分析和外形分析相关联。
当变量(或者对象)在方法中分配后,其指针有可能被返回或者被全局引用,这样就会被其他过程或者线程所引用,这种现象称作指针(或者引用)的逃逸(Escape)。
 

在Java 并发编程书里有个例子程序清单3-7 谈到 this escape。 开始没有想明白, 仔细琢磨了些时间发现代码主要的问题是在建构函数中创建了一个匿名类,然后发布了这个匿名类。 

 

Java代码  技术分享
  1. import java.util.*;  
  2.   
  3. public class ThisEscape {  
  4.   private final int num;  
  5.   
  6.   public ThisEscape(EventSource source) {  
  7.     source.registerListener(  
  8.         new EventListener() {  
  9.           public void onEvent(Event e) {  
  10.             doSomething(e);  
  11.           }  
  12.         });  
  13.     num = 42;  
  14.   }  
  15.   
  16.   private void doSomething(Event e) {  
  17.     if (num != 42) {  
  18.       System.out.println("Race condition detected");  
  19.     }  
  20.   }  
  21. }  

 

这段代码如果被 编译,然后JD-GUI  反编译看到得 doSomething(e); 就会变成   

      ThisEscape.this.doSomething(e);   这个应该是 java  inner class 调用外部class的标准方式 -  外部类名.this.方法名 

 

如果进一步的深究, 我们知道  ThisEscape编译后会有两个class 文件。一个是  ThisEscape.class, 另个一个会是  ThisEscape$1.class 给这个匿名类。

 

它们的内容差不多是这个样子的 

 

 

Java代码  技术分享
  1. public class ThisEscape {  
  2.   private final int num;  
  3.   
  4.   public ThisEscape(EventSource source) {  
  5.     source.registerListener(new <strong><span style="color: #ff0000;">ThisEscape$1</span></strong>(this));  
  6.     num = 42;  
  7.   }  
  8.   
  9.   private void doSomething(Event e) {  
  10.     if (num != 42)  
  11.       System.out.println(  
  12.           "Race condition detected ");  
  13.   }  
  14.   
  15.   static void access$000(ThisEscape _this, Event event) {  
  16.     _this.doSomething(event);  
  17.   }  
  18. }  
 

 

Java代码  技术分享
  1. class ThisEscape$implements EventListener {  
  2.   final ThisEscape this$0;  
  3.   
  4.   ThisEscape$1(<span style="color: #ff0000;">ThisEscape thisescape</span>) {  
  5.     this$0 = thisescape;  
  6.     super();  
  7.   }  
  8.   
  9.   public void onEvent(Event e) {  
  10.     ThisEscape.access$000(this$0, e);  
  11.   }  
  12. }  

 

这样如果 new ThisEscape$1(this) 在另外的线程中被执行的话, 就可能导致 逃逸出去的this 的 num  还没有 执行 num = 42;   Race condition detected 会不时的显示在console 里面。

[转]Java内存对象的逃逸分析

标签:

原文地址:http://www.cnblogs.com/binyue/p/4384006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!