编写多线程应用程序时,遇到的最常见问题之一是竞争条件.
我对社区的问题是:
什么是比赛条件?你怎么发现它们?你怎么处理它们?最后,你如何防止它们发生?
最近我参与了讨论,在那里我获得了一个缓存,需要实现以支持以下操作:
int getData(String key){
if(cache.get(key) !=null){
return cache.get(key);
} else {
int val = getValueFromDB(); // line no. 5
cache.put(key, val); // line no. 6
return val;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,在多线程场景中,实现缓存,你会使用:HashMap或ConcurrentHashMap?
我的ans:ConcurrentHashMap,因为它允许在相同和不同的段上进行读操作,并且只允许在不同的段上进行写操作.
这里由lead引用的论点是,因为key是相同的,所以多个线程将执行line 5但只有一个将执行`line no.6.由于它是一个DB调用,它只需要执行一次就可以将值放在缓存中(如果不存在).
我:我可以getData同步.
导语:那为什么ConcurrentHashMap?普通的HashMap也可以.
我:我把line no. 5和line no. 6同步块内.
导致:然后多个线程将在块处等待.当一个线程执行并通知其他线程时,下一个线程将执行db调用.
现在,我们怎样才能做到这一点?基本上,我们不想执行多个db调用.它应该由一个线程完成,只需一次调用.
请指教.