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.