单例模式

2018-03-26  本文已影响0人  Charein

确保类只有一个实例,并且提供一个全局访问点。

下面看一个最简单的单例代码:

public class Single {
    private static Single INSTANCE;

    private Single() {
    }

    public static Single getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Single();
        }

        return INSTANCE;
    }
}

上面的代码在多线程下会出现问题,如果要考虑多线程,可以使用sychronized同步方法,如:

public class Single {
    private static Single INSTANCE;

    private Single() {
    }

    public synchronized static Single getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Single();
        }

        return INSTANCE;
    }
}

如果仔细分析,可知每次调用getInstance()方法都会被阻塞(不论INSTANCE是否已经实例化,其实被实例化之后不需要再进行同步),这时可采用同步代码块的方式,如:

public class Single {
    private static Single INSTANCE;

    private Single() {
    }

    public static Single getInstance() {
        if (INSTANCE == null) {
            synchronized (Single.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Single();
                }
            }
        }

        return INSTANCE;
    }
}

上述的方式都是通过延时实例化,如果不考虑提前创建的负担,可以使用这种方式(它保证了线程安全)

public class Single {
    private static Single INSTANCE = new Single();

    private Single() {
    }

    public static Single getInstance() {
        return INSTANCE;
    }
}
上一篇下一篇

猜你喜欢

热点阅读