Java - 程序陷入了TreeSet.add()

时间:2016-11-22 10:24:17

标签: java multithreading treemap treeset

我有多个线程想要在代码的一部分中将值放在TreeSet<Long>中。这些值几乎是唯一的,因为它们是System.nanoTime()。我定期清理TreeSet。问题是有时我的线程在TreeSet.add()函数中被阻塞了。我使用jconsole来监视线程状态,线程处于RUNNABLE状态,堆栈跟踪显示:

java.util.TreeMap.put(TeeMap.java:567)
java.util.TreeSet.add(TreeSet.java:255)
... //my program stack trace

我使用jdk 1.7.0_60来运行程序。另外我应该提到在这种情况下cpu使用率变为100%。我的问题是为什么线程被阻止了,我该如何解决这个问题呢?我查看了TreeMap代码,但我没有弄清楚问题,但我认为问题与TreeMap.put()中的while循环有关。

1 个答案:

答案 0 :(得分:1)

正如评论中提到的,问题是TreeSet不是线程安全的,如果我们想在多线程中修改它(添加或删除数据),它必须在外部同步。