单例例子
时间: 2023-08-12 09:14:53 浏览: 74
以下是一个简单的单例类的例子,实现了一个线程安全的懒加载方式:
```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;
}
}
```
在这个例子中,构造函数被声明为私有的,确保该类不能被直接实例化。getInstance() 方法通过使用双重检查锁定来确保只有一个实例被创建,并且该实例是在需要时才被初始化的。volatile 关键字确保 instance 变量在多线程环境下的可见性。
相关问题
c++ 单例例子
以下是一个简单的 C++ 单例类的例子,同样实现了一个线程安全的懒加载方式:
```c++
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
```
在这个例子中,构造函数被声明为私有,确保该类不能被直接实例化。getInstance() 方法返回一个静态局部变量 instance 的引用,确保只有一个实例被创建,并且该实例是在需要时才被初始化的。同时,拷贝构造函数和赋值运算符被删除,防止该类被复制。这种实现方式是 C++11 中的线程安全懒加载实现方式,可以保证在多线程环境下正确创建实例。
单例模式例子
单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供一个全局访问点。
下面是一个简单的单例模式的例子:
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
在上面的例子中,我们创建了一个 Singleton 类,它只有一个私有的构造函数,以确保该类不能被直接实例化。我们使用一个静态变量 instance 来保存 Singleton 类的唯一实例。getInstance() 方法返回这个实例,如果该实例不存在,则创建一个新的实例并返回。
这个例子是线程不安全的,因为多个线程可能同时调用 getInstance() 方法并创建多个实例。为了解决这个问题,我们可以使用线程安全的双重检查锁定实现单例模式:
```java
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
在上面的例子中,我们使用 volatile 关键字确保 instance 变量被正确地初始化,同时使用双重检查锁定确保线程安全。