Не означает ли потокобезопасность отсутствие условий гонки? - PullRequest
2 голосов
/ 06 ноября 2019

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

Но я читаю также как здесь https://en.wikipedia.org/wiki/Thread_safety

Thread safe: Implementation is guaranteed to be free of race conditions when accessed by multiple threads simultaneously.

Могу ли я сказать, что ConcurrentHashMap является поточно-ориентированным, но не полностью синхронизированным? Какая здесь правильная терминология?

Ответы [ 3 ]

5 голосов
/ 06 ноября 2019

Я не знаю, что существует формальное определение «потокобезопасности».

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

«Потокобезопасный» для Map означал бы такие вещи, как:

  • Если два или более потоков хранят разные ключи, произойдут все хранилища.
  • Если два или более потоков хранят разные значения для одного и того же ключа, произойдет хотя бы одно из хранилищ.
  • Если один поток сохраняет значение для ключа, а другой поток пытается получить значение для этого ключа, тогда поток чтения либо получит старое или новое значение.
  • Значение для ключа K никогда не будетизменить из-за того, что несколько потоков обращаются к другим ключам и / или хранят их.
  • Одновременное использование одной и той же карты несколькими потоками никогда не вызовет JVM для выдачи VirtualMachineError, или заставьте его выйти из строя.
  • и т. Д.

Обратите внимание, что некоторые из приведенных выше примеров являются примерами условий гонки, которые сам класс не может предотвратить. «Thread safe» - это , а не обещание, что ваша программа будет свободна от условий гонки, если вы используете потокобезопасный класс. Он только обещает, что собственный исходный код класса не будет причиной ошибок, связанных с потоками в вашей программе.

0 голосов
/ 06 ноября 2019

, но могут возникнуть условия гонки, потому что (отрывок)

Поскольку любое нетривиальное использование любого "потокобезопасного" примитива, даже мьютекса, включает гонку, по определению .

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

0 голосов
/ 06 ноября 2019

Состояние гонки происходит, когда сущность обновляется или модифицируется несколькими участниками одновременно. Для простого чтения нет условия гонки, потому что чтение не совпадает с обновлением или модификацией.


ConcurrentHashMap, являющийся потокобезопасным, означает, что аспекты этого DS, где может возникнуть условие гонки, былипозаботился о.

Поэтому ... Да, хотя не все методы в ConcurrentHashMap защищены от одновременного доступа, ConcurrentHashMap является потокобезопасным, поскольку для этих методов параллельный доступ не является проблемой.

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