2013-04-02 3 views
1

Если класс A имеет два синхронизированных метода, скажем, methodA и methodB. Если один поток обращается к методу А, может ли другой метод доступа к потоку? По моему мнению, при доступе к методу A поток получает блокировку объекта, другой поток не должен иметь доступ к методу B одновременно. Но это сильно снизит производительность, не так ли? И, казалось, я привык читать одну статью, в которой говорится, что другой поток может получить доступ к методу B. Какой из них правильный?Как работа с синхронизацией java

+0

Зависит от того, что вы используете для блокировки. Если метод синхронизирован, только один поток имеет к нему доступ во время выполнения. – Shark

ответ

5

Если класс А имеет два синхронизированных метода, скажем, метод А и метод Б. Если один поток обращается к методу А, может ли другой метод доступа к потоку? По моему мнению, при доступе к методу A поток получает блокировку объекта, другой поток не должен иметь доступ к методу B одновременно.

Это верно; если один поток удерживает блокировку объекта, другие потоки должны ждать, прежде чем они смогут получить блокировку. Конечно, это происходит только в том случае, если оба потока вызывают методы на одном и том же объекте.

Но это сильно снизит производительность, не так ли?

Это может повлиять на производительность, но иногда это необходимо, например, для предотвращения одновременного изменения двух потоков одновременно.

И, казалось, я привык читать одну статью, в которой говорится, что другой поток может получить доступ к методу B. Какой из них правильный?

Первое правильное, второе неверно.

1

Но это сильно снизит производительность, не так ли?

Возможно, это может быть не так. Это зависит от характера приложения. Синхронизация может иметь почти нулевую стоимость, или это может быть основным узким местом, эффективно превращая многопоточное приложение в однопоточное.

См. Amdahl's Law.

И, казалось, я читал одну статью, в которой говорится, что другая нить может получить доступ к methodB.

Ни один другой поток не может назвать methodBна том же объекте в то время как methodA работает. Конечно, другие потоки могут называть methodBв других инстанциях того же класса.

+0

> почти нулевая стоимость - синхронизация не близка к нулю, даже если она не нужна. Вы можете сравнить производительность классов ArrayList и Vector, чтобы увидеть, что – popfalushi

+0

Чтобы доказать, что я сделал эксперимент. Код и результат в комментариях ниже кода: http://pastebin.com/UzxdzvV4. Arraylist.add в 2-3 раза быстрее, чем Vector.add, который является синхронизированной версией arraylist. – popfalushi

+0

@popfalushi говорит, что у вас есть тонны потоков, выполняющих медленные операции с дисками и сохраняющие их результаты в одном объекте ... накладные расходы на синхронизацию будут почти нулевыми, верно? –

Смежные вопросы