单例模式这里就不谈了,什么是单例模式可参考七种Java单例模式详解,这里是关于单例模式安全方面的,当然了这里说的安全不是线程安全。
什么是反射攻击呢
- 在Java中,由于反射的功能实在是太强了,通过动态访问类并设置Access(如setAccessible(true))使得可以访问对象的私有属性方法等。
- 在单例模式中,我们使用private 修饰构造方法对外隐藏,防止外部new 对象,但是在反射的存在下,private的存在形同虚设,通过反射设置Access即可访问构造方法,这时的单例就不是单例了。
反射攻击重现
这里使用volatile 双重检验锁实现线程安全的单例
/**
* 单例
* volatile 双重校验
*/
class Singleton {
private volatile static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE==null){
//同步代码块
synchronized (Singleton.class){
if (INSTANCE == null) {
INSTANCE = new Singleton();
}