Разрешить метод блокировки своего родительского объекта в 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
}
}
}
Ответ 4
Вы также должны изучить пакет java.util.concurrent API (JDK 5.0+) для дополнительных объектов управления concurrency, таких как семафор, обменник и т.д.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html