Разрешение методу блокировать его родительский объект в 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
}
}
}