单示例设计模式意味着整个系统中只能有一个示例,例如日志对象。我们经常说有两种饥饿和懒惰的样式可以创建一个示例。今天,我们将扩大思考并查看更多。
首先,如果我们只想一个只有一个对象的类,那么我们必须首先将构造函数私有化并打破使用构造函数在其他类中创建实例的想法。我们不能在其他类中创建一个实例,我们只能创建一个私有课程中的实例,我们必须提供一种通用方法来获取其他对象来获取实例。因此,第一版出现。
1 [饥饿汉 - 风格的V1]
加载课时创建一个示例
不要忘记在多线程环境中是否有一个安全的相关线程。我将在此处提供注释。@threadSafe表示线程是安全的,@notthreadsafe表示线程不安全。
上述方法相对简单,是最简单的思考方法。有一个缺点。如果不使用此对象,那有点浪费。该对象可能无法使用,但我们已经创建了它。
2 [饥饿汉 - 风格的V2]
该方法是使用一次加载的静态代码块“实现单个情况的创建。它非常简单且知名度很好。问题与饥饿的Han样式相同。
3 [懒惰中文V1]
只需在使用对象时创建示例
在单个线程中,以这种方式没有问题,但是在多线程时会出现问题。如果进入IF后悬挂螺纹A,则螺纹B仍然可以输入IF并返回实例。此时,当A再次执行时,它返回另一个实例。
4 [懒惰中文V2]
将同步关键字添加到共同方法中以同步该方法。它是可行的,但不建议使用,因为在同步修改方法之后,只有一个线程可以同时执行该方法。一旦获得线程,其他线程就需要等待,以便将大量时间浪费并降低系统操作效率。
5 [懒惰中文V3]
该方法使用双重检测 +来防止说明重新安排以确保线程安全性。首先,重要的是要注意,在Getinstance方法中,我们需要双层次检测并使用同步代码块来同步创建对象的过程。
因为在新的singletonexample4()过程中,它不是原子操作,因此可以进一步分为:
1.分发对象存储空间
内存=分配()
2.初始化对象
initinstance()
3.设置实例以指向新分配的内存
实例=内存
在多线程的情况下,以上三个说明将通过说明进行分类。[JVM和CPU指令优化]结果可能是:::::
内存=分配()
实例=内存
initinstance()
目前,如果执行到指令重新排列后的第三步,则可能有一个线程A,但不是初始化的,但存在地址值。当线程B在外层中判断时,返回实例将直接是直接的。仅地址值但不初始化的示例。
为了防止说明引起的问题,我们可以使用挥发性关键字来防止re -row的指令。该线程是安全的。仅使用挥发性来根据上一版来修改实例实例。
波动性的语义是增加记忆障碍并防止说明,这已经进行了分析。
6 [使用枚举实现单个示例模式]
这是推荐的方法,因为确保比懒惰线更安全,并且比饥饿的汉风格更高。调用时只是实例对象。
7【使用静态内部类】
当Singleton类加载时,此方法不会立即激发。相反,当需要时,有必要调用getInstance方法加载SingletonInstance类以完成单例实例。
使用静态最终后,JVM将保证该实例只能初始化一次而不会更改。
@ThreadSafe
@recomge
公共类SingletoneXample7 {{{
私人singletonexample7(){}
私人静态类SingletonInstance {
私有静态最终SingletOneXample7实例= new SingletOneXample7();
}
public static singletonexample7 getInstance(){){){){)
返回singletonstance.instance;
}
}总结一下,今天我主要谈论单打模式的实现,在中间,回顾了前面提到的安全申请。