Diese Art von synchronized, also das synchronized vor den Methodenrumpf, locked immer auf "this", also auf das aktuelle Objekt, das diese Methode aufruft. Ein lock kann man sich sehr intuitiv so vorstellen:
Sobald du vor eine Methode synchronized schreibst, wird in dieser Klasse ein neues Attribut angelegt, also eine neue Klassenvariable mit dem Namen "locked". Diese Variable kann jetzt die Werte true und flase annehmen. Wenn eine synchronized Methode ausgeführt wird, wird als aller erstes dieses locked auf true gesetzt. Alle anderen Threads warten dann bei diesem Methoden Aufruf desselben Objektes automatisch bis locked wieder auf false gesetzt wurde. Am Ende des Methoden Rumpfes wird locked automatisch wieder auf false gesetzt und dann wird dem anderem Thread gesagt "Schau mal ich bin fertig vielleich is locked jetzt auf false". Der andere Thread prüft es und ruft die Methode auf.
Was dein wait da oben soll verstehe ich nicht, ich kenne wait nur in Verbindung mit Monitoren also würde ich ganz spontan sagen mach es raus und lass die zwei Methoden auf ein und dasselbe Objekt aufrufen, dann sollte es so funktionieren wie du es dir vorgestellt hast. Solltest du dir sicher sein, dss wait an dieser Stelle passt, lass es drin, wie gesagt ich kenne es nr bei Monitoren und net bei synchronized aer wenn du dir sicher bist, dass es passt, lass es drin.