Этот вопрос проверяет понимание признаков, по которым можно определить, что класс не является потокобезопасным, что необходимо для написания корректного многопоточного кода.
Потокобезопасность класса означает, что его методы можно вызывать из нескольких потоков одновременно без риска нарушения целостности данных или получения неконсистентного состояния. Определить, что класс не является потокобезопасным, можно по нескольким ключевым признакам.
synchronized в Java, lock в C# или мьютексов в C++).ArrayList, HashMap в Java), без внешней синхронизации.Рассмотрим простой счетчик на Java:
public class UnsafeCounter {
private int value = 0;
public void increment() {
value++; // Неатомарная операция!
}
public int getValue() {
return value;
}
}Метод increment() выполняет операцию value++, которая на уровне процессора состоит из трёх шагов: чтение значения, увеличение, запись. Если два потока вызовут этот метод одновременно, оба могут прочитать одно и то же старое значение, увеличить его и записать. В результате инкремент произойдёт только один раз вместо двух.
@ThreadSafe или не указано в документации, что он безопасен, предполагайте худшее.synchronized, volatile или использования классов из java.util.concurrent.Вывод: Класс не является потокобезопасным, если его внутреннее состояние может быть повреждено при конкурентном доступе. Такой класс нельзя использовать в многопоточном окружении без внешней синхронизации. Для обеспечения безопасности нужно либо сделать состояние неизменяемым, либо использовать блокировки, атомарные типы или потокобезопасные коллекции.