单例-线程安全

本文详细介绍了Java中实现单例模式的三种方法:双重检查锁定、静态内部类和枚举。每种方法的线程安全性、性能及推荐程度都有所不同。双重检查锁定在某些情况下可能不再推荐,而静态内部类和枚举因其简洁和线程安全的特性成为更优的选择。
摘要由CSDN通过智能技术生成

双重检查锁定


public class Singleton {
	
	// 静态实例变量加上volatile
    private static volatile Singleton instance;
 
    // 私有化构造函数
    private Singleton() {}
 
    // 双重检查锁
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class){
                if(instance == null){ // 二次检查
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

加锁只需在首次初始化时用到,之后调用无需再次加锁,双重检查锁通过先判断对象是否已经被初始化,再决定要不要加锁。

注意

双重检查锁定不再推荐使用,可参考http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

静态内部类

public class Singleton {
 
    // 私有化构造函数
    private Singleton() {}
 
    // 利用静态内部类特性实现外部类的单例
    private static class SingletonBuilder {
        private static Singleton singleton = new Singleton();
    }
    
    public static Singleton getInstance() {
        return SingletonBuilder.singleton;
    }
}

主要原理:Java静态内部类可以访问其外部类的静态成员属性,同时,静态内部类只有被调用时才开始首次加载,利用classloader的机制保证初始化instance时只有一个线程,所以是线程安全的,同时没有由加synchronized同步锁导致性能损耗,更推荐该实现。

枚举

public enum Singleton{
  INSTANCE;
}

最简单的实现方式,通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值