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

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

Я знаю, это звучит запутанно, но в основном я не буду равнодушен к этому фрагменту C#, но на Java.

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

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

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

4 ответа

Решение

Эквивалент этого:

synchronized (this)
{
}

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

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

synchronized (this)
{
// ...
}

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

Вам также следует заглянуть в пакет API java.util.concurrent (JDK 5.0+) для дополнительных объектов управления параллелизмом, таких как семафор, обменник и т. Д.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html

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

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

Как это:

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

    void someMethod() {
        synchronized (myLock) {
            // Access or modify the state of widget
        }
    }
}
Другие вопросы по тегам