Java - 程序卡在 TreeSet.add()
Java - Program got stucked in TreeSet.add()
我有多个线程想要在 TreeSet<Long>
的一部分代码中放置一个值。这些值几乎是唯一的,因为它们是 System.nanoTime()
。我定期清理 TreeSet
s。问题是有时我的线程在 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 循环有关
正如评论中提到的,问题是TreeSet
不是线程安全的,如果我们想在多线程中修改它(添加或删除数据),它必须在外部同步。
我有多个线程想要在 TreeSet<Long>
的一部分代码中放置一个值。这些值几乎是唯一的,因为它们是 System.nanoTime()
。我定期清理 TreeSet
s。问题是有时我的线程在 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()
.
正如评论中提到的,问题是TreeSet
不是线程安全的,如果我们想在多线程中修改它(添加或删除数据),它必须在外部同步。