У меня есть несколько потоков, которые хотят поместить значение в TreeSet<Long>
, в части кода. Значения почти уникальны, поскольку они равны System.nanoTime()
. Я периодически очищаю TreeSet
. Проблема в том, что иногда мои потоки блокировались в функции TreeSet.add()
. Я использовал JConsole смотреть нить состояния, нити в RUNNABLE
состоянии и трассировки стека показывает, что это:Java - Программа застряла в TreeSet.add()
java.util.TreeMap.put(TeeMap.java:567)
java.util.TreeSet.add(TreeSet.java:255)
... //my program stack trace
Я использую JDK 1.7.0_60 для запуска программы. Также я должен упомянуть в этой ситуации, что использование процессора становится 100%. Мой вопрос в том, почему потоки заблокированы и как я могу исправить ситуацию? Я посмотрел на код TreeMap, но я не понял проблемы, но я думаю, что проблема связана с циклом while в TreeMap.put()
.
И что; можно спросить; вы использовали для синхронизации доступа к «TreeSet»? –
@BoristheSpider нет, нет. это проблема? – vakarami
Если «Коллекция» явно сконструирована как потокобезопасная, к ней невозможно получить доступ несколькими потоками без барьера памяти. То, что вы создали, - это гонка данных - поздравляет. –