目录:
一 单例模式的定义
二 单例模式的实现步骤的描述和代码实现+优缺点
一 单例模式的定义
数学与逻辑学中,singleton定义为“”“有且仅有一个元素的集合”。
JAVA单例模式定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
JAVA单例模式的目的:使得一个对象成为系统中的唯一实例。
二代码实现的要点
1.一个类只能有一个实例
2.它必须自行创建这个实例
3.他必须向整个系统提供这个实例
实现方式:
1.懒汉式(推荐 双锁)------最基础的实现方式 线程上下文单例
/**
- 双重锁懒汉式:对象需要被使用时才创建,这样既可以节约内存空间 又可以保证线程安全
- 缺点:但是由于jvm存在乱排序执行功能,偶尔也会出现线程不安全
- 解决方法:可以通过添加volitatle字在内存中读取
*/
public class Singleton1 {
private volatile static Singleton1 instance=null;
private Singleton1() {}//把构造方法声明为私有 是为了保证不通过new 的方式创建
public static Singleton1 getInstance() {
if(instancenull) {
synchronized(Singleton1.class) {
if(instancenull) {
instance=new Singleton1();
}
}
}
return instance;
}
}
2.饿汉式-----类加载时创建
public class Singleton {
private static final Singleton singleton=new Singleton();//
//把构造方法声明为私有是为了保证不通过new 的方式创建对象
private Singleton() {}
public Singleton getInstance() {
return singleton;
}
}
3.枚举式(强烈推荐)
**
- 优点:代码简单 实现单例模式最佳的方法
- 缺点:序列化问题(序列化后前后两个对象不等)
/
public enum Singleton2 {
INSTANCE;
public void method() {}
}
4.静态内部类
/*
- 静态内部类的优点:外部加载时不需要立即加载内部类,故不占用内存
- 这种方法不仅能实现线程安全性 而且能保证单例的唯一性 同时也延迟了单例的实例化
*/
public class Singleton3 {
public static class SingletonHolder{
private static final Singleton3 instance=new Singleton3();
private SingletonHolder() {}
public static Singleton3 getInstance() {
return SingletonHolder.instance;
}
}
}