单例模式(懒汉式)



以下方式均不推荐开发使用,仅供学习

I. 线程不安全的懒汉式

package singleton;

/**
 * 懒汉式(懒汉式-线程不安全)
 */
public class Singleton_3 {

    private static Singleton_3 instance;

    private Singleton_3(){}

    // 对外提供一个静态方法。 仅有在被使用时才创建
    public static Singleton_3 getInstance() {
        if (instance == null) {
            instance = new Singleton_3();
        }

        return instance;
    }
}

优点

  • 不会造成内存浪费,因为只有在被使用时才开始创建实例

缺点

  • 为何线程不安全?
  • 答: 因为在多线程的情况下,一个线程进入了if(instance == null)判断语句块,还未来得及执行,另一个线程也来到了这个判断语句,这时会产生多个实例,所以多线程模式下不可使用这种方式。

II. 线程安全的懒汉式

package singleton;

/**
 * 懒汉式(懒汉式-线程安全)
 */
public class Singleton_4 {

    private static Singleton_4 instance;

    private Singleton_4(){}

    // 对外提供一个静态方法。 仅有在被使用时才创建
    // 加入 synchronized 关键字, 解决线程安全问题
    public static synchronized Singleton_4 getInstance() {
        if (instance == null) {
            instance = new Singleton_4();
        }

        return instance;
    }
}

优点

  • 相较于 I 实现了线程安全

缺点

  • 效率低下,每个线程在想获得类的实例的时候,执行getInstance()都要去同步一下。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容