类生命周期:

  1. classloader将字节文件加载到jvm内存
  2. 链接(校验,准备,解析),其中准备阶段将静态变量赋予默认值
  3. 初始化过程将静态变量赋值(赋值过程按指令顺序执行)
  4. 垃圾回收GC

单例:

  1. 将构造方法私有,并提供获取实例方法,实例为静态变量
  2. 获取实例方法需要两重判断才能使得多线程安全获得单例(先判断变量为是否为空,若空,则将类加锁,然后再次判断变量是否为空,才能进行生成一个新实例),因为A线程在拿到变量为空到准备加锁过程中,B线程可能已经拿到锁进行实例化,并退出,故A线程再次进入,如果不判断变量为空,则会再次生成新实例
  3. 为了更完美生成单例,还需要将1中的静态变量加上volatile关键字修订,虽然它不能控制并发,但是它能让变量在多线程中可见,并且禁止指令重排序,假如赋值指令和初始化指令可被重排,就容易造成成员变量赋值时机不对的情况。

k00baa
325 声望16 粉丝

BUG


« 上一篇
11本Java好书