单例模式
1. 懒汉式(静态常量)
优点: 使用比较简单,类装载的时候就完成实例化,没有线程同步的问题;
缺点: 因为在类装载的时候就完成实例化,如果一直没有使用,会浪费内存;
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
2. 饿汉式(静态代码块)
优缺点和上面的一样,只是实现的方式不同;
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
3. 懒汉式(线程不安全)
只能在单线程下使用,所以这这种写法基本上不使用;
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
4. 懒汉式(线程安全,同步方法)
其实就是加了一个方法锁,效率太差,不推荐使用
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
5. 懒汉式(线程安全,同步代码块)
这种实现比上面的效率高一点,但是多线程使用会有问题,也不建议使用
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
instance = new Singleton();
}
}
return instance;
}
}
6. 双重检查_Double-Check(推荐使用)
对上面进行了二次非空判断和volatile关键字,这样可以保证了线程安全
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
7. 静态内部类
在调用getInstance方法的时候创建实例,避免了内存浪费,并且线程安全
public class Singleton {
private Singleton() {
}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
8. 枚举
避免了多线程同步问题,还可以防止反序列化重新创建新的对象
public enum Singleton {
INSTANCE;
public void doSomething() {
}
}
网友评论