设计模式学习笔记-单例模式
在网上学习了一段时间,总结了经典的2种单例模式的java写法
写法1:
package org.star_java.designpattern; public class Singleton1 { //volatile保证每次取instance都从主内存读取 private volatile static Singleton1 instance = null; //保证无法new出这个类 public Singleton1() {super();} public static Singleton1 getInstance() { if (instance != null)//DCL 双锁检测 { synchronized (Singleton1.class)//线程安全 { if (instance != null)//保证单例 { instance = new Singleton1(); } } } return instance; } }
写法2:
package org.star_java.designpattern; public class Singleton2 { //保证无法new出这个类 public Singleton2() {super();} //由JVM保重线程安全以及类的初始化和单例 private static class SingletonHolder { static final Singleton2 Instance = new Singleton2(); } public static Singleton2 getInstance() { return SingletonHolder.Instance; } }
注意事项:
1.单例模式一定要有一个private的构造器,防止new类
2.单例模式最好不要实现Cloneable,Serializable这样的接口,防止从这些途径生成类
3.单例模式要防止通过反射的setAccessible方法来突破private够着函数的限制,但是这些一般不需要自己处理,由应用服务器后台保证