赞
踩
首先来说缓存,首先我们通过java内存做缓存,肯定是缓存我们需要的数据,且这些缓存数据是不可以随意去更改的,这时用单例的设计模式去做缓存,就可以实现,我们拿到缓存对象,都是从一个地方去拿,且拿到的都是同一个对象,这样大大的增加了缓存的安全性。
首先我们来说下,单例最常见的两种模式,懒汉式,饿汉式
懒汉式
/** * @ClassName: SingerTone * @Author: tanp * @Description: 单例懒汉 */ public class SingerTone { private static SingerTone singerTone; public static SingerTone getSingerTone(){ if(singerTone == null){ singerTone = new SingerTone(); } return singerTone; } } /** 以上懒汉写单例的在多线程的情况下是不安全的,因为它不能保证是单例模式,有可能会出现多份实例的情况,出现多份实例的情况是在创建实例对象时候造成的。 假设有两个线程都运行到 if(singerTone == null)判断实例是否为空,因为没有任何资源保护措施,所以两个线程可以同时判断的singerTone都为空, 则都将去执行 singerTone = new SingerTone();的实例化代码,所以就会出现多份实例的情况。 */
饿汉式
/** * @ClassName: SingerTone2 * @Author: tanp * @Description: 饿汉单例 */ public class SingerTone2 { private static SingerTone2 singerTone2 = new SingerTone2(); public static SingerTone2 getSingerTone2(){ return singerTone2; } } //不能实现懒加载,造成空间浪费,如果一个类比较大,我们在初始化的时就加载了这个类,但是我们长时间没有使用这个类,这就导致了内存空间的浪费。
两种写法的总结
懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。但是需要注意线程安全问题
饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断了,节省了运行时间。
因为枚举类型是线程安全的,并且只会装载一次,设计者充分的利用了枚举的这个特性来实现单例模式,枚举的写法非常简单,而且枚举类型是所用单例实现中唯一一种不会被破坏的单例实现模式。
public enum TempLateCashMap { /** * 枚举的单例 */ INSTANCE; /**存放模板的缓存map*/ private static Map<String,SimpleTemplate> map = new HashMap<>(); /** * @Description 获取全部缓存数据 * @Author tanp */ public Map<String, SimpleTemplate> getTempLateCashMap() { return map; } /** * @Description 全量替换缓存 * @Author tanp */ public void setTempLateCashMap(Map<String, SimpleTemplate> map) { TempLateCashMap.map = map; } /** * @Description 清空缓存 * @Date 2020/4/15 19:13 * @Author tanp */ public void clear(){ map.clear(); }
}
//SimpleTemplate为我自定义的对象,大家在使用时可以换成任何类型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。