Android--Incorrect lazy initialization of static field.

Posted chaoyu168

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android--Incorrect lazy initialization of static field.相关的知识,希望对你有一定的参考价值。

private static ActivityLifeManager sInstance;
 
public static ActivityLifeManager getInstance() 
    if (sInstance == null) 
        sInstance = new ActivityLifeManager();
    
    return sInstance;

主要原因是线程安全问题。多线程有可能会对该方法调用造成实例化多次。在该方法加synchronized。

双重加锁可能存在的一个问题:

例如线程1已经分配了地址给instance 但是还没有初始化, 此时线程2 判断intance不是null 直接返回

解决:
volatile的:禁止指令重排序优化,也就保证了instance变量被赋值的时候对象已经是初始化过的,从而避免了上面说到的问题。

最终改为:

private static volatile ActivityLifeManager sInstance;
 
public static ActivityLifeManager getInstance() 
    if (sInstance == null) 
        synchronized (ActivityLifeManager.class) 
            if (sInstance == null) 
                sInstance = new ActivityLifeManager();
            
        
    
    return sInstance;

以上是关于Android--Incorrect lazy initialization of static field.的主要内容,如果未能解决你的问题,请参考以下文章

五.Classification (I) – Tree, Lazy, and Probabilisti

I - The lazy programmer 贪心+优先队列

Lazy I/O 有啥不好?

hdu 1754 I Hate It

B Hat(线段树 - Lazy标记区间查询)

UESTC 电子科大专题训练 数据结构 C