2016-11-22 2 views
0

У меня есть несколько потоков, которые хотят поместить значение в 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().

+1

И что; можно спросить; вы использовали для синхронизации доступа к «TreeSet»? –

+0

@BoristheSpider нет, нет. это проблема? – vakarami

+1

Если «Коллекция» явно сконструирована как потокобезопасная, к ней невозможно получить доступ несколькими потоками без барьера памяти. То, что вы создали, - это гонка данных - поздравляет. –

ответ

1

Как было отмечено в комментариях, проблема заключается в том, что TreeSet не является потокобезопасным, и если мы хотим его модифицировать (добавлять или удалять данные) в нескольких потоках, его необходимо синхронизировать извне.

+0

Или, если производительность является проблемой (или, действительно, даже если это не так), вы можете использовать ['ConcurrentSkipListSet'] (https://docs.oracle.com/javase/7/docs/ api/java/util/concurrent/ConcurrentSkipListSet.html) или ['Collections.newSetFromMap (новый ConcurrentHashMap <>())'] (https://docs.oracle.com/javase/7/docs/api/java/util /Collections.html#newSetFromMap(java.util.Map)). –

+0

Удивительно, используя 'Collections.newSetFromMap (новый ConcurrentHashMap <>())' вызванный 'ConcurrentModificationException'! В конце я использовал 'ConcurrentSkipListSet' – vakarami

+0

Это исключение не означает, что вы думаете, что это значит. –

Смежные вопросы