Das eine synchronisiert auf die Klasse an sich, und das andere auf die Instanz. Wenn man zwei instanzen hat, kann bei synchronized(X.class) immer nur EIN Thread diesen Block betreten, egal auf welcher Instanz der Thread arbeitet. Bei synchonized(this) können zwei Threads den Block "gleichzeitig" abarbeiten, sofern die beiden Threads auf den unterschiedlichen Instanzen arbeiten. Das erste macht IMHO am ehesten (oder NUR???) bei static-Methoden Sinn...