- 单例模式 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
很多时候我们都需要使用单例模式,因为它只生成一个实例,减少了系统性能开销。
那么单例模式有哪些实现方法呢?
- 主要分为
- 饿汉式(线程安全,调用效率高,但是不能延时加载)
- 懒汉式(线程安全,调用效率不高,可以延时加载)
- 其它方式
- 双重检测锁式(由于JVM底层模型原因,偶尔会出现问题,不建议使用)
- 静态内部类式(线程安全,调用效率高,可以延时加载)
- 枚举单例(线程安全,调用效率高,不能延时加载)
- 饿汉式
public class SingletonDemo {
private static SingletonDemo instance = new SingletonDemo(); //类初始化时立即加载这个对象
//私有构造器
private SingletonDemo(){
}
//方法没有同步,调用效率高
public static SingletonDemo getInstance(){
return instance;
}
}
- 懒汉式(资源利用率高,并发效率低)
public class SingletonDemo {
private static SingletonDemo instance; //类初始化时不加载这个对象
//私有构造器
private SingletonDemo(){ }
//方法必须同步,防止高并发时多线程同时使用生成多个实例
public static synchronized SingletonDemo getInstance(){
if (instance==null){
instance = new SingletonDemo();
}
return instance;
}
}
- 双重检测锁式(不建议使用)
public class SingletonDemo {
private static SingletonDemo instance = null;
//私有构造器
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if (instance==null){
SingletonDemo demo;
synchronized (SingletonDemo.class){
demo = instance;
if (demo == null){
synchronized (SingletonDemo.class){
if (demo == null){
demo = new SingletonDemo();
}
}
instance = demo;
}
}
}
return instance;
}
}
- 静态内部类式(线程安全,调用效率高,实现延时加载)
public class SingletonDemo {
private static class SingletonClassInstance{
private static final SingletonDemo instance = new SingletonDemo();
}
private SingletonDemo(){}
public static SingletonDemo getInstance(){
return SingletonClassInstance.instance;
}
}
- 枚举单例
public enum SingletonDemo {
//枚举元素本身就是单例
INSTANCE;
//添加自己的操作
public void singletonOperation(){
}
}
本文详细介绍了单例模式的五种实现方法:饿汉式、懒汉式、双重检测锁式、静态内部类式及枚举单例。每种实现方式的特点、优缺点以及适用场景都做了详细的解释。
1517

被折叠的 条评论
为什么被折叠?



