单例模式的使用方式
单例模式是一种常用的软件操持模式,它确保一个类只有一个实例,并提供一个全局访问点。以下是几种差别的单例模式实现方法,在Java语言中的示例代码:1. 饿汉式
这种实现方式在类加载时就立即初始化单例对象,因此称为饿汉式。它是线程安全的,由于Java包管了一个类的初始化过程是原子的。
public class SingletonHungry {
private static final SingletonHungry INSTANCE = new SingletonHungry();
private SingletonHungry() {
}
public static SingletonHungry getInstance() {
return INSTANCE;
}
}
2. 懒汉式(非同步方法)
懒汉式单例在第一次被使用时才会创建实例。这种方式简朴,但是线程不安全的,在多线程环境下须要额外的同步步调来包管线程安全。
public class SingletonLazy {
private static SingletonLazy instance;
private SingletonLazy() {}
public static SingletonLazy getInstance() {
if (instance == null) {
instance = new SingletonLazy();
}
return instance;
}
}
3. 懒汉式(同步方法)
通过将获取实例的方法声明为同步方法,可以包管在多线程环境下的线程安全。
public class SingletonLazyThreadSafe {
private static SingletonLazyThreadSafe instance;
private SingletonLazyThreadSafe() {}
public static synchronized SingletonLazyThreadSafe getInstance() {
if (instance == null) {
instance = new SingletonLazyThreadSafe();
}
return instance;
}
}
4. 双重查抄锁定
双重查抄锁定是一种在多线程环境下实现懒汉式单例的高效方式,也是线程安全的。它起首查抄实例是否已经被创建,如果没有,则进入同步块创建实例。
public class SingletonDoubleCheckedLocking {
private static volatile SingletonDoubleCheckedLocking instance;
private SingletonDoubleCheckedLocking() {}
public static SingletonDoubleCheckedLocking getInstance() {
if (instance == null) { // 第一次检查
synchronized (SingletonDoubleCheckedLocking.class) {
if (instance == null) { // 第二次检查
instance = new SingletonDoubleCheckedLocking();
}
}
}
return instance;
}
}
5. 静态内部类
这种方法使用了Java的类加载机制来实现线程安全的单例模式。静态内部类只有在第一次被使用时才会加载和初始化。
public class SingletonStaticInnerClass {
private SingletonStaticInnerClass() {}
private static class SingletonHolder {
private static final SingletonStaticInnerClass INSTANCE = new SingletonStaticInnerClass();
}
public static SingletonStaticInnerClass getInstance() {
return SingletonHolder.INSTANCE;
}
}
6. 摆列
使用摆列(enum)实现单例是最轻便也是最保举的方式,由于Java语言规范包管摆列的实例是单例的,而且是线程安全的。
public enum SingletonEnum {
INSTANCE;
public void someMethod() {
// 一些方法
}
}
总结
****是否是线程安全的饿汉式是懒汉式(非同步方法)否懒汉式(同步方法)是双重查抄锁定是静态内部类是摆列是在现实应用中,选择哪种单例实现方式取决于具体的需求和上下文环境。比方,如果实例化资本较高,可以思量使用饿汉式;如果须要耽误实例化,可以思量懒汉式或静态内部类方式。在多线程环境中,须要特殊注意线程安全标题。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]