单例模式我们要保证类只有一个实例,并提供一个访问此实例的方法。单例模式的优点有:
简述:懒汉式单例 在使用的时候去判断单例是否已经存在,然后再调用实例或创建实例 在懒汉式中需要考虑并发问题
不使用同步方法,在不同情况下是可以实现单例的。但是在高并发的情况下可能会产生多个实例
public class SingletonLazyNoSync {
private static SingletonLazyNoSync uniqueInstance;
private SingletonLazyNoSync() {
}
// 静态工厂方法
public static SingletonLazyNoSync getInstance() {
// 下面是延迟实例化的方法
if (uniqueInstance == null)
uniqueInstance = new SingletonLazyNoSync();
return uniqueInstance;
}
}
使用同步方法synchronized,能够在多线程中很好的工作,遗憾的是,效率很低
public class SingletonLazySync {
private static SingletonLazySync uniqueInstance;
private SingletonLazySync() {}
public static synchronized SingletonLazySync getInstance() {
// synchronized防止在多线程的情况下创建时会产生多个对象(但是synchronized会降低性能,同步一个方法能使程序效率下降100倍)
// 下面是延迟实例化的方法
if (uniqueInstance == null)
uniqueInstance = new SingletonLazySync();
return uniqueInstance;
}
}
使用双重检验加锁,在getInstance方法中减少同步
public class SingletonVolatile {
// volatile保证在多线程的时候,每个线程能正确的处理这个单例
private volatile static SingletonVolatile uniqueInstance;
private SingletonVolatile() {}
public static SingletonVolatile getInstance() {
if (uniqueInstance == null)
synchronized (SingletonVolatile.class) {
if (uniqueInstance == null)
uniqueInstance = new SingletonVolatile();
}
return uniqueInstance;
}
}
简述:饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了
饿汉式提前实例化,但只要我们初始化类SingletonStatic,不管我们是不是调用getInstance()都会存在一个实例在内存中
public class SingletonStatic {
private SingletonStatic() {}
private static final SingletonStatic single = new SingletonStatic();
public static SingletonStatic getInstance() {
return single;
}
}
内部类式中,实现了延迟加载,当SingletonStaticClass被加载时,其内部类不会被初始化,即SingletonStaticClass被加载到JVM的时候,不会初始化单例类。只有我们调用了getInstance(),才会加载StaticClass创建唯一的实例INSTANCE到内存中.并且也解决了懒汉式中多线程的问题.
ps:这种方法也可能创建多个实例,比如,通过反射机制来加载单例类的私有构造函数。但是,这样的情况极少
public class SingletonStaticClass {
private static class StaticClass {
private static final SingletonStaticClass INSTANCE = new SingletonStaticClass();
}
private SingletonStaticClass() {}
public static SingletonStaticClass getInstance() {
return StaticClass.INSTANCE;
}
}
public enum SingleInstance {
INSTANCE;
public void fun1() {
// do something
}
}
提枪策马乘胜追击04-21 20:01
代码小兵87207-15 12:10
杨晶珍05-11 14:54
杨晶珍05-12 17:30