Názor k článku Síťování v Javě: Chatovací server od podlesh - Sice jsem kód jen zběžně prolétl, ale nemohu...

  • Článek je starý, nové názory již nelze přidávat.
  • 4. 5. 2006 9:46

    podlesh (neregistrovaný)

    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).

    Kritické místo je metoda remove, která naopak sychronizována není. Správná řešení jsou dvě:
    1. Metodu getClients() úplně vyhodit (vrací nebezpečná data) a místo toho doplnit operace jako:
      public synchronized boolean removeClient(Client client) {
         return clients.remove(client);
      }
      
      A pak volat removeClient().
    2. Zajistit, aby celý seznam byl vždy synchronizován:
      clients = Collections.synchronizedList(new ArrayList<clientthread>());
      
      Pak je možné klidně bez obav volat remove.