什么是单例模式
确保只生成一个实例的模式
- 像确保任何情况下都绝对只有1个实例
- 想在程序上表现出“只存在一个实例”
饿汉式
在项目启动时就创建实例,线程安全
package CreationPattern.SingletonMode;
/**
* 饿汉式
*/
public class HungrySingleton {
private static HungrySingleton hungrySingleton = new HungrySingleton();
private HungrySingleton(){
System.out.println("生成了一个实例");
}
public static HungrySingleton getInstance(){
return hungrySingleton;
}
}
懒汉式
在第一次调用时创建实例,线程不安全
package CreationPattern.SingletonMode;
/**
* 懒汉式
*/
public class LazySingleton {
private static LazySingleton lazySingleton;
private LazySingleton(){
System.out.println("生成了一个实例");
}
/**
* 多线程情况下不安全
*/
public static LazySingleton getInstance1(){
if(lazySingleton == null){
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
加锁的懒汉式
懒汉式加锁保证线程安全,但是锁会影响效率
package CreationPattern.SingletonMode;
/**
* 懒汉式(加锁保证线程安全)
*/
public class LockSingleton {
private static LockSingleton lockSingleton;
private LockSingleton(){
System.out.println("生成了一个实例");
}
/**
* 加锁保证线程安全,影响效率
*/
public synchronized static LockSingleton getInstance2(){
if(lockSingleton == null){
lockSingleton = new LockSingleton();
}
return lockSingleton;
}
}
双重检查的懒汉式
懒汉式使用双重检查来减少锁带来效率上的影响
package CreationPattern.SingletonMode;
/**
* 懒汉式(加锁保证线程安全,双重检查提升效率)
*/
public class DoubleCheckSingleton {
// volatile关键字避免指令重排
private static volatile DoubleCheckSingleton doubleCheckSingleton;
private DoubleCheckSingleton(){
System.out.println("生成了一个实例");
}
/**
* 双重检索
*/
public static DoubleCheckSingleton getInstance3(){
if(doubleCheckSingleton == null){
synchronized (DoubleCheckSingleton.class){
if (doubleCheckSingleton == null){
doubleCheckSingleton = new DoubleCheckSingleton();
}
}
}
return doubleCheckSingleton;
}
}
枚举类创建单例
使用枚举类来实现单例模式
package CreationPattern.SingletonMode;
/**
* 单例模式(枚举类应用)
*/
public enum EnumSingleton {
/**
* 实例 默认被public、final、static 修饰
*/
INSTANCE;
private String name = "hello";
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}