Java и безопасность потоков - PullRequest
       21

Java и безопасность потоков

4 голосов
/ 02 ноября 2009

Мне интересно, не вызовет ли этот код каких-либо проблем:

У меня есть вектор, который используется многими потоками. Каждый раз, когда поток должен добавлять / удалять вещи из вектора, я делаю это в блоке synchronized. Тем не менее, основной поток имеет вызов:

System.out.println("the vector's size: "+ vec.size());

что не synchronized.

Должно ли это вызвать проблемы?

Ответы [ 4 ]

12 голосов
/ 02 ноября 2009

Все векторные методы синхронизируются сами по себе, поэтому, если вы синхронизируете только один метод, ваша собственная синхронизация не требуется. Если у вас есть несколько вызовов методов, которые зависят друг от друга, например, что-то вроде vec.get(vec.size()-2), чтобы получить второй последний элемент, вы должны использовать собственную синхронизацию, так как в противном случае вектор может измениться между vec.size () и vec.get ().

7 голосов
/ 02 ноября 2009

Я полагаю, вы имеете в виду java.util.Vector.

На самом деле Vector.size() синхронизируется и возвращает значение, соответствующее состоянию вектора (когда поток, вызывающий size(), входит в монитор.) Если он возвращает 42, то в какой-то момент времени вектор содержал ровно 42 элемента.

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

0 голосов
/ 02 ноября 2009

Помните, что вы всегда можете получить синхронизированную версию коллекции, используя Collections.synchronizedCollection(Collection<T> c) статический метод ..

0 голосов
/ 02 ноября 2009

Каждый из методов java.util.Vector равен synchronized, так что это не вызовет проблем для чего-то, что просто регистрирует размер.

Чтобы улучшить производительность, вам лучше заменить Vector на ArrayList. Методы ArrayList не являются synchronized, поэтому вам нужно синхронизировать весь доступ самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...