懒汉:
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;
}
}