线程安全的单例模式 饿汉式
时间: 2024-04-09 19:26:43 浏览: 93
饿汉式是一种线程安全的单例模式,它的特点是在类加载时就创建了实例对象,因此也被称为静态初始化方式。下面是饿汉式的实现方式:
1. 将类的构造函数私有化,使得外部无法直接创建对象。
2. 在类内部定义一个私有的静态成员变量,用于保存唯一的实例对象。
3. 在类的静态代码块中,对静态成员变量进行初始化,创建唯一的实例对象。
4. 提供一个公共的静态方法,用于获取实例对象。
这种方式的优点是实现简单,线程安全,因为在类加载时就已经创建了实例对象。但缺点是可能会造成资源浪费,因为无论是否使用该实例对象,都会在类加载时创建。
相关问题
单例模式饿汉式、懒汉式的线程安全问题
在单例模式中,饿汉式和懒汉式都有可能存在线程安全问题。
饿汉式单例模式,指的是在类加载的时候就创建了对象实例,保证了线程安全,但是在程序启动的时候就会创建对象,如果对象比较大或者初始化比较耗时,会影响程序的启动速度。
懒汉式单例模式,指的是在需要使用对象实例的时候才创建对象,可以延迟对象的创建时间,但是这种方式在多线程环境中可能会存在线程安全问题。如果多个线程同时访问 getInstance() 方法,可能会导致创建多个对象实例的情况。
为了解决懒汉式单例模式的线程安全问题,可以使用 synchronized 关键字来保证方法的同步性,但是这样会影响程序的性能。还可以使用双重检查锁定(double-checked locking)的方式来实现线程安全的懒汉式单例模式,这种方式可以避免每次访问 getInstance() 方法都需要同步的问题,提高程序的性能。
请写单例模式(饿汉式, 懒汉式), 请再写出线程安全的单例模式
饿汉式单例模式:
```java
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
```
懒汉式单例模式:
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
线程安全单例模式:
```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;
}
}
```
在多线程环境下,如果不加 synchronized 关键字,则可能会出现多个实例的情况。为了避免这种情况,需要加上 synchronized 关键字。但是这样会导致性能下降,因为每次获取实例时都需要加锁,即使实例已经创建了。为了避免这种情况,可以使用双重检查锁定机制,即在 synchronized 关键字内部再进行一次 if 判断,这样就可以避免每次都加锁的情况。同时需要注意的是,为了避免指令重排带来的问题,需要在 instance 变量前加上 volatile 关键字。
阅读全文