下面我会为大家详细讲解“Java版的7种单例模式写法示例”的完整攻略。
标题一:什么是单例模式?
单例模式是一种常用的软件设计模式,在单例模式中,一个类只允许创建一个对象实例,所有其他对象都必须引用该对象实例。单例模式具有如下特点:
- 单例类只有一个实例对象。
- 该单例对象必须由单例类自行创建。
- 单例类对外提供一个访问该单例的全局访问点。
标题二:Java版的7种单例模式写法示例
下面是Java版的7种单例模式写法示例:
饿汉式(线程安全,调用效率高,但是不能延时加载)
public class Singleton1 {
private static Singleton1 instance = new Singleton1();
private Singleton1(){}
public static Singleton1 getInstance(){
return instance;
}
}
懒汉式(线程不安全,在多线程不能正常工作)
public class Singleton2 {
private static Singleton2 instance;
private Singleton2(){}
public static Singleton2 getInstance(){
if(instance == null){
instance = new Singleton2();
}
return instance;
}
}
懒汉式(线程安全,效率低,可以延时加载)
public class Singleton3 {
private static Singleton3 instance;
private Singleton3(){}
public static synchronized Singleton3 getInstance(){
if(instance == null){
instance = new Singleton3();
}
return instance;
}
}
双重校验锁(线程安全,支持延迟加载)
public class Singleton4 {
private volatile static Singleton4 instance;
private Singleton4(){}
public static Singleton4 getInstance(){
if(instance == null){
synchronized (Singleton4.class){
if(instance == null){
instance = new Singleton4();
}
}
}
return instance;
}
}
静态内部类(线程安全,调用效率高,支持延时加载)
public class Singleton5 {
private Singleton5(){}
private static class SingletonHolder{
private static final Singleton5 INSTANCE = new Singleton5();
}
public static final Singleton5 getInstance(){
return SingletonHolder.INSTANCE;
}
}
枚举(线程安全,调用效率高,不能延时加载,可以防止反射创建多个实例)
public enum Singleton6 {
INSTANCE;
public void whateverMethod(){
}
}
饿汉式(终极版,可防止反射和序列化漏洞)
public enum Singleton7 {
INSTANCE;
public void whateverMethod(){
}
private static void destroy() {
try {
Field singletonDecl = INSTANCE.getClass().getDeclaredField("INSTANCE");
singletonDecl.setAccessible(true);
singletonDecl.set(null, null);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
private Object readResolve() {
return INSTANCE;
}
static {
Runtime.getRuntime().addShutdownHook(new Thread(Singleton7::destroy));
}
}
附加说明
以上7种单例模式的写法,饿汉式、懒汉式、双重校验锁和静态内部类都属于比较常见的写法。枚举和饿汉式终极版是比较特殊的写法,不是很常用,但是使用的时候需要注意一些特殊情况。
除此之外,还需要注意到这些单例写法的优缺点。例如,饿汉式的优点是线程安全、调用效率高,缺点是不能延时加载;懒汉式的缺点在多线程情况下不能正常工作,而双重校验锁虽然线程安全,但是效率会比较低。我们在使用的时候需要根据具体的情况选择适合自己业务场景的单例写法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java版的7种单例模式写法示例 - Python技术站