夜话JAVA设计模式之单例模式(单件模式Singleton)
单例模式也叫单件模式,就是确保一个类只有一个实例,并提供一个全局访问点。
设计成单例即把某个类设计成我们自己管理的单独实例,避免实例对象的重复创建,我们只有通过单例类的全局访问点获取实例。
下面来看金典的几种单例模式java代码实现:
1、饿汉模式
/** * 饿汉模式(创建和运行负担小,占用内存小时使用) * @author monkjavaer * @date 2018/08/27 21:44 */ public class Singleton1 { private static Singleton1 instance = new Singleton1(); private Singleton1(){} public static Singleton1 getInstance(){ return instance; } }
2、懒汉模式
/** * 懒汉模式 * (懒汉模式并没有考虑线程安全问题, * 在多个线程可能会并发调用它的getInstance()方法, * 导致创建多个实例.) * @author monkjavaer * @date 2018/08/27 22:14 */ public class Singleton2 { private static Singleton2 instance ; private Singleton2(){} public static Singleton2 getInstance(){ if (instance ==null) { instance = new Singleton2(); } return instance; } }
3、懒汉模式处理多线程
/** * * 懒汉模式(处理多线程)synchronized同步会降低性能。 * @author monkjavaer * @date 2018/08/27 22:21 */ public class Singleton3 { private static Singleton3 instance ; private Singleton3(){} public static synchronized Singleton3 getInstance(){ if (instance == null){ instance = new Singleton3(); } return instance; } }
4、用“双重检查加锁”,在getIntance()中减少使用同步
/** * 用“双重检查加锁”,在getIntance()中减少使用同步 * 利用双重检查加锁,首先检查是否实例已经创建,如果没有才同步。 * 这样只有第一次才会同步。 * @author monkjavaer * @date 2018/08/27 22:28 */ public class Singleton4 { private volatile static Singleton4 instance; private Singleton4(){} public static Singleton4 getInstance(){ //如果实例不存在,进入同步区 if (instance == null){ //只有第一次才执行 synchronized (Singleton4.class){ //进入区块再检查一次 if (instance == null){ instance = new Singleton4(); } } } return instance; } }