懒汉式单例:线程非安全,当被调用的时候才创建实例,效率较高
public class LazySingleton { private static LazySingleton lazySingleton; private LazySingleton() { }; //获取单例方法 public static LazySingleton getLazySingleton() { if(lazySingleton==null) { lazySingleton = new LazySingleton(); return lazySingleton; }else { return lazySingleton; } } }
饿汉式单例:线程安全,程序加载的时候就创建实例,效率较低
public class HungrySingleton { private static final HungrySingleton SINGLE_INSTANCE = new HungrySingleton(); private HungrySingleton() { } //共有静态方法获取单例 public static HungrySingleton getInstance() { return SINGLE_INSTANCE; } }
使用main方法对单例进行测试,看看是否是同一个实例
public class Main { public static void main(String[] args) { /** * 懒汉式单例调用过程 */ LazySingleton lazySingleton1 = LazySingleton.getLazySingleton(); LazySingleton lazySingleton2 = LazySingleton.getLazySingleton(); System.out.println(lazySingleton1==lazySingleton2); /** * 饿汉式单例调用过程 */ HungrySingleton hungrySingleton1 =HungrySingleton.getInstance(); HungrySingleton hungrySingleton2 =HungrySingleton.getInstance(); System.out.println(hungrySingleton1==hungrySingleton2); } }
上面结果在控制台输出true,true。
表示是同一个实例。
第一次写博客,希望大家多多在下面评论,互相交流心得,鞠躬!!!
双检索单例
public class SingleDoubleCheckLock { private static volatile SingleDoubleCheckLock instance; public static SingleDoubleCheckLock getInstance() { if (instance == null) { synchronized (SingleDoubleCheckLock.class) { if (instance == null) { instance = new SingleDoubleCheckLock(); } } } return instance; } }
synchronized和volatile的完美配合,便实现了线程安全的双检锁单例模式。
volatile关键字特性
volatile具有可见性、有序性,不具备原子性。
volatile不具备原子性,这是volatile与java中的synchronized、java.util.concurrent.locks.Lock最大的功能差异
volatile不会让线程阻塞,响应速度比synchronized高,这是它的优点。