Если синхронизированный метод вызывает другой несинхронизированный метод, есть ли блокировка для несинхронизированного метода
Да и нет.
Если вы находитесь вsynchronized
метод, затем вызовы других методов, которые также synchronized
другими потоками, блокируются.Однако вызовы несинхронизированных методов другими потоками не заблокированы - каждый может вызвать их одновременно.
public synchronized void someSynchronizedMethod() {
...
someNonSynchronizedMethod();
...
}
// anyone can call this method even if the someSynchronizedMethod() method has
// been called and the lock has been locked
public void someNonSynchronizedMethod() {
...
}
Кроме того, если вы вызываете someSynchronizedMethod()
, но случаетсябыть в рамках метода someNonSynchronizedMethod()
, вы все еще удерживаете блокировку.Блокировка включается при входе в синхронизированный блок и отключается при выходе из этого метода.Вы можете вызывать все виды других несинхронизированных методов, и они все равно будут заблокированы.
Но вы задаете две разные вещи в своем вопросе:
В Java, если синхронизированный метод содержитвызов несинхронизированного, может ли другой метод получить доступ к несинхронизированному методу одновременно?
Да.Другие методы могут обращаться к несинхронизированным методам.
По сути, я спрашиваю, все ли в синхронизированном методе заблокировано (включая вызовы других синхронизированных методов)?
Э-э, да.Другие вызовы синхронизированных методов заблокированы.Но несинхронизированные методы не блокируются.
Кроме того, помните, что если метод static
, тогда блокировка находится на объекте Class
в ClassLoader
.
// this locks on the Class object in the ClassLoader
public static synchronized void someStaticMethod() {
Если метод является методом экземпляра, тогда блокировка находится на экземпляре класса.
// this locks on the instance object that contains the method
public synchronized void someInstanceMethod() {
В этих двух случаях есть 2 разные блокировки.
Наконец, когда вы имеете делос synchronized
методами экземпляра каждый экземпляр класса блокируется.Это означает, что два потока могут быть в одном и том же synchronized
методе одновременно с разными экземплярами .Но если 2 потока пытаются работать с synchronized
методами в одном и том же экземпляре, один будет блокироваться, пока другой не выйдет из метода.