The field itself isn't shared between two instances. They are distinct fields. However, they start off with the same value, as string literals are interned.
That means when the synchronized
block acquires the string's monitor in one thread, it will prevent the other thread from acquiring the same monitor. It's important to understand that the synchronized
block is acquiring the lock for the monitor associated with the value of the field - it doesn't matter that there are two separate fields involved.
Moral: don't synchronize on strings, particularly literals. Literals are particularly bad, because in this case you could have another class with the same code as A
, and that would also try to synchronize using the same monitor.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…