Sice jsem kód jen zběžně prolétl, ale nemohu se ubránit dojmu, že se tam vloudila chybička v sychnronizaci. Označit metodu getClients() jako synchronized totiž vůbec nepomůže (je to dokonce úplně k ničemu, protože zde nemůže dojít k žádné kolizi).
remove, která naopak sychronizována není.
Správná řešení jsou dvě:
public synchronized boolean removeClient(Client client) {
return clients.remove(client);
}
A pak volat removeClient().
clients = Collections.synchronizedList(new ArrayList<clientthread>());Pak je možné klidně bez obav volat remove.