2008-11-19 2 views
3

Если я использую ConcurrentHashMap (где put является потокобезопасным), и я предоставляю публичную функцию myPut, которая использует ConcurrentHashMap - мне нужно синхронизировать мою функцию?Должен ли быть синхронизирован вызов функции потокобезопасности?

Значение: следует ли это синхронизировать?

ConcurrentHashMap map; 
public void myPut(int something) { 
    this.map.put(something); 
} 

ответ

2

Утилиты параллелизма, такие как ConcurrentHashMap, сконструированы так, что вам не нужно синхронизировать: они будут обрабатывать поточно-безопасный доступ внутри.

То, что говорит Том, верно, что вам нужно подумать о потенциале ссылки на карту для изменения. Если ссылка фактически не изменяет, то на практике вам это не составит труда: внутренняя синхронизация ConcurrentHashMap - и, действительно, java.util.concurrentlibrary в целом - гарантирует, что объекты, помещенные на карту, безопасно опубликовано в другие темы. Но я бы согласился с тем, что даже так, это хорошая практика, чтобы решить, может ли ссылка изменить или нет, а затем явно указать это в коде («final», если он не может, что-то вроде «volatile» или AtomicReference, если это Можно).

0

No.
Вы можете кал myPut несколько раз одновременно.
Пульт будет называться по одному, поскольку доступ к HashTable должен быть по одному. (см. также одновременную запись в общей памяти)

1

Если вы используете ConcurrentHashMap, вам не следует синхронизировать 'put', но это не значит, что ваши «puts» будут называться один раз. Это зависит от уровня параллелизма вас. Карта ...

Значит, вы должны знать, чего хотите.

BTW взглянуть на ConcurrentHashTable Javadoc, все хорошо объяснил ...

-Patrick

0

Это зависит от многого.

Когда вы пишете классы для объектов, которые будут использоваться из нескольких потоков, вся игра меняется. Вам нужно понять, какие результаты вы пытаетесь достичь, если вы надеетесь предоставить какие-либо гарантии безопасности потоков.

В этом случае, если это единственный метод в вашем классе, синхронизация доступа к этому методу отсутствует. Но это будет не единственный метод, так как это сделает класс довольно бессмысленным.

Вам нужно всего лишь синхронизировать этот метод, если это необходимо для обеспечения безопасности потока классов по другим причинам. В этом случае вы можете задать вопрос, стоит ли накладные расходы ConcurrentHashMap.

4

Поскольку ссылка map не указана final его можно изменить. Таким образом, здесь существует потенциальная ошибка переполнения.

Если map должно быть изменчивой ссылкой, тогда вам нужно будет выполнить еще одну работу. В противном случае используйте final. Действительно, используйте final всякий раз, когда можете, даже если это «легче» не делать. «final - новый [старый] private». Вероятно, вы хотите сделать mapprivate и общий.

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