java单例设计模式的三种写法
单例设计模式:保证类在内存中只有一个对象。
一、如何保证类在内存中只有一个对象呢?
- 控制类的创建,不让其他类来创建本类的对象。private
- 在本类中定义一个本类的对象。Singleton s;
- 提供公共的访问方式。Public static Singleton getInstance(){return s}
二、单例写法三种:
(1) 饿汉式开发推荐使用这种方式。上来就创建对象
/** * 饿汉式 */ public class Singleton { // 1.私有构造方法,其它类不能访问该构造方法 private Singleton() {} // 2.创建本类对象,且让它私有,目的是不让其修改该对象 private static Singleton s = new Singleton(); // 3.对外提供公共的访问方法 获取实例 public static Singleton getInstance() { return s; } }
(2) 懒汉式 面试写这种方式。但是多线程有线程隐患
/** * 懒汉式(单例的延迟加载模式),对于线程问题不好多线程时会有安全隐患 * 所以开发的时候不用,面试的时候才用的 */ public class Singleton { // 1.私有构造方法,其它类不能访问该构造方法 private Singleton() {} // 2.声明一个对象的引用不去创建对象 private static Singleton s; // 3.对外提供公共的访问方法 获取实例 public static Singleton getInstance() { if(s==null){//如果s没创建对象 //如果此处线程等待 线程1等待 线程2等待 线程1唤醒 返回一个s的实例对象 //线程2唤醒返回一个s的实例对象 这样s就不是单例设计模式了 s = new Singleton(); } return s; } }
(3)其它写法
public class Singleton{ //1.私有构造方法,其他类不能访问该构造方法了 private Singleton(){} //2.声明一个成员变量且实例化对象 final的目的是不让其改变只 public static final Singleton s = new Singleton(); }
三、总结懒汉式和饿汉式的区别
- 饿汉式是空间换时间,懒汉式是时间换空间 因为需要判断
- 在多线程访问时,饿汉式不会创建多个对象,而懒汉式有可能创建多个对象

浙公网安备 33010602011771号