如何编写单例模式

时间:2024-10-13 22:14:26

1、懒汉式单例模式

2、懒汉式单例模式能实现懒加载,即在调用类的getInstance()方法时才创建单例对象.但这样需要我们在getInstance()方法上加锁,手动保证线程安全.

3、// 懒汉式单例模式写法class Singleton { // 将单例对象设为类变量 private static volatile Singleton instance; // 将构造函数私有化 private Singleton() { } // 获取单例对象的方法 // 使用synchronized将判断与赋值操作合并为原子操作 public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }}

4、有一种错误的懒汉式写法,这种写法只将获取单例对象的代艨位雅剖码放入同步代码块.这种做法的本意是希望在创建出单颖蓟段扛例对象后再去获取单例对象不会引发线程同步,然而事与愿违,这种做法是错误的,因为判断与创建对象并不是一个原子操作,仍然会有多个线程进入同步代码块并多次创建对象.实际上,要想达到这种效果,可以使用双重检查式写法.// 懒汉式单例模式错误写法class Singleton { // 将单例对象设为类变量 private static volatile Singleton instance; // 将构造函数私有化 private Singleton() { } // 获取单例对象的方法 public static Singleton getInstance() { if (instance == null) { // 本意是想让创建对象时才进行线程同步,保证线程安全 // 但是实际情况是,可能有多个线程进入该同步代码块,多次创建对象 synchronized(Singleton.class) { instance = new Singleton(); } } return instance; }}

© 手抄报圈