我有這個容器的Java ConcurrentSkipListMap被陷在某些線程
private ConcurrentMap<Integer,SortedMap<Long,Object>> users;
它得到的構造users = new ConcurrentHashMap<>();
初始化,併爲每個用戶它得到new ConcurrentSkipListMap<>()
我有這種方法被稱爲過一遍又一遍的線程池
private void process(Object obj){
// SOME CODE
SortedMap<Long,Object> q = users.get(obj.userId);
logger.debug("SECTION 1");
q.headMap(someNumber).clear();
logger.debug("SECTION 2");
q.put(obj.someId, obj);
logger.debug("SECTION 3");
}
這種方法是使用executorService = Executors.newScheduledThreadPool(8);
executorService.execute(new Runnable() {
@Override
public void run() {
process(obj);
}
});
有時它工作正常,但有時(我想在高負載)的一些用戶進程的方法(所有呼叫)卡住,從不輸出部分2
,如果叫我換q.headMap(someNumber).clear();
和q.put(obj.someId, obj);
它仍然無法輸出部分2
我也試過LinkedBlockingQueue
代替ConcurrentSkipListMap
但我有同樣的問題
它看起來像死鎖,但我沒有在該結構上使用任何同步語句。
請分享你的想法,如果你有一個
聽起來像一個愚蠢的想法,但是,你確定你的記錄器實例是線程安全的?難道記錄器實際上是造成(潛在的)死鎖?嘗試將每個日誌語句放在同步塊中以便調試,以查看問題是否消失。 – initramfs
它是log4j2。我會嘗試發佈更新 – MySqlError
它是log4j2。第1部分總是得到輸出,並且在「q」後總是被卡住,所以我不認爲這可能是一個問題,但我會試試謝謝 – MySqlError