Java中的单例模式,指的是确保一个类只有一个实例,并提供访问该实例的全局访问点。这在某些情况下非常有用,例如当有一个全局资源,如线程池、数据库连接池等,需要在应用程序的整个生命周期内保持一致时。下面是Java单例模式的写法详解。
懒汉式单例模式
实现方式
懒汉式单例模式是指在需要使用实例的时候才去创建,而不是在类加载时就创建。懒汉式单例模式可以通过两种方式实现。
1. 双重检查锁
该实现方式首先检查实例是否已经创建,如果已经创建则返回该实例,否则创建一个新的实例。此方法可以避免在每次获取实例时都进行同步,但是需要使用volatile关键字保证线程安全。具体实现方式如下:
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
2. 内部静态类
该实现方式通过内部静态类来实现懒加载。在调用getInstance()方法时,会首先加载SingletonHolder类,而SingletonHolder类会在类加载时就创建Singleton实例。利用classloader的机制来保证线程安全,创建类的实例时只有一个线程。具体实现方式如下:
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
示例说明
下面是一个基于双重检查锁来实现的懒汉式单例模式的示例:
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
饿汉式单例模式
实现方式
饿汉式单例模式是指在类加载时就创建实例。当类被加载时,静态变量会被初始化,因此可以在类加载时直接创建实例。由于在类加载时就创建实例,因此不存在多线程并发访问的问题,但是会增加系统的启动时间。具体实现方式如下:
public class Singleton {
private static final Singleton uniqueInstance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return uniqueInstance;
}
}
示例说明
下面是一个基于饿汉式单例模式的示例:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java单例的写法详解 - Python技术站