m1 sincronizza sull'oggetto su cui è invocato m1. Quindi thread differenti che invocano m1 su istanze differenti non si bloccano a vicenda, ovvero non c'è mutua esclusione.
m2 sincronizza sulla istanza di java.lang.Class di quella classe (dove c'è m2). Pertanto è una mutua esclusione "globale".
Ed essendo oggetti di lock comunque differenti non c'è mai mutua esclusione tra m1 e m2. Ovvero thread A può invocare m1 e contemporaneamente thread B può invocare m2.
E per finire: hai solo abbozzato il codice, quindi non si capisce cosa fanno quei metodi. Se m1 invocasse m2, allora il "collo di bottiglia" diventa proprio m2.


