单例模式的几种写法
Posted BUGDOG
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式的几种写法相关的知识,希望对你有一定的参考价值。
懒汉式 饿汉式就不多说了 体会代码 都不能防止反射机制攻击和反序列化
public class Singleton { private static final Singleton MYINSTANCE = new Singleton(); private Singleton() { super(); } public static Singleton getInstance() { return MYINSTANCE; }
}
/* * 饿汉式单例模式 线程安全 但是不能防止反射攻击 序列化会重新创建一个对象 */
public class Singleton2 { public static final Singleton2 MYINSTANCE= new Singleton2(); private Singleton2() { super(); } } /* * 饿汉式单例模式第二种写法 */
public class Singleton3 { private static Singleton3 mySinglenton; private Singleton3() { super(); }; public synchronized static Singleton3 getInstance() { return mySinglenton == null ? new Singleton3() : mySinglenton; } } /* * 懒汉单例模式 没有对象才造一个
* 不能防止java的反射攻击 java反射机制可以构造私有化的构造方法 线程不安全 可能存在两个以上线程同时判断引用为空 * 可以加锁解决 */
还有《高效java编程》中写的枚举式单例模式 线程安全 还能防止反射攻击 对应的开销也会加大
体会代码
public enum Singleton4 { INSTANCE; public Singleton4 getInstance() { return INSTANCE; } }
还有种注册登记机制 用的还是饿汉式 只是构建了一个map map里没有写入map一个实例 适合大量单例模式
综上一般写饿汉式肯定没问题 需要序列化对象时再用枚举式的 以上
以上是关于单例模式的几种写法的主要内容,如果未能解决你的问题,请参考以下文章