生产问题: 利用线程Thread预加载数据缓存,其它类全局变量获取缓存偶发加载不到

生产问题: 利用线程Thread预加载数据缓存偶发加载不到

先上代码

java 复制代码
public class ThreadTest {
    //本地缓存
    Map<String, Object> map = new HashMap<String, Object>();

    class ThreadA implements Runnable{
        @Override
        public void run() {
            System.out.println("ThreadA");
            initCache();
        }
    }
        //加载缓存
    void initCache(){
        for (int i = 0; i < 5; i++) {
            map.put(String.valueOf(i),i);
        }
        
    }
    void ThreadTestStart(){
        for (int i = 0; i < 10; i++) {
            Thread threadA = new Thread(new ThreadA());
            threadA.setName("threadA"+i);
            //threadA.setPriority(10);//设置优先级

            threadA.start();
            System.out.println(threadA.getName());

        }
    }
    void getCacheByKey(String key){
         Object value = map.get(key);
         System.out.println("key:"+key+"-value:"+value);
    }
    public static void main(String[] args) {
        try {
            ThreadTest threadTest = new ThreadTest();
            threadTest.ThreadTestStart();

            //Thread.sleep(500);//睡眠500毫秒等待可以拿到数据
            threadTest.getCacheByKey("1");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

利用线程去加载缓存的时候, 线程start() 不一定立即执行, 要等分配时间片,

线程启动后,在这个时候去获取数据时会拿不到数据

睡眠一下

本人在生产的场景是这样子的(一个运行了十年的老项目)
一个bean实现了 BeanPostProcessor 接口,重写 postProcessAfterInitialization() 方法来加载缓存 initCache , 这个加载方法是新建了一个线程Thread 并启动start() , 这个本地缓存在Controller的全局变量中获取使用, 导致启动项目时会偶发报错 ( 取决于加载缓存的线程能不能拿到时间片去执行run()方法从而加载缓存 ) , 可能是这个线程的优先级不高, 然后就设置了优先级为最大 setPriority(10) , 默认的优先级是5

相关推荐
2601_962106643 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
RuoyiOffice4 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
衡石科技4 小时前
兼顾查询速度与数据时效:衡石的缓存和分析加速
缓存·数据缓存·数据时效
2601_962106644 小时前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
czq_26867194874 小时前
Python打卡第46天
开发语言·python
杨凯凡5 小时前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard5 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android5 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤6 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
Evand J7 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波