Само поле не является общим для двух экземпляров. Это разные поля. Однако они начинаются с того же значения, что и строковые литералы интернированные.
Это означает, что когда блок synchronized
получает монитор строки в одном потоке, он не позволит другому потоку получить тот же монитор. Важно понимать, что блок synchronized
получает блокировку для монитора, связанного со значением поля - не имеет значения, что задействованы два отдельных поля.
Мораль: не синхронизировать строки, особенно литералы. Литералы особенно плохи, потому что в этом случае у вас может быть другой класс с тем же кодом, что и A
, и также попытается синхронизировать, используя тот же монитор.