概念
主要二种模式:
懒汉式单例、饿汉式单例
懒汉式:第一次不加载对象,之后生成对象
饿汉式:第一次加载对象。
单例模式特点:
- 单例类只有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须要给所有系统提供这个实例
1) 懒汉式单例(线程不安全的)
public class Singleton{
private Singleton() {}
private static Singleton single = null;
private static Singleton getInstance() {
if(single == null) {
single = new Singleton();
}
return single;
}
}
2)懒汉模式单例(线程安全)
-
在getInstance方法上加同步
缺点:效率很低
public class Singleton{
private Singleton() {}
private static Singleton single = null;
private static synchronized Singleton getInstance() {
if(single == null) {
single = new Singleton();
}
return single;
}
}
-
双重检查锁定
缺点:JVM优化的时候会对操作进行重排。会导致有问题
public static synchronized Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
- 静态内部类(懒加载方式)
public class Singleton{
public static class LazyLoad{
private static final Singleton singleton = new Singleton();
}
public static final Singleton getInstance(){
return LazyLoad.singleton;
}
}
- volatile修饰
public class Singleton{
private Singleton(){}
private static volatile Singleton singleton;
public static Singleton singleton(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
}
}
3) 饿汉式单例
public class Singleton{
private Singleton() {}
private static final Singleton single = new Singleton();
private static Singleton getInstance() {
return single;
}
}
总结
懒汉模式和饿汉模式区别:
- 懒汉模式加载类的时候,就加载了单例;饿汉模式,当你去调用的时候,才会加载单例
- 懒汉模式无论如何是线程安全的;饿汉模式有几种形式,不同形式的线程安全、内存占用、速度都不同
ps :
Singleton通过将构造方法限定为private避免了类在外部被实例化
转载于:
https://blog.youkuaiyun.com/jason0539/article/details/23297037