并发编程之简单map缓存
有些时候,我们请求后台想要获取到的数据需要通过某些复杂计算,或者通过后台请求其他的程序来获取。比如根据手机号查询手机归属地,传入手机号,我们调用别的三方接口来获取手机归属地。
假如有相同的手机号,我们肯定不想每次都要重新去请求三方来获取归属地信息,所以我们一般会做一个缓存,将已经请求过的归属地信息保存在本地。(事实是,其实这种情况我们不会在程序内部通过map缓存,而是通过mongo或者redis等三方插件来进行,这里只做演示)
代码如下:
package com.ziyuzile.study;
import java.util.HashMap;
import java.util.Map;
public class CacheMap {
public final Map<String,String> map = new HashMap<>();
public String getAreaInfo(String mobile){
//首先从map中获取手机归属地信息
String result = map.get(mobile);
if(result==null){
//请求其他运营商获得手机归属地
result = requestOtherOperator(mobile);
map.put(mobile,result);
}
return result;
}
public String requestOtherOperator(String mobile){
//请求三方
return "返回结果";
}
}
当请求到达时,我们先根据手机号去map里面取,如果没取到,我们再去请求三方获得归属地信息,同时把返回的数据存到map里面。
然而,hashmap并非是线程安全的,所以我们需要确保不会有两个线程同时访问。将getAreaInfo方法变成同步方法。
public synchronized String getAreaInfo(String mobile){
//首先从map中获取手机归属地信息
String result = map.get(mobile);
if(result==null)