Я не знаю, что существует формальное определение «потокобезопасности».
Когда люди говорят, что некоторый класс является потокобезопасным, они обычно означают, что одновременное использованиеМетоды класса несколькими потоками не могут вызвать поведение, которое удивило бы разумного программиста, который прочитал документацию по классу.
«Потокобезопасный» для Map
означал бы такие вещи, как:
- Если два или более потоков хранят разные ключи, произойдут все хранилища.
- Если два или более потоков хранят разные значения для одного и того же ключа, произойдет хотя бы одно из хранилищ.
- Если один поток сохраняет значение для ключа, а другой поток пытается получить значение для этого ключа, тогда поток чтения либо получит старое или новое значение.
- Значение для ключа K никогда не будетизменить из-за того, что несколько потоков обращаются к другим ключам и / или хранят их.
- Одновременное использование одной и той же карты несколькими потоками никогда не вызовет JVM для выдачи
VirtualMachineError
, или заставьте его выйти из строя. - и т. Д.
Обратите внимание, что некоторые из приведенных выше примеров являются примерами условий гонки, которые сам класс не может предотвратить. «Thread safe» - это , а не обещание, что ваша программа будет свободна от условий гонки, если вы используете потокобезопасный класс. Он только обещает, что собственный исходный код класса не будет причиной ошибок, связанных с потоками в вашей программе.