@Service public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements ITagService { //声明一个成员变量来保存所有标签 //因为这个变量可能同时被多个线程使用,所以要考虑线程安全问题 private List<Tag> tags=new CopyOnWriteArrayList<>(); //因为我们已经缓存了List,现在需要一个Map也使用缓存的方式处理即可 //要定义缓存,就需要在属性位置声明一个Map private Map<String,Tag> name2TagMap= new ConcurrentHashMap<>(); @Override public List<Tag> getTags() { //先判断tags是不是空,如果是空才需要连接数据库查询 // 3 if(tags.isEmpty()){ // 1 2 //为了防止多条线程都进行新增操作,这里加锁 synchronized (tags) { //在加锁的情况下判断tags是不是空 if(tags.isEmpty()) { //如果加锁的情况下还是空,才是真正的第一次请求 //利用list()方法向tags赋值 tags.addAll(list()); //下面给Map赋值 for(Tag t:tags){ name2TagMap.put(t.getName(),t); } } } } return tags; } @Override public Map<String, Tag> getName2TagMap() { if(name2TagMap.isEmpty()){ getTags(); } return name2TagMap; } }