Что такое потокобезопасный в Java?

Возможный дубликат:
Что означает потокобезопасность?

Я очень смущен, что любой класс является потокобезопасным. Я понимаю, что если какой-либо класс является потокобезопасным, то он имеет некоторые специфические методы (как синхронизированные). Это правильно или неправильно? Пожалуйста, помогите мне, уточнив смысл этого.

2 ответа

Как сказал Сет, потокобезопасность означает, что метод или экземпляр класса могут использоваться несколькими потоками одновременно без каких-либо проблем.

Рассмотрим следующий метод:

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 возвращается Теперь это нить AПоворот снова. Нить A продолжается. И добавляет 1 в tmp (tmp было 0 для темы A). И затем сохраняет это значение в myInt, myInt опять 1,

Так что в этом случае метод AddOne() был вызван два раза, но из-за того, что метод не был реализован потокобезопасным способом, значение myInt не является 2, как и ожидалось, но 1 потому что второй поток читает переменную myInt прежде чем первый поток закончил обновление.

Создание потоково-безопасных методов очень сложно в нетривиальных случаях. И есть немало методов. В Java вы можете пометить метод как синхронизированный, это означает, что только один поток может выполнить этот метод в данный момент времени. Другие потоки ждут своей очереди. Это делает метод потокобезопасным, но если в методе нужно выполнить много работы, то это напрасная трата времени. Another technique is to 'mark only a small part of a method as synchronized' by creating a lock or semaphore, and locking this small part (usually called the critical section). There are even some methods that are implemented as lockless thread safe, which means that they are built in such a way that multiple threads can race through them at the same time without ever causing problems, this can be the case when a method only executes one atomic call. Atomic calls are calls that can't be interrupted and can only be done by one thread at a time.

Потокобезопасность просто означает, что он может использоваться из нескольких потоков одновременно, не вызывая проблем. Это может означать, что доступ к любым ресурсам синхронизирован или что-то еще.

Другие вопросы по тегам