2010-07-12 5 views
9

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

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

ответ

10

№ A synchronized метод в Java идентичен всему методу, имеющему тело, обернутое в блок synchronized (this). Так, если один поток находится в методе synchronized, другой поток не может одновременно находиться в другом методе synchronizedна том же объекте.

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

+0

Благодаря Borealid .. Но если это так, почему Java обеспечивает синхронизацию, специфичные для методов, она может только при условии, для весь класс? – JavaUser

+1

@JavaUser: 'synchronized (this)' не означает, что весь класс «синхронизирован». Это означает, что вы приобрели блокировку объекта экземпляра, на который был вызван метод. Вы не обязательно хотите, чтобы * все * методов были «синхронизированы» (на самом деле, вы редко когда-либо будете). Чтобы получить производительность многопоточного кода, вы должны использовать как можно меньше блокировок при сохранении правильности программы - каждый раз, когда у вас есть фиксированная блокировка, какой-то поток будет ждать, ничего не делая. – Borealid

+0

@ Borealid .. момент, который я определил, синхронизированный в любом методе, весь объект заблокирован, когда я вызываю этот метод .. я прав? – JavaUser

3

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

+0

, что было полезно. Благодаря! – peakit

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