以下方式均不推荐开发使用,仅供学习
I. 线程不安全的懒汉式
package singleton;
/**
* 懒汉式(懒汉式-线程不安全)
*/
public class Singleton_3 {
private static Singleton_3 instance;
private Singleton_3(){}
// 对外提供一个静态方法。 仅有在被使用时才创建
public static Singleton_3 getInstance() {
if (instance == null) {
instance = new Singleton_3();
}
return instance;
}
}
优点
- 不会造成内存浪费,因为只有在被使用时才开始创建实例
缺点
- 为何线程不安全?
- 答: 因为在多线程的情况下,一个线程进入了if(instance == null)判断语句块,还未来得及执行,另一个线程也来到了这个判断语句,这时会产生多个实例,所以多线程模式下不可使用这种方式。
II. 线程安全的懒汉式
package singleton;
/**
* 懒汉式(懒汉式-线程安全)
*/
public class Singleton_4 {
private static Singleton_4 instance;
private Singleton_4(){}
// 对外提供一个静态方法。 仅有在被使用时才创建
// 加入 synchronized 关键字, 解决线程安全问题
public static synchronized Singleton_4 getInstance() {
if (instance == null) {
instance = new Singleton_4();
}
return instance;
}
}
优点
- 相较于 I 实现了线程安全
缺点
- 效率低下,每个线程在想获得类的实例的时候,执行getInstance()都要去同步一下。