Разрешить метод блокировки своего родительского объекта в Java

Есть ли способ в Java получить метод блокировки (mutex) объекта, в котором он находится?

Я знаю, что это звучит запутанно, но в принципе я не эквивалентен этому фрагменту С#, но на Java.

lock(this)
{
    // Some code here...
}

Мне было поручено переопределить API, написанный на .Net в Java, и мне было предложено сохранить версию Java как схожую с .Net-версией по-человечески. Этому не помогает тот факт, что версия .Net выглядела так, как будто она была расшифрована из версии С++, к которой у меня нет доступа.

В любом случае приведенная выше строка появляется в версии С#, и мне нужно что-то, что делает то же самое в Java.

Ответы

Ответ 1

Эквивалент:

synchronized (this)
{
}

(И нет, вы вообще не должны делать это ни на С#, ни в Java. Предпочитаете блокировку на частных ссылках, к которым ничего другого не имеет доступа. Вы, конечно, знаете об этом, но я не хотел оставить ответ без предупреждения:)

Ответ 2

Предполагая, что код С++ является простым мьютексом, замените "lock" на "synchronized"

synchronized (this)
{
// ...
}

Здесь Java Concurrency учебник для получения дополнительной информации

Ответ 3

Я бы порекомендовал Брайана Гетца Java Concurrency На практике." Это отличная книга.

Хорошо, если бы синхронизированный блок был как можно меньшим. Использование синхронизированного модификатора в методе является грубым, а иногда и необходимым, но в противном случае вы можете использовать другой объект, чтобы он блокировал блок.

Вот так:

public class PrivateLock {
    private final Object myLock = new Object();
    @GuardedBy("myLock") Widget widget;

    void someMethod() {
        synchronized (myLock) {
            // Access or modify the state of widget
        }
    }
}