Ancora una volta non capisco che vuoi dire... Tutto dipende da come strutturi la tua applicazione!
Il tuo thread ha il suo bel ciclo while infinito che recupera i messaggi.
(non credo che ci sia bisogno di un thread per fare questo, e soprattutto non deve essere sinchronized con il thread che visualizza il messaggio)
Se ad un certo momento nel tuo buffer ci sono 10 messaggi, il tuo thread lancia un nuovo thread che ti visualizza un messaggio. Viene lanciato un solo thread perchè la tua variabile "messaggioGiaVisualizzato" è stata posta a false. Quindi il thread che recupera i messaggi dal server non è più in grado di lanciare altri thread.
Spero di essere stato chiaro.

A parte questo, Non credo ci sia bisogno di rendere sincronizzati i due thread. La sincronizzazione si utilizza quando un thread non può partire se un altro non ha finito. Ma nel tuo caso vuoi che il thread principale continui a ricevere messaggi anche se il thread che visualizza i messaggi è in esecuzione.