Чем отличаются синхронизированные методы экземпляра и статические синхронизированные методы в Java?
Answer from AI
sobes.tech AI
В Java синхронизированные методы бывают двух типов: синхронизированные методы экземпляра и статические синхронизированные методы. Основное отличие заключается в том, на каком объекте происходит блокировка:
-
Синхронизированный метод экземпляра (
synchronizedбезstatic): Блокировка происходит на объекте (this), к которому принадлежит метод. Это значит, что если у вас есть несколько экземпляров класса, каждый из них имеет свою собственную блокировку. -
Статический синхронизированный метод (
static synchronized): Блокировка происходит на объекте класса —Classобъекте, который представляет сам класс. Таким образом, блокировка общая для всех экземпляров класса.
Пример:
public class Example {
public synchronized void instanceMethod() {
// блокируется this
}
public static synchronized void staticMethod() {
// блокируется Example.class
}
}
Это означает, что два потока не могут одновременно выполнить один и тот же синхронизированный метод экземпляра одного объекта, но могут выполнять синхронизированные методы разных объектов этого класса.
В то же время, статический синхронизированный метод блокирует класс целиком, поэтому в один момент времени только один поток может выполнять любой статический синхронизированный метод этого класса, независимо от экземпляров.