子网站域名ip地址查询,浙江住房与城乡建设厅官方网站查询,企业网站域名备案流程,免费申请域名建立网站懒汉式 说白了就是你不叫我我不动#xff0c;你叫我我才动。 类初始化模式#xff0c;也叫延迟占位模式。在单例类的内部由一个私有静态内部类来持有这个单例类的实例。因为在 JVM 中#xff0c;对类的加载和类初始化#xff0c;由虚拟机保证线程安全。 public class Singl…懒汉式 说白了就是你不叫我我不动你叫我我才动。 类初始化模式也叫延迟占位模式。在单例类的内部由一个私有静态内部类来持有这个单例类的实例。因为在 JVM 中对类的加载和类初始化由虚拟机保证线程安全。 public class Single {private Single() {}private static class InitData{private static Single single new Single();}public static Single getSingle(){return InitData.single;}
}延迟占位模式还可以用在多线程下实例域的延迟赋值以避免并发访问时可能导致的问题。 举个例子如下
假设我们有一个实例域需要在首次访问时进行初始化我们希望在多线程环境下进行延迟初始化同时保证线程安全。 public class LazyInitializationExample {private ExpensiveObject expensiveObject; // 需要延迟初始化的对象public ExpensiveObject getExpensiveObject() {if (expensiveObject null) { // 未初始化时进行延迟初始化synchronized (this) {if (expensiveObject null) { // 双重检查避免多线程下重复初始化expensiveObject new ExpensiveObject();}}}return expensiveObject;}
}在这个例子中ExpensiveObject是一个开销较大的对象我们希望在首次访问时进行初始化。我们使用了双重检查的方式在未初始化时进行同步并在同步块内再次检查是否已经被初始化以避免多线程下重复初始化的问题。
这样在多线程环境中不同线程在首次访问getExpensiveObject方法时会根据expensiveObject是否为空进行延迟初始化并通过同步块保证线程安全。这就是一个在多线程环境下使用延迟占位模式进行实例域的延迟赋值的例子。 饿汉式 说白了就是你不叫我动我都要动。 在声明的时候就 new 这个类的实例或者使用枚举也可以。 public class EagerSingleton {// 在类加载时进行初始化private static EagerSingleton instance new EagerSingleton();// 私有构造方法避免外部创建实例private EagerSingleton() {}// 获取单例实例的静态方法public static EagerSingleton getInstance() {return instance;}// 其他成员方法public void doSomething() {System.out.println(Singleton is doing something.);}
}