Как получить монитор в случае статической функции?
Согласно разделу JLS § 8.4.3.6:
Синхронизированный метод получает монитор (§17.1), прежде чем он выполняется.
Для метода класса (статического) используется монитор, связанный с объектом Class для класса метода.
В этом синхронизированном методе перемещения блокируется уровень класса. Итак, какой именно объект класса используется для получения этой блокировки. Это Interface.class
или же ClassImplementingInterface.class
? Если это позже, есть ли сценарий, где мы можем иметь мониторы интерфейса? а точнее интерфейс имеет монитор?
Я прочитал, что каждый объект связан с монитором, и в случае статических блокировок монитор получается на соответствующем объекте класса. Как мы можем сделать Interface.Class, что означает, что интерфейс имеет соответствующий объект Class, мы можем получить блокировку на этом мониторе без явного указания synchronized(Interface.class)
,
1 ответ
interface
это тип и, следовательно, может получить его Class<?>
объект
public interface MyTest {}
...
Class<?> clazz = MyTest.class;
Однако для Java 7 и более ранних версий ваш вопрос спорен, поскольку интерфейсы не могут иметь статические методы, а статические методы не могут быть переопределены, поэтому он всегда получит Class
объект класса, к которому он вызывается.
public class StaticTest {
public static synchronized void test() {
// something
}
}
призвание StaticTest.test()
будет синхронизироваться на StaticText.class
объект.
Как, например, методы с synchronized
modifer, это снова будет монитор (замок) вызывающего объекта, который вы получите.
В Java 8 вы можете объявить и определить static
методы в интерфейсах, но их нельзя изменить с помощью synchronized
ключевое слово
InterfaceMethodModifier: (one of) Annotation public abstract default static strictfp
Это опять не проблема.
Отвечать
есть ли сценарий, где мы можем иметь мониторы интерфейса
не с synchronized
модификатор. Но вы всегда можете использовать синхронизированный блок в интерфейсе Class
объект.
synchronized (MyTest.class) {...}
но на самом деле, зачем ты это делаешь? Я думаю, что это будет сбивать с толку людей, читающих ваш код.