Jag sitter och pular med en serverapplikation, och fick nu några funderingar. Jag har ett eget logg-system, för att logga vad som händer, där det skrivs information till en XML-fil. Serverapplikationen är multitrådad, dvs. skapar en ny tråd för varje klient. Vid varje klientanrop anropas en klass ( ReadWriteClient.class ) som sköter hanteringen av klienten, och i ReadWriteClient så öppnas filen, loggningen görs, och till slut stängs filen.
Problemet kan beskrivas så här:
Klient[0] uppkopplad, ny tråd[0] skapas.
Logfilen öppnas av tråd[0].
Klient[1] uppkopplad, ny tråd[1] skapas.
Logfilen öppnas av tråd[1].
Loggning sker av tråd[1].
Loggen av tråd[1] sparas till filen.
Loggning sker av tråd[0].
Loggen av tråd[0] sparas till filen.
Som ni ser så kommer vid det här scenariot loggen från tråd[1] att tappas bort, eftersom att skrivning från tråd[0] sker efter, som var först att öppna filen.
Hur löser jag det på bästa sätt? Ska jag synchronize:a metoderna för öppna/spara, eller ska jag skapa pooler och synchronize:a på något sätt?
När du skapar dina trådar så skickar du med this som ett argument och i this, dvs grund tråden så har du funktionen för att skriva till logg filen, den funktionen är då också synchronized. Anroppet från klienten ser då ut såhär
parent.writeLog("New client");
Där parent då är pekaren (referensen) till grund tråden/programmet.