一对多关系中增加一个不对应数据库的

该博客详细介绍了如何在Java中实现一个并发安全的TagService,通过使用CopyOnWriteArrayList和ConcurrentHashMap来缓存标签数据,确保在多线程环境下的正确性和效率。在获取标签列表和名称到标签映射时,采取了同步锁机制避免多次数据库查询,同时兼顾了性能和线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值