Ответ
Нет, не будут.
В Java ключевое слово synchronized для статических методов блокирует монитор объекта Class, а не экземпляра. Поскольку все статические методы класса используют один и тот же объект Class, доступ к любому из них будет сериализован.
Пример:
public class SingletonController {
public static synchronized void method1() {
// Выполняется с блокировкой класса SingletonController.class
}
public static synchronized void method2() {
// Будет ждать, пока method1() не освободит блокировку
}
}
Почему это важно: Даже если экземпляр класса один (синглтон), статические методы синхронизируются на уровне класса. Это предотвращает одновременный вызов любых synchronized static методов из разных потоков, обеспечивая потокобезопасность для операций на уровне класса.
Ответ 18+ 🔞
Да ты посмотри, какая история! Сидишь ты такой, думаешь: "Ну синхронизированные методы, один экземпляр — всё должно летать параллельно!" А тут, блядь, классический подвох, как кот в мешке, только мешок — это объект Class.
Смотри, чувак. Когда ты вешаешь synchronized на статический метод, ты не блокируешь экземпляр. Ты блокируешь, внимание, ёпта, сам класс! То есть монитор объекта SingletonController.class. И этот объект-то у тебя один на всю виртуальную машину, как ни крути.
Вот смотри на этот код, он тут не врёт:
public class SingletonController {
public static synchronized void method1() {
// Выполняется с блокировкой класса SingletonController.class
}
public static synchronized void method2() {
// Будет ждать, пока method1() не освободит блокировку
}
}
Представь картину: один поток зашёл в method1() и захватил замок на SingletonController.class. А второй такой: "О, method2() свободен, ща зайду!" А ему — стопэ, браток! Замок-то один и тот же! Сиди, жди, пока первый не выйдет и не щёлкнет этим замочком. Вот и получается, что они не будут работать параллельно, а будут скромно стоять в очереди, как за колбасой в девяностые.
Так что запомни раз и навсегда, чтобы не выглядеть, как манда с ушами: synchronized static — это про безопасность на уровне всего класса, а не отдельных его экземпляров. Если тебе нужна настоящая параллельность между статическими методами — это уже совсем другая, более хитрая жопа, с отдельными замками или java.util.concurrent. Но это уже, как говорится, совсем другая история, в рот меня чих-пых.