- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个容器
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
您可以获得IllegalArgumentException
在put()
没有在任何地方得到治疗。
这也可能导致竞争条件:
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/
我是一名优秀的程序员,十分优秀!