简介
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
为什么使用单例模式:
多个线程操作不同实例对象。多个线程要操作同一对象,要保证对象的唯一性
优点:
1、在内存里只有一个实例,减少了内存的开销
2、避免对资源的多重占用
单例模式的分类
在对比每个模式通常往一下三个方面:线程的安全性、性能、懒加载(lazy )
- 1.饿汉式:
public class HungerySingleton {
//加载的时候就产生的实例对象
private static HungerySingleton instance=new HungerySingleton();
private HungerySingleton(){
}
//返回实例对象
public static HungerySingleton getInstance(){
return instance;
}
public static void main(String[] args) {
for (int i = 0; i < 20; i ) {
new Thread(()->{
System.out.println(HungerySingleton.getInstance());
}).start();
}
}
}
线程安全性:在加载的时候已经被实例化,所以只有这一次,线程安全的
懒加载:没有延迟加载,好长时间不使用,影响性能
性能:性能比较好
- 2.懒汉式
public class HoonSingleton {
private static HoonSingleton instance=null;
private HoonSingleton(){
}
public static HoonSingleton getInstance(){
if(null==instance)
instance=new HoonSingleton();
return instance;
}
public static void main(String[] args) {
for (int i = 0; i < 20; i ) {
new Thread(()->{
System.out.println(HoonSingleton.getInstance());
}).start();
}
}
}
线程安全:不能保证实例对象的唯一性,非线程安全
懒加载:引发了一个不安全的问题,对于单例模式的应用有风险,而且风险比较大,,实现了懒加载
性能:相对于饿汉式还是比较好的
- 3.懒汉式 同步方法
线程安全:是线程安全
懒加载:是懒加载
性能: synchronized 退化到了串行执行
- 4.Double-Check-Locking
public class DCL {
private static DCL instance=null;
private DCL(){
}
public static DCL getInstance(){
if(null==instance)
synchronized (DCL.class){
if(null==instance)
instance=new DCL();
}
return instance;
}
public static void main(String[] args) {
for (int i = 0; i < 20; i ) {
new Thread(()->{
System.out.println(DCL.getInstance());
}).start();
}
}
}
性能比较好
懒加载:实现了懒加载
线程的安全性:保证了线程的安全
- 5.Volatile Double-check
只需要加一段代码:
代码语言:javascript复制private volatile static DCL instance=null;
可以避免空指针异常
- 6.Holder
声明类的时候,成员变量中不声明实例变量,而放到内部静态类中
代码语言:javascript复制public class HolderDemo {
private HolderDemo(){
}
private static class Holder{
private static HolderDemo instance=new HolderDemo();
}
//懒加载
//synchronized
//<init>
public static HolderDemo getInstance(){
return Holder.instance;
}
//广泛的一种单例模式
}
- 7.枚举
public class EnumSingletonDemo {
private EnumSingletonDemo(){
}
//延迟加载
private enum EnumHolder{
INSTANCE;
private static EnumSingletonDemo instance=null;
private EnumSingletonDemo getInstance(){
instance=new EnumSingletonDemo();
return instance;
}
}//懒加载
public static EnumSingletonDemo getInstance(){
return EnumHolder.INSTANCE.instance;
}
}