Originariamente inviato da strider
Io pensavo che assegnando com_1 come argomento a sol_1 in Main() e quindi passando la referenza a com_1 a mycomandante nel constructor di soldatino_1 le due Thread fossero indirizzate sullo stesso oggetto (mycomandante = comandante_1), dove sbaglio?
Che l'oggetto Soldatino_1 riceve (e si tiene dentro) un riferimento all'oggetto Comandante_1, su questo non ci sono dubbi e non ho nulla da ridire.

Ma non è questo il punto. Il punto fondamentale è che l'oggetto su cui acquisire il "lock" deve essere lo stesso. Ma nel tuo codice non è così. In comandante_1 usi un metodo di istanza synchronized, quindi il lock è su sé stesso, ovvero l'oggetto comandante_1.
Mentre in soldatino_1 usi un altro metodo di istanza anch'esso synchronized e il lock è pure su sé stesso, ovvero l'oggetto soldatino_1. Cioè stai acquisendo il lock su due oggetti differenti. E non è quindi una "sincronizzazione" corretta tra le due entità.
Non basta che ci siano banalmente dei metodi synchronized, conta su quale oggetto si sta acquisendo il lock!

Ecco perché ti consigliavo prima di incapsulare la logica in una classe apposita. Ma per una questione principalmente di "design" che ti permetterebbe però non solo di non "sparpagliare" la logica di attesa tra le due entità ma anche di poter focalizzare l'attenzione sul "unico" lock.