静态内部类的单例模式
时间: 2024-08-12 09:03:56 浏览: 55
静态内部类的单例模式是一种利用Java的类加载机制来保证线程安全地创建单例的一种实现方法。由于每个类只会在第一次被引用时加载,所以静态内部类的单例在多线程环境中天然具备原子性,不需要额外的同步措施。
创建静态内部类单例的步骤通常是这样的:
1. 将单例作为静态内部类的一部分,这样该类仅有一个实例,因为它随着包含它的类一起加载。
2. 单例暴露为外部访问的一个私有静态成员变量,通过类的静态方法返回,确保外部只能通过唯一的方式获取到实例。
3. 通常初始化方法(如构造函数)设置为`private`,防止直接实例化。
示例代码如下:
```java
public class Singleton {
private static class SingletonInnerClass {
private static final Singleton INSTANCE = new Singleton();
// 私有构造函数防止从外部实例化
private SingletonInnerClass() {}
}
// 获取单例的公共方法
public static Singleton getInstance() {
return SingletonInnerClass.INSTANCE;
}
}
```
相关问题
静态内部类单例模式
静态内部类单例模式是一种线程安全的单例模式,它利用了 Java 的语言特性:静态内部类只有在被引用时才会被加载,且类加载是线程安全的,因此可以避免多线程并发访问单例对象时出现的线程安全问题。
下面是一个示例代码:
```java
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
在这个示例中,私有的构造方法保证了 Singleton 类不能在外部被实例化,getInstance() 方法返回的是静态内部类 SingletonHolder 的 INSTANCE 属性,这个属性在 SingletonHolder 类被加载时就被初始化了,而 SingletonHolder 类的加载是在调用 getInstance() 方法时才会被加载,因此实现了懒加载的效果。
由于静态内部类的加载是线程安全的,因此在多线程并发情况下也能保证单例的唯一性和线程安全性。
Kotlin 实现静态内部类单例模式
好的,以下是 Kotlin 实现静态内部类单例模式的示例代码:
```kotlin
class Singleton private constructor() {
companion object {
val instance: Singleton by lazy { SingletonHolder.INSTANCE }
}
private object SingletonHolder {
val INSTANCE = Singleton()
}
}
```
在上面的代码中,我们定义了一个 Singleton 类,并将其构造方法私有化,以确保该类无法被外部实例化。然后,在该类中定义了一个内部类 SingletonHolder,它是一个私有的、静态的、懒加载的单例对象。最后,我们通过 companion object 关键字定义了一个伴生对象 instance,它是 SingletonHolder.INSTANCE 的一个引用,可以让外部代码访问该单例对象。
这种实现方式具有线程安全、懒加载、简单明了等优点,是一种比较常用的单例模式实现方式。
阅读全文