Если класс A имеет два синхронизированных метода, скажем, methodA и methodB. Если один поток обращается к методу А, может ли другой метод доступа к потоку? По моему мнению, при доступе к методу A поток получает блокировку объекта, другой поток не должен иметь доступ к методу B одновременно. Но это сильно снизит производительность, не так ли? И, казалось, я привык читать одну статью, в которой говорится, что другой поток может получить доступ к методу B. Какой из них правильный?Как работа с синхронизацией java
ответ
Если класс А имеет два синхронизированных метода, скажем, метод А и метод Б. Если один поток обращается к методу А, может ли другой метод доступа к потоку? По моему мнению, при доступе к методу A поток получает блокировку объекта, другой поток не должен иметь доступ к методу B одновременно.
Это верно; если один поток удерживает блокировку объекта, другие потоки должны ждать, прежде чем они смогут получить блокировку. Конечно, это происходит только в том случае, если оба потока вызывают методы на одном и том же объекте.
Но это сильно снизит производительность, не так ли?
Это может повлиять на производительность, но иногда это необходимо, например, для предотвращения одновременного изменения двух потоков одновременно.
И, казалось, я привык читать одну статью, в которой говорится, что другой поток может получить доступ к методу B. Какой из них правильный?
Первое правильное, второе неверно.
Но это сильно снизит производительность, не так ли?
Возможно, это может быть не так. Это зависит от характера приложения. Синхронизация может иметь почти нулевую стоимость, или это может быть основным узким местом, эффективно превращая многопоточное приложение в однопоточное.
См. Amdahl's Law.
И, казалось, я читал одну статью, в которой говорится, что другая нить может получить доступ к
methodB
.
Ни один другой поток не может назвать methodB
на том же объекте в то время как methodA
работает. Конечно, другие потоки могут называть methodB
в других инстанциях того же класса.
> почти нулевая стоимость - синхронизация не близка к нулю, даже если она не нужна. Вы можете сравнить производительность классов ArrayList и Vector, чтобы увидеть, что – popfalushi
Чтобы доказать, что я сделал эксперимент. Код и результат в комментариях ниже кода: http://pastebin.com/UzxdzvV4. Arraylist.add в 2-3 раза быстрее, чем Vector.add, который является синхронизированной версией arraylist. – popfalushi
@popfalushi говорит, что у вас есть тонны потоков, выполняющих медленные операции с дисками и сохраняющие их результаты в одном объекте ... накладные расходы на синхронизацию будут почти нулевыми, верно? –
- 1. Работа с синхронизацией с выпуском приемника BroadCast
- 2. Работа с синхронизированной синхронизацией Java в синхронизированном блоке не работает
- 3. Работа с синхронизацией Обработка ClientInsert ServerInsert Conflict
- 4. Код Java Проблемы с синхронизацией
- 5. Java-потоки с синхронизацией времени
- 6. Java Rx - события с синхронизацией с фильтрами
- 7. Play Framework 1.2.4 Работа с синхронизацией в асинхронной теме: возможно?
- 8. Полная работа в той же теме пользовательского интерфейса с синхронизацией
- 9. Итератор и итераторList с синхронизацией в java
- 10. Банковский симулятор с синхронизацией в Java
- 11. Странное поведение с синхронизацией Java (блокировка, состояние)
- 12. Многопоточная защита с синхронизацией в Java
- 13. проблема с синхронизацией метода в Java
- 14. Связанная с синхронизацией проблема
- 15. Java Работа с битами
- 16. Работа с Java-объекты
- 17. Java - Работа с Multitouch
- 18. Работа с перечислениями Java
- 19. Проблемы с GNURadio с синхронизацией
- 20. Проблема с синхронизацией XGBoost4J?
- 21. Работа с Java + RestFB
- 22. Работа с камерой (Java)
- 23. Работа с массивами Java
- 24. Проблема с синхронизацией пружин
- 25. jQuery mouseover с синхронизацией
- 26. Проблемы с синхронизацией ASP.NET
- 27. Вопрос с синхронизацией
- 28. Вопросы, связанные с синхронизацией
- 29. Как квантор java "?" Работа?
- 30. сценарий оболочки с синхронизацией
Зависит от того, что вы используете для блокировки. Если метод синхронизирован, только один поток имеет к нему доступ во время выполнения. – Shark