详解Java设计模式之单例模式
1. 什么是单例模式?
单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。
2. 何时使用单例模式?
当我们需要确保某个类只能有一个实例,并且该实例必须全局可访问时,我们可以使用单例模式。
3. 如何实现单例模式?
单例模式的实现一般包括两个步骤:
3.1 将类的构造器私有化
为了保证只有一个实例,我们需要阻止其他代码实例化该类,可以通过将类的构造器私有化来实现。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
上面代码中,Singleton
类的构造器被私有化了,因此其他类无法通过new关键字实例化它。同时,该类定义了一个静态变量instance
,并提供了一个公有的静态方法getInstance
来获取该变量。
3.2 提供静态方法返回该类的唯一实例
在上面的Singleton
类中,getInstance()
方法返回该类唯一的实例,它是一个公有静态方法,其他代码可以通过它来获取唯一的实例。
4. 示例说明
下面我们通过两个示例来说明单例模式:
4.1 示例一:单线程下的单例模式
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
// 示例用法
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); // true
在单线程的环境中,单例模式的实现通常是最简单的,我们只需要在构造函数中将实例创建出来并提供一个静态方法来获取该实例即可。在上面的示例中,getInstance()
方法中使用了懒汉式的单例模式实现,即第一次调用该方法时会判断实例是否被创建出来,如果没有则创建。
4.2 示例二:多线程下的单例模式
在多线程的环境下,单例模式需要考虑线程安全的问题。下面是一个使用双重检查锁定(Double-Check)的单例模式实现:
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;
}
}
// 示例用法
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); // true
上面代码中,getInstance()
方法使用了双重检查锁定来保证线程安全,即先判断实例是否被创建出来(第一个if),如果没有,则进入同步代码块,再次判断实例是否被创建出来(第二个if),如果没有,则创建实例。使用volatile
关键字可以保证在多线程环境下,对变量进行读操作时,总能获取最新的值,从而避免因为多个线程访问同一个变量而造成的不一致问题。
参考资料
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java设计模式之单例模式 - Python技术站