
多线程下使用缓存+锁Lock, 出现“锁失效” + “缓存未命中竞争”的缓存击穿情况,双重检查缓存解决问题
多线程情况下,想通过缓存+同步锁的机制去避免多次重复处理逻辑,尤其是I/0操作,但是在实际的操作过程中发现多次访问的日志。发现问题了,如果finally 及时删除锁,可能会出现下一个线程重新建立锁对象,然后多了查询缓存的性能消耗。这就导致多个线程可能都进入了 lock.lock() 后的代码块,并且都执行了实际查询逻辑。// 可选释放锁对象。当T2 进入的时候处理逻辑,发现没有锁,上锁,访问缓存。当T1 进入的时候处理完逻辑后,放入缓存,然后删除锁。这个可能出现锁失效的情况。为了避免这种情况存在。