Java 单例模式 安全问题

本文介绍了一种使用静态变量实现的Java单例模式,并通过示例代码展示了其实现方式及运行效果。同时,文章指出该实现方式可能遭受Java反射机制攻击的问题,并通过实例演示了反射机制如何破坏单例模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用静态变量实现单例模式

public class Singleton {
	
	int test_singleton;
	private Singleton() {}
	
	public static Singleton instance = new Singleton();
	
	public static Singleton get_instance(){
		return instance;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton A = Singleton.get_instance();
		A.test_singleton = 2;
		Singleton B = Singleton.get_instance();
		B.test_singleton = 1;
		System.out.println(A.test_singleton);
		System.out.println(B.test_singleton);
	}

}
运行结果:

1
1

但是这种实现方法会被java反射机制攻击

import java.lang.reflect.Constructor;
public class Singleton {
	
	int test_singleton;
	private Singleton() {}
	
	public static final Singleton instance = new Singleton();
	
	public static Singleton get_instance(){
		return instance;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Singleton A = Singleton.get_instance();
		A.test_singleton = 2;
		Singleton B = Singleton.get_instance();
		B.test_singleton = 1;
		try{
			Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor();
			constructor.setAccessible(true);
			Singleton singletonnew = constructor.newInstance();
			singletonnew.test_singleton = 15;
			System.out.println(A.test_singleton);
		    System.out.println(B.test_singleton);
			System.out.println(singletonnew.test_singleton);
			System.out.println(A == singletonnew);
		}catch(Exception e){
			e.printStackTrace();
		}
	}


}


输出结果

1
1
15
false

其中setAccessible(true)可以禁止java对控制权限的检查

关于反射机制的原理、功能,可参考

还有一般使用

	public static final Singleton instance = new Singleton();
感觉final可有可无


后续会更新此文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值