先来看常见的使用锁解决懒汉式单例线程安全问题的例子
/**
* @author ZJX
* @date 2021/10/8
* @description
*/
public class LazySingleton {
public static User user;
public static User superUser(){
if(user == null) {
//这里可以不直接锁User类,可以在当前类添加个变量,锁变量。
synchronized (User.class){
if(user == null){
user = new User();
}
}
}
return user;
}
}
那其实我们可以通过静态内部类实现这点,因为静态内部类会在方法调用前初始化。
/**
* @author ZJX
* @date 2021/10/8
* @description
*/
public class LazySingleton {
/**
不让外部类初始化该类,因为在初始化该类则会初始化静态内部类。
这样我们就能够只有在调用方法了才初始化静态内部类。
*/
private LazySingleton(){
}
public static User superUser(){
return UserSingleTon.user;
}
private static class UserSingleTon{
public final static User user = new User();
}
}
有兴趣的可以看这篇文章,Effective JAVA 书中推荐的使用枚举类实现单例模式。
本文探讨了两种Java中实现单例模式的方法:懒汉式(线程安全的同步锁)和静态内部类。懒汉式通过在多线程环境下使用synchronized关键字保证线程安全,而静态内部类则利用类加载机制实现延迟初始化,既保证了线程安全,又避免了同步带来的性能影响。文章还提到了Effective Java中推荐的枚举单例实现方式。

被折叠的 条评论
为什么被折叠?



