1. 背景
字典或者模型加载经常会用到双buffer这样读多写少的数据结构。在C++的时候会经常用到brpc里面的双buffer实现。具体可以参考:https://blog.csdn.net/Al_xin/article/details/104030457
在这里采用Java的api实现。在Java当中volatile语义可以实现在多个线程的内存可见。可以保证串行访问,从而避免各种加锁的实现。
2. 实现例子
public static int i = 0;
public static volatile Map<String, String> dict = new ConcurrentHashMap<>();
public static ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
// http or local file get dict
static void getDict() {
i++;
Map<String, String> data = new HashMap<>();
data.put("A", Integer.toString(i));
dict = data;
}
// Init
static void init() {
getDict();
}
// Timer to update the dict
public static void scheduleTimer() {
executor.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
try {
getDict();
} catch (Exception e) {
e.printStackTrace();
}
}
}, 0, 10, TimeUnit.SECONDS);
}
// Main函数调用:
public static void main(String[] args) {
init();
scheduleTimer();
for (; ; ) {
System.out.println(dict);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}