allora avrei il seguente problema di sincronizzazione.....

ho una lista di oggetti connection ognuno dei quali stampa su prompt tutti i messaggi che riceve.
Ogni oggetto connection stabilisce una connessione ad un nodo tramite ssh per la cronaca.
I messaggi che però vengono visualizzati sono però mischiati tra loro

Qui sotto metto il codice dell'oggetto connection:
import java.io.*;
import java.lang.Runtime;


import com.jscape.inet.ssh.*;
import com.jscape.inet.ssh.util.*;



public class Connection extends SshAdapter
{
// variabli per il collegamento
private String hostname;
private String username = "uniroma_orte";
private String password = "pdcthebest";
private Ssh ssh;
public boolean connError = false; // indica che il tentativo di connessione ha dato errore




// costruttore di una nuova connessione
public Connection(String pwd) throws SshException
{
this.hostname = pwd;

File privateKey = new File("id_rsa");

SshParameters sshParams = new SshParameters(hostname,username,password,privateKe y);
ssh = new Ssh(sshParams);
}








/** La funzione connect() effettua la connessione tramite ssh
*/
public boolean connect()
{
try
{
ssh.connect();
System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println("Connesso al nodo: " + this.hostname);
System.out.println();
return true;
}
catch (SshException e)
{
System.out.println("Connessione al nodo " + this.hostname + " non riuscita");
connError = true;
return false;
}
}









/** La funzione disconnect() effettua la disconnessione
* @throws IOException
*/
public void disconnect() throws IOException
{
// invia tramite ssh il comando per chiudere il programma Tera
OutputStream out = ssh.getOutputStream();
String command = "7";
out.write(command.getBytes());
out.write("\n".getBytes());

// disconnette il nodo
ssh.disconnect();
System.out.println("disconnessione al nodo: " + this.hostname);
}







/** La funzione getHost() restituisce il nodo a cui si riferisce la connessione
*/
public String getHost()
{
return this.hostname;
}









/** La funzione equals(Object) verifica l'uguaglia tra gue oggetti di tipo Connection
*/
public boolean equals(Object o)
{
if ( o instanceof Connection)
if (((Connection)o).hostname.equals(this.hostname))
return true;

return false;
}










/** La funzione teraExe() lancia, tramite il comando "java tera.NodeManager", il programma Tera sulla macchina
* a cui si riferisce la connessione.
*/
public void teraExe() throws SshException, IOException, InterruptedException
{
ssh.addSshListener(this);

// lancia tramite ssh il comando per avviare il programma Tera
OutputStream out = ssh.getOutputStream();
String command = "java tera.NodeManager";
out.write(command.getBytes());
out.write("\n".getBytes());
}







/** La funzione dataReceived(SshDataReceivedEvent) stampa a video i messaggi inviati dal server ssh ossi dal
* nodo a cui si riferisce la connessione
*/
public void dataReceived(SshDataReceivedEvent ev)
{
synchronized(this)
{
System.out.print(ev.getData());
}
}








public void connectionManager(String command) throws IOException, InterruptedException
{
OutputStream out = ssh.getOutputStream();
out.write(command.getBytes());
out.write("\n".getBytes());

ConnectionManager connMan = null;
connMan.menu();
}





public void connectionManager(String command, String topic) throws IOException, InterruptedException
{
OutputStream out = ssh.getOutputStream();
out.write(command.getBytes());
out.write("\n".getBytes());
out.write(topic.getBytes());
out.write("\n".getBytes());

ConnectionManager connMan = null;
connMan.menu();
}

}