1、懒汉式
1.1 双重校验锁
这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
public class Singleton{
//volatitle 防止指令重排
private volatitle static Singleton getInstance;
private Singleton(){};
public Singleton getInstance(){
//如果已经获取到对象 就不必重复获取锁
if(getInstance == null){
synchornized(Singleton.class){
if(getInstance == null){
getInstance = new Singleton();
}
}
}
return getInstance;
}
}
1.2 枚举单例
这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。
public enum EnumSingleton {
//枚举单例模式
INSTANCE;
public EnumSingleton getInstance(){
return INSTANCE;
}
}
1.3 静态内部类
这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
2、饿汉式
它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
本文详细介绍了Java中实现单例模式的三种常见方法:双重校验锁、枚举单例和静态内部类。每种方式都有其独特优势,如双重校验锁在多线程环境下保证安全且高性能,枚举单例简洁且支持序列化,静态内部类则实现简单且延迟初始化。这些方法旨在确保单例的唯一性,防止多线程环境中的并发问题。
699

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



