java 资源锁定_如何在Java中创建时正确锁定资源
也許ConcurrentHashMap可以幫到你.顧名思義,它支持并發修改.
要只創建一個新元素,您可以執行以下操作:
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;
}
一次只允許一個線程創建新的東西,但是對于現有的值,沒有任何鎖定.
如果你想完全避免鎖定,你必須使用2個地圖,但它有點令人費解,如果你真的希望很多線程不斷地填充地圖,那么它是值得的.對于這種情況,最好將FutureTasks與線程池一起使用,以異步方式創建對象,最大限度地減少鎖定的時間(您仍需要鎖定,以便只有一個線程創建新元素).
代碼將是這樣的:
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();
}
鎖定僅在創建Callable所需的時間內存在,將其提交到線程池以獲取Future,并將Future置于地圖中. Callable將在線程池中創建元素,當它返回元素時,Future的get()方法將解鎖并返回其值(對于任何等待的線程;后續調用不會鎖定).
總結
以上是生活随笔為你收集整理的java 资源锁定_如何在Java中创建时正确锁定资源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wltc循环多少公里_原来所有车都烧机油
- 下一篇: xshell 6 连接debian系统拒