They are not different syntaxes. They all do the same thing, they use the object given as a lock.
*Never* use synchronized(new <constructor call>) {}, and *never* use synchronized(Thread.currentThread()) {}.
The first one will always lock on a new object, which makes it useless. The second one will always lock on the
thread running the synchronized code, which will always acquire the lock, which makes it useless.
synchronized(this) {} happens often, and is very useful. Synchronizing on System.out and on "A" should technically work, but they may make the code less readable. Synchronizing on System.out may have its uses, but "A" never makes sense.