Подтвердить что ты не робот

Что такое поток Безопасно в java?

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

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

4b9b3361

Ответ 1

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

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

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

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

Создание потокобезопасных методов очень сложно в нетривиальных случаях. И существует немало методов. В Java вы можете пометить метод как синхронизированный, это означает, что только один поток может выполнить этот метод в заданное время. Остальные потоки ожидают очереди. Это делает поток потоков безопасным, но если в методе много работы, то это отнимает много времени. Другой метод заключается в том, чтобы "отметить только небольшую часть метода как синхронизированный", создав блокировку или семафор и заблокировав эту небольшую часть (обычно называемую критической секцией). Существуют даже некоторые методы, которые реализованы как незаблокированные потоки, что означает, что они построены таким образом, что несколько потоков могут проходить через них в одно и то же время, не вызывая проблем, это может быть случай, когда метод выполняет только один атомный вызов. Атомные вызовы - это вызовы, которые не могут быть прерваны и могут выполняться только по одному потоку за раз.

Ответ 2

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