Проще говоря, потокобезопасность означает, что метод или экземпляр класса могут использоваться несколькими потоками одновременно без каких-либо проблем.
Рассмотрим следующий метод:
private int myInt = 0;
public int AddOne()
{
int tmp = myInt;
tmp = tmp + 1;
myInt = tmp;
return tmp;
}
Теперь поток A и поток B оба хотели бы выполнить AddOne (). но A запускается первым и считывает значение myInt (0) в tmp. Теперь по какой-то причине планировщик решает остановить поток A и отложить выполнение до потока B. Теперь поток B также считывает значение myInt (все еще 0) в свою собственную переменную tmp. Поток B завершает весь метод, поэтому в конце myInt = 1. И 1 возвращается. Теперь снова очередь за темой. Тема А продолжается. И добавляет 1 к tmp (tmp был 0 для потока A). И затем сохраняет это значение в myInt. myInt снова 1.
Таким образом, в этом случае метод AddOne вызывался два раза, но поскольку метод не был реализован в поточно-ориентированном способе, значение myInt не равно 2, как ожидалось, а 1, поскольку второй поток считал переменную myInt перед Первый поток завершил обновление.
Создание потоково-безопасных методов очень сложно в нетривиальных случаях. И есть немало методов. В Java вы можете пометить метод как синхронизированный, это означает, что только один поток может выполнить этот метод в данный момент времени. Другие потоки ждут своей очереди. Это делает метод потокобезопасным, но если в методе нужно выполнить много работы, то это приведет к напрасной трате пространства. Другой метод - 'пометить только небольшую часть метода как синхронизированную' , создав блокировку или семафор и заблокировав эту небольшую часть (обычно называемую критической секцией). Есть даже некоторые методы, которые реализованы как поточно-безопасные без блокировки, что означает, что они построены таким образом, что несколько потоков могут проходить через них одновременно, не вызывая проблем, это может быть в случае, когда метод только выполняет один атомарный вызов. Атомарные вызовы - это вызовы, которые не могут быть прерваны и могут выполняться только одним потоком за раз.