用Java写一个单例类

注意:实现一个单例有两点注意事项,
①将构造器私有,不允许外界通过构造器创建对象;
②通过公开的静态方法向外界返回类的唯一实例。

饿汉式单例

public class Singleton implements serializable{
    private Singleton(){}
    private static Singleton INSTANCE = new Singleton();

    public static Singleton getInstance(){
         if(INSTANCE !=null{ //防止反射破坏单例
                  throw new RuntimeException(“单例对象不能被重复创建”);
		}
        return INSTANCE ;
    }

	public Object readResolve(){
		return INSTANCE ;//防止反序列化破坏单例
	}
}

Unsafe破坏单例

懒汉式单例
双重检查锁定

public class Singleton implements serializable{
	private static voilter Singleton INSTANCE = null;
	
	private Singleton() {}
	
	public static Singleton getInstance(){
		if (INSTANCE == null){
			synchronized (Singleton .class){
				if (INSTANCE == null)
					INSTANCE = new Singleton();
					return INSTANCE ;
				}
		}
	}
}

静态内部类-懒汉式

public class Singleton implements serializable{  

	private static class LazyHolder {  
		static Singleton INSTANCE = new Singleton();  
	}  
	
	private Singleton (){}  
	
	public static final Singleton getInstance() {  
		return LazyHolder.INSTANCE;  
	}  
}  

既实现了线程安全,又避免了同步带来的性能影响

枚举-饿汉式

public enum Singleton {
	INSTANCE;
	public static Singleton getInstance() {  
		return INSTANCE;  
	}  
}

枚举既能避免多线程同步问题,又能防止反序列化重新创建新的对象。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值