Попытка визуализации и понимания синхронизация.Статический и нестатический объект блокировки в синхронизированном блоке
- Каковы различия между использованием статического объекта блокировки (код A) и нестатический блокировки объекта (Код B) для синхронизированных блока?
- Как он отличается в практических приложениях?
- Каковы подводные камни, которые у других не было бы?
- Каковы критерии для определения, какой из них использовать?
Код
public class MyClass1 {
private static final Object lock = new Object();
public MyClass1() {
//unsync
synchronized(lock) {
//sync
}
//unsync
}
}
Код B
public class MyClass2 {
private final Object lock = new Object();
public MyClass2() {
//unsync
synchronized(lock) {
//sync
}
//unsync
}
}
Примечание
Приведенный выше код показывает, конструкторами, но вы могли бы говорить о том, как бэха vior отличается в статическом методе и нестационарном методе. Кроме того, было бы целесообразно использовать статический замок, когда синхронизированный блок модифицирует статическую переменную-член?
Я уже смотрел ответы в this question, но недостаточно ясно, что представляют собой различные сценарии использования.
«Обратите внимание, что приведенный выше код показывает конструкторы:« Это важное различие. Синхронизированный блок с полем экземпляра в конструкторе абсолютно бессмысленен, поскольку ни один из двух потоков никогда не будет выполнять конструктор в одном экземпляре. – Thilo
Собственно, подумайте об этом, это поле экземпляра может содержать объект, общий для потоков. Например, 'private final Object lock =" niceLiteralString ";'. – Thilo
Я понимаю использование конструкторов, чтобы показать пример, была плохая идея. Мой вопрос распространяется и на статические и нестатические методы. Кроме того, как распределение статического/экземпляра влияет на блокировку? – ADTC