JAVA 设计模式(一) – 单例模式

篇文章主要讲下android 创建设计模式中的单例模式.

单例模式保证一个类只有一个实例,并提供一个访问实例全局节点.

它的实现有多种实现方式:

1: 饿汉

饿汉式:类加载时就创建实例 . 支持延迟加载实例

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

2: 懒汉

懒汉式: 使用时才创建实例. **支持延迟加载 **.缺点 : getInstance 使用synchronize 实现线程同步,导致这个方法并发很低,每次调用都会频繁的枷锁、释放锁

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3:双重校验

public class Singleton {
    private volatile static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

这里注意成员变量 instance使用volatile修饰,作用就是禁止指令排序.

指令重排是指在不改变程序执行结果的前提下,CPU为了提高程序执行效率可能会对指令的执行顺序进行调整.

如上述代码,instance = new Singleton(); 实际执行了三步操作:

  1. 分配内存空间

  2. 初始化对象

  3. 对象指向分配内存空间

    如果不使用volatile 这个步骤就会出现1-3-2的顺序,从而导致其他线程获取到一个未初始化对象.

volatile关键字可以确保变量的可见性和禁止指令重排。当一个变量volatile修饰时,编译器处理器会注意到这个变量共享的,因此不会将该变量所在的代码块进行指令重排。这样就可以避免由于指令重排导致的线程安全问题

4:内部

public class Singleton {
    private Singleton() {}
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

5:枚举

public enum Singleton {
    INSTANCE;
}

原文地址:https://blog.csdn.net/qq_23025319/article/details/134749001

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_31082.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注