>x = p.getX(); // スレッドA
>x = p.getX(); // スレッドB
>p.setX(x+1); // スレッドA
>p.setX(x+1); // スレッドB
この例は
x = p.getX(); // スレッドA
p.setX(x+1); // スレッドA
を分けた時点で問題が別空間に逝っちゃってるね。
p.setX(100); // スレッドA
p.setX(200); // スレッドB
ってやったときに、p.xが200であることを保証するためのsynchronizedだろう。
ま、横槍で本筋とはあまり関係無いが・・・