多线程下的单例模式+反汇编

多线程下的单例模式+反汇编

多线程下的单例模式的实现,顺便做了反汇编。

public class MySingleton {
    private static MySingleton INSTANCE;

    private MySingleton() {
    }

    public static MySingleton getInstance() {
        if (INSTANCE == null) {
            synchronized (MySingleton.class) {
                INSTANCE = new MySingleton();
            }
        }
        return INSTANCE;
    }
}
Compiled from "MySingleton.java"
public class MySingleton {
  public static MySingleton getInstance();
    Code:
       0: getstatic     #2                  // Field INSTANCE:LMySingleton; //+获得类的指定域,并压入栈顶
       3: ifnonnull     32					//+不为null时跳转到行号32
       6: ldc_w         #3                  // class MySingleton //+常量值从常量池中推送至栈顶(宽索引),推送的为地址
       9: dup  								//+复制栈顶数值,并且复制值进栈         
      10: astore_0      					//+将栈顶数值(objectref)存入当前          frame的局部变量数组中指定下标(index)处的变量中,栈顶数值出栈。这里存的是MySingleton类定义的地址
      11: monitorenter  					//+获得对象锁即MySingleton地址
      12: new           #3                  // class MySingleton //+创建一个对象,并且其引用进栈
      15: dup           					//+复制栈顶数值,并且复制值进栈
      16: invokespecial #4                  // Method "<init>":()V //+调用超类构造方法、实例初始化方法、私有方法
      19: putstatic     #2                  // Field INSTANCE:LMySingleton; //+为指定的类的静态域赋值
      22: aload_0       					//+当前frame的局部变量数组中下标为           index的引用型局部变量进栈,这里是MySingleton类定义的地址
      23: monitorexit   					//+释放对象锁
      24: goto          32					//+跳转到行号32
      27: astore_1      					//+将栈顶数值(objectref)存入当前          frame的局部变量数组中指定下标(index)处的变量中,栈顶数值出栈。
      28: aload_0       					//+当前frame的局部变量数组中下标为           0的引用型局部变量进栈
      29: monitorexit   					//+//+释放对象锁
      30: aload_1       					//+当前frame的局部变量数组中下标为           1的引用型局部变量进栈
      31: athrow        					//+将栈顶的数值作为异常或错误抛出
      32: getstatic     #2                  // Field INSTANCE:LMySingleton; //+获得类的指定域,并压入栈顶
      35: areturn       					//+从方法中返回一个对象的引用
    Exception table:
       from    to  target type
          12    24    27   any
          27    30    27   any
}

(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

comments powered by Disqus