java 资源锁定_如何在Java中创建时正确锁定资源
也許ConcurrentHashMap可以幫到你.顧名思義,它支持并發(fā)修改.
要只創(chuàng)建一個新元素,您可以執(zhí)行以下操作:
private Map map = new ConcurrentHashMap<>();
private final Object lock = new Object();
public Thing getById(String id) {
Thing t = map.get(id);
if (t == null) {
synchronized(lock) {
if (!map.containsKey(id)) {
t = //create t
map.put(id, t);
}
}
}
return t;
}
一次只允許一個線程創(chuàng)建新的東西,但是對于現(xiàn)有的值,沒有任何鎖定.
如果你想完全避免鎖定,你必須使用2個地圖,但它有點令人費解,如果你真的希望很多線程不斷地填充地圖,那么它是值得的.對于這種情況,最好將FutureTasks與線程池一起使用,以異步方式創(chuàng)建對象,最大限度地減少鎖定的時間(您仍需要鎖定,以便只有一個線程創(chuàng)建新元素).
代碼將是這樣的:
private Map> map = new ConcurrentHashMap<>();
private final Object lock = new Object();
ExecutorService threadPool = ...;
public Thing getById(String id) {
Future t = map.get(id);
if (t == null) {
synchronized(lock) {
if (!map.containsKey(id)) {
Callable c = //create a Callable that creates the Thing
t = threadPool.submit(c);
map.put(id, t);
}
}
}
return t.get();
}
鎖定僅在創(chuàng)建Callable所需的時間內(nèi)存在,將其提交到線程池以獲取Future,并將Future置于地圖中. Callable將在線程池中創(chuàng)建元素,當它返回元素時,Future的get()方法將解鎖并返回其值(對于任何等待的線程;后續(xù)調(diào)用不會鎖定).
總結(jié)
以上是生活随笔為你收集整理的java 资源锁定_如何在Java中创建时正确锁定资源的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wltc循环多少公里_原来所有车都烧机油
- 下一篇: java jdbc操作类_Java-编写