日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 资源锁定_如何在Java中创建时正确锁定资源

發布時間:2024/7/5 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中创建时正确锁定资源的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。