два разных синхронизированных метода одного и того же объекта? - PullRequest
9 голосов
/ 12 июля 2010

У меня есть 2 синхронизированных метода в классе, скажем method1 () и method2 ().Поток говорит, что «Поток 1» удерживает блокировку этого объекта класса, выполняя синхронизированный метод1 (). Может ли другой поток сказать «Поток 2», одновременно получить доступ к блокировке через метод2 (), в то время как «Поток 1» держитthe lock.

Этот случай аналогичен классу java.util.Vector, имеющему синхронизированные методы add () и remove ().Пожалуйста, объясните этот случай тоже.

Ответы [ 3 ]

10 голосов
/ 12 июля 2010

Нет.Метод synchronized в Java идентичен всему методу, тело которого заключено в блок synchronized (this).Поэтому, если один поток находится в методе synchronized, другой поток не может одновременно находиться в другом методе synchronized для того же объекта .

То, как это относится к Vectorв том, что вы не хотите, чтобы какой-то код пытался удалить элемент, в то время как другой код пытается добавить элемент.Это концепция критической секции ;Вы не только не хотите, чтобы кто-то другой пытался делать то, что вы делаете, вы также не хотите, чтобы кто-то другой делал что-то другое, что могло бы помешать.

3 голосов
/ 12 июля 2010

Thread2 может получить доступ к блокировке, но не может войти в блок, охраняемый этой блокировкой, пока Thread1 удерживает ту же блокировку.

0 голосов
/ 12 июля 2010

Нет, только одна нить может удерживать блокировку одновременно

http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/essential/concurrency/syncmeth.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...