1.1 懒汉式线程不安全
什么时候使用对象,什么时候创建对象
1.1.1 懒汉式线程不安全介绍
是否Lazy初始化:是 (懒汉式是在对象真正需要被实例化的时候,才去创建对象)
是否多线程安全:否 (多线程同时进行到if时,可能创建多个instance)
描述:这种⽅式是最基本的实现⽅式,这种实现最⼤的问题就是不⽀持多线程。因为没有加锁synchronized,所以严格意义上它并不算单例模式。
这种⽅式lazy loading很明显,不要求线程安全,在多线程不能正常⼯作。
1.1.2 懒汉式线程不安全案例
1.创建⼀个LazySingleton类。
package com.设计模式.懒汉式.线程不安全;
/*
什么时候使用对象,什么时候创建对象 (懒加载)
*/
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton (){}
public static LazySingleton getInstance(){
if (instance == null){
instance = new LazySingleton();
}
return instance;
}
public void showMessage(){
System.out.println("创建instance成功,showMessage执行了");
}
}
2.从LazySingleton类获取唯⼀的对象。
package com.设计模式.懒汉式.线程不安全;
import com.设计模式.懒汉式.线程不安全.LazySingleton;
public class Test_LazySingleton {
public static void main(String[] args) {
LazySingleton lazySingleton = LazySingleton.getInstance();
lazySingleton.showMessage();
}
}
3.执⾏程序,输出结果。
1.2 懒汉式线程安全
1.2.1 懒汉式线程安全介绍
是否Lazy初始化:是
是否多线程安全:是 (加了锁)
描述:这种⽅式具备很好的lazy loading,能够在多线程中很好的⼯作,但是效率很低,99%情况下不需要同步。
优点:第⼀次调⽤才初始化,避免内存浪费。
缺点:必须加锁synchronized才能保证单例,但加锁会影响效率。
getInstance()的性能对应⽤程序不是很关键(该⽅法使⽤不太频繁)。
1.2.2 懒汉式线程安全案例
对原来类中的getInstance()方法⽤synchronized修饰。
package com.设计模式.懒汉式.线程安全;
/*
什么时候使用对象,什么时候创建对象
*/
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton (){}
//加锁变成多线程安全
public static synchronized LazySingleton getInstance(){
if (instance == null){
instance = new LazySingleton();
}
return instance;
}
public void showMessage(){
System.out.println("创建instance成功,showMessage执行了");
}
}