类图很简单就不介绍了,单例主要功能: "保证一个类只有一个实例"。
单例主要分为两种饿汉和懒汉,饿汉是线程安全的,而懒汉是线程不安全的。
正是因为懒汉的不安全产生了单例的很多种写法,以下是一些常用的:
1.饿汉
快饿死了,等不了 所以直接用status对象直接new出对象
class Hungry
{
private static final Hungry instance = new Hungry();
static Hungry getInstance() { return instance; }
private Hungry() { }
}
2.赖汉
就可以直接理解为 :比较赖 等你需要时再new对象
public class Hungry{
private static instance;
private Hungry() {
}
public static Hungryget getInstance() {
if instance== null) {
instance= new Hungry();
}
return Instance;
}
}
3.赖汉(双重校验锁 DCL)
这种方式线程安全 和在多线程的情况下性能也还不错,大部分的人也基本上是用这种写法
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
} }
4.静态内部类
静态内部类利用的是类加载的机制实现的(只有在调用该类 该类的静态对象才会加载),非常佩服想出这种方式的大佬,除了这种还有一种枚举的写法,枚举我作为一个android程序园写得少用的也少。所以个人都是用这种方式
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
} }
网友评论