Разрешение методу блокировать его родительский объект в Java - PullRequest
4 голосов
/ 13 января 2009

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

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 13 января 2009

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

synchronized (this)
{
}

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

6 голосов
/ 13 января 2009

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

synchronized (this)
{
// ...
}

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

1 голос
/ 13 января 2009

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

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

1 голос
/ 13 января 2009

Я бы порекомендовал Брайану Гетцу «Параллелизм 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
        }
    }
}
...