我有多个线程想要在代码的一部分中将值放在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循环有关。
答案 0 :(得分:1)
正如评论中提到的,问题是TreeSet
不是线程安全的,如果我们想在多线程中修改它(添加或删除数据),它必须在外部同步。