// 当 JVM 加载 LazyLoadedSingleton 类时,由于该类没有 static 属性,所以加载完成后便即可返回。只有第一次调用
// getInstance()方法时,JVM 才会加载 LazyHolder 类,由于它包含一个 static 属性
// singletonInstatnce,所以会首先初始化这个变量,这样即实现了一个既线程安全又支持延迟加载的单例模式。
public class LazyLoadedSingleton {
private LazyLoadedSingleton() {
}
private static class LazyHolder { // holds the singleton class
private static final LazyLoadedSingleton singletonInstatnce = new LazyLoadedSingleton();
}
public static LazyLoadedSingleton getInstance() {
return LazyHolder.singletonInstatnce;
}
}
附最简单的单例例子:
public class Singleton{
// static类型的类变量,只会赋值一次,保证线程安全
// 或将赋值语句放到静态代码块中,即 static {...}
private static Singleton instance = new Singleton();
// other fields...
// 构造方法为私有
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
// other methods
}
from:漫谈设计模式
分享到:
相关推荐
懒汉式单例解决了饿汉式单例在未使用时即占用资源的问题,采用延迟加载机制,在第一次调用 `getSingleInstance()` 方法时才创建对象。然而,这种方式存在线程安全问题,当多个线程几乎同时调用 `getSingleInstance...
在多线程环境下,线程安全的单例模式尤为重要,因为如果不正确实现,可能会导致多个线程同时创建多个实例,违反了单例模式的基本原则。 在Java中,单例模式通常有以下几种实现方式: 1. 饿汉式(静态常量): ...
DCL模式结合了两者优点,既保证了线程安全,又实现了延迟初始化。 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建对象时,我们不会对客户端暴露创建逻辑,而是提供一个接口...
.NET框架提供了一个内置的Lazy类,可以方便地实现线程安全的延迟初始化单例。 ```csharp public class Singleton { private static readonly Lazy<Singleton> lazy = new Lazy(() => new Singleton()); ...
接下来是**双重检查锁定(Double-Check Locking)**,它结合了懒汉式和饿汉式的优点,既延迟初始化,又保证了线程安全。代码如下: ```java public class Singleton { private volatile static Singleton instance...
综上所述,“静态内部类法”是一种既简单又高效的实现线程安全单例的方式。它不仅解决了多线程环境下的线程安全问题,还充分利用了 Java 的类加载机制实现了延迟加载,避免了不必要的内存消耗。对于那些需要频繁访问...
利用类加载机制保证单例,既延迟初始化,又线程安全。 ```java public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new ...
在Java中,可以使用静态内部类的方式实现饿汉式单例,这样既能保证线程安全,又能避免无用的初始化。 3. **静态工厂方法**: 除了构造函数,还可以通过静态工厂方法来获取单例对象,这种方法可以提供更大的灵活性...
由于类加载机制保证了静态内部类的加载是线程安全的,所以这种方法既实现了延迟初始化,又保证了线程安全。 3. **枚举单例模式** ```java public enum Singleton { INSTANCE; } ``` 利用 Java 枚举的天然线程...
总的来说,单例模式是一种常见的设计模式,懒汉式单例模式则是其中一种实现策略,它的主要特点是延迟加载和线程安全。在选择单例模式实现时,开发者需要根据具体需求考虑性能、线程安全以及代码简洁性等因素。
这种方式既实现了延迟加载,又避免了不必要的同步开销。 ```java public class Singleton { private volatile static Singleton instance = null; private Singleton() {} public static Singleton ...
单例模式是一种设计模式,它的...总的来说,单例模式的实现需要考虑线程安全、性能、延迟初始化等多种因素。选择哪种实现方式取决于具体的应用场景和需求。理解并正确使用单例模式对于构建高效、稳定的系统至关重要。
通过一个静态内部类持有单例实例,内部类的加载时机延迟到第一次调用`getInstance()`时,实现了懒加载,同时也保证了线程安全,因为类加载是线程安全的。这种方式避免了同步开销,但增加了类加载的复杂性。 5. **...
这种方式在类加载时创建单例,但由于单例创建在静态内部类中,所以只有在调用`getInstance()`时才会加载`SingletonHolder`,实现了延迟初始化,同时也保证了线程安全。 3. **同步枷锁**(Synchronized):在多线程...
3. **双重检查锁定(DCL,Double Check Locking)单例模式**:结合了饿汉模式和懒汉模式的优点,既延迟了初始化,又保证了线程安全。在多线程环境下,只有在`instance`为`null`时才会进入同步块,避免了不必要的同步...
利用Java类加载机制保证单例的唯一性,线程安全且延迟初始化。 ```java public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE ...
- 优点:线程安全,延迟加载,避免不必要的同步。 - 缺点:实现相对复杂,需要注意JMM内存模型的影响。 5. **枚举单例**:利用枚举类型实现单例模式。 - 优点:简洁高效,线程安全,延迟加载。 - 缺点:使用...
- **特点**:结合了饿汉式和懒汉式的优点,既实现了延迟加载,又避免了多线程的同步问题,是一种比较推荐的方式。 #### 四、什么情况下使用单例模式? - **控制资源的使用**:通过线程同步来控制资源的并发访问,...