gpt4 book ai didi

Java ConcurrentSkipListMap 卡在某些线程中

转载 作者:行者123 更新时间:2023-12-02 04:45:46 25 4
gpt4 key购买 nike

我有这个容器

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但我有同样的问题

它看起来像一个死锁,但我没有在该结构上使用任何同步语句。

如果您有想法,请分享您的想法

最佳答案

可能有多种原因;最明显的一个是不同步的代码。进行线程转储以轻松找出原因。

一些问题:

ConcurrentSkipListMap JavaDocs 上写着 headMap() :

The returned map will throw an IllegalArgumentException on an attempt to insert a key outside its range.

所以如果 obj.someId.compareTo(someNumber) < 0您可以获得IllegalArgumentExceptionput()没有在任何地方得到治疗。

这也可能导致竞争条件:

q.headMap( someNumber ).clear();
q.put( obj.someId, obj )

如果两个线程有​​ (thread1) someNumber = (thread2) obj.someId你会遇到竞争条件,谁知道下面会发生什么。此外,正如 JavaDocs 所说 clear()不是原子操作。

而且你没有提到你使用 users 的其他地方指称对象;怎么样users已填充。

关于Java ConcurrentSkipListMap 卡在某些线程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29668268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com