单例模式代码 demo
时间: 2024-11-06 20:11:56 浏览: 6
单例模式是一种常用的软件设计模式,它的目的是保证一个类只有一个实例,并提供全局访问点。下面是一个简单的Java单例模式的实现示例:
```java
public class Singleton {
// 私有化构造函数,防止外部直接创建实例
private Singleton() {}
// 创建唯一实例并返回
public static Singleton getInstance() {
if (instance == null) { // 判断是否已有实例
synchronized (Singleton.class) { // 使用同步块避免多线程并发问题
if (instance == null) { // 双重检查锁定
instance = new Singleton(); // 如果无实例,则创建
}
}
}
return instance; // 返回唯一实例
}
// 其他成员方法...
}
```
在这个例子中,`Singleton` 类只有一个 `getInstance()` 方法,该方法通过双重检查锁定确保在多线程环境下的线程安全。这是最经典的懒汉式单例模式,如果需要延迟加载,可以将其放在静态初始化块中。
相关问题
单例模式 demo java
下面是一个简单的饿汉式单例模式的 Java 示例代码:
```
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
```
在上面的代码中,Singleton 类只有一个私有的构造函数和一个静态的 instance 对象。在静态代码块中,我们实例化了这个对象。getInstance() 方法返回这个唯一的实例。
这种方式虽然非常简单,但是存在一些问题。例如,如果 Singleton 类的构造函数包含一些复杂的逻辑或者需要传入参数,那么这种方式就无法满足需求了。
下面是一个懒汉式单例模式的 Java 示例代码:
```
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
在上面的代码中,getInstance() 方法在第一次调用时才会创建实例。我们使用了 synchronized 关键字来实现线程安全。但是这种方式可能会影响性能,因为每次调用 getInstance() 方法都需要进行同步。
单例模式 线程安全 demo java
下面是一个线程安全的懒汉式单例模式的 Java 示例代码:
```
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
在上面的代码中,我们使用了双重检查锁定来确保线程安全。当 instance 为 null 时,多个线程可能同时进入第一个 if 语句块中,但是只有一个线程能够获得 Singleton.class 的锁,进入第二个 if 语句块中创建实例。当第一个线程创建完实例并释放锁时,后续的线程就可以直接返回已经创建好的实例了。
注意,我们使用了 volatile 关键字来修饰 instance,保证多线程环境下的可见性。此外,双重检查锁定在 JDK1.5 之前可能会存在问题,因为 Java 的内存模型在 JDK1.5 之前没有明确规定,因此可能会出现指令重排序的问题。但是在 JDK1.5 及之后的版本中,双重检查锁定是可以正常工作的。
阅读全文