参考
https://blog.csdn.net/hikobe8/article/details/79477853
单例模式的5种写法
饿汉式
public class HungryMode {
private static HungryMode sHungryMode = new HungryMode();
private HungryMode() {
System.out.println("create " + getClass().getSimpleName());
}
public static HungryMode getInstance(){
return sHungryMode;
}
}
加载类的时候就会创建类的实例对象,这样的话比较消耗内存,浪费性能。
所以需要懒加载,也就是所谓的懒汉式加载
懒汉式
public class LazyMode {
private static LazyMode sLazyMode;
private LazyMode() {
System.out.println("create " + getClass().getSimpleName());
}
public static LazyMode getInstance(){
if (sLazyMode == null) {
sLazyMode = new LazyMode();
}
return sLazyMode;
}
}
延时加载,提升性能。
但是线程不安全
线程安全的懒汉式
public class LazyMode {
private static volatile LazyMode sLazyMode;
private LazyMode() {
System.out.println("create " + getClass().getSimpleName());
}
public static LazyMode getInstance(){
synchronized (LazyMode.class) {
if (sLazyMode == null) {
sLazyMode = new LazyMode();
}
}
return sLazyMode;
}
public static void main(String[] args) {
LazyMode.getInstance();
}
}
注意 volatile 关键字
注意 getInstance() 中的 synchronized 关键字
双重校验的懒汉式
/**
* 多线程的单例模式,使用双重校验机制
*/
public class DoubleCheckMode {
private volatile static DoubleCheckMode sDoubleCheckMode ;
public DoubleCheckMode() {
System.out.println(" created " + getClass().getSimpleName());
}
public static DoubleCheckMode getInstance() {
if (sDoubleCheckMode == null)
synchronized (DoubleCheckMode.class) {
if (sDoubleCheckMode == null) {
sDoubleCheckMode = new DoubleCheckMode();
}
}
return sDoubleCheckMode;
}
}
注意 volatile 关键字
注意 getInstance() 中的 两个 if
使用静态内部类实现单例
/**
* 静态内部类的方式实现单例,可以保证多线程的对象唯一性,还可以提升性能,不用同步锁机制
*/
public class InnerStaticMode {
private static class SingleTonHolder {
public static InnerStaticMode sInnerStaticMode = new InnerStaticMode();
}
public static InnerStaticMode getInstance(){
return SingleTonHolder.sInnerStaticMode;
}
}
SingleTonHolder 作为静态内部类
使用枚举实现单例(Android不推荐)
/**
* 利用枚举的方式实现单例,Android不推荐
*/
public enum EnumMode {
INSTANCE;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}