懒汉:
public class Singleton{ // 因为这个变量要在静态方法中使用,所以需要加上static修饰 private static Singleton instance = null; //私有化构造器,好在内部控制创建实例的数目 private Singleton(){ } //这个方法要定义成类方法 public static Singleton getInstance(){ if( instance == null ){ instance = new Singleton(); } return instance; } }
饿汉
public class Singleton { private static Singleton instance = new Singleton(); pirvate Singleton(){ } public static Singleton getInstance(){ return instance; } }
单例模式中“懒汉”实现了缓存的思想
在java中缓存的基本实现:
public class JavaCache { /** * 缓存数据的容器,定义成Map是方便访问,直接根据Key就可以获取Value了 key选用String是为了简单 */ private Map<String, Object> map = new HashMap<String, Object>(); /** * 从缓存中获取值 * * @param key * 设置时候的key值 * @return key对应的Value值 */ public Object getValue(String key) { // 先从缓存里面取值 Object obj = map.get(key); // 判断缓存里面是否有值 if (obj == null) { // 如果没有,那么就去获取相应的数据,比如读取数据库或者文件 // 这里只是演示,所以直接写个假的值 obj = key + ",value"; // 把获取的值设置回到缓存里面 map.put(key, obj); } // 如果有值了,就直接返回使用 return obj; } }
利用缓存来实现单例模式
public class Singleton{ //定义一个默认的key值,用来表示在缓存中的存放 private final static String DFAULT_KEY = "one"; //缓存实例的容器 private static Map<String , Singleton> map = new HashMap<String,Singleton<(); private Singleton(){ } public class Singleton getInstance(){ //先从缓存中获取 Singleton insatce = map.get(DFAULT_KEY); if( instance == null ){ instance = new Singleton(); map.put(DFAULT_KEY , instance); } } }
线程安全:
1 不在同步的懒汉式线程不安全的
2 饿汉是安全的
改造:
同时实现延迟加载也实现线程安全
基础知识:
解决方案的思路:
实现:
public class Singleton{ //类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例没有绑定关系,而且只有别调用到的时候才会装载,从而实现了延迟加载 private static class SingletonHolder{ //静态初始化器,由JVM来保证线程安全 private static Singleton isntance = new Singleton(); } private Singleton(){ } public static Singleton getInstance(){ return SingletonHolder.instance; } }