Le classi di I/O, in linea generale, non sono thread-safe. I Reader/Writer sono in grado di trattare un oggetto che fa da "lock", che viene passato dalle sottoclassi. Il discorso sarebbe un po' lungo e ti rimando quindi alla documentazione javadoc (e magari ai sorgenti del framework che sono molto più esplicativi e interessanti da vedere).Originariamente inviato da padrino9008
Ecco il codice: genero 4 Thread che hanno Ognuno il proprio oggetto PrintWriter però accedono allo stesso file, nell'esecuzione del programma tutto funziona perfettamente solo che non so se è un caso oppure l'accesso al file in qualche modo è già gestito dalla JVM facendo entrare un Thread alla volta.
Nel tuo caso però non è tanto un problema di thread safety a livello di uso degli oggetti, perché ogni thread ha il suo FileWriter e il suo PrintWriter.
Dici però bene che tutti i thread accedono allo stesso medesimo file e questo è un altro discorso e il problema teoricamente c'è comunque. Che sia la stessa applicazione Java che scrive da più thread sullo stesso file, che siano due applicazioni Java distinte che scrivono sullo stesso file, che siano applicazioni molto diverse (es. una Java, una "nativa") che scrivono sullo stesso file, in ogni caso non c'è affatto alcuna garanzia che vada tutto "bene".
È probabile che nel tuo caso non noti cose strane magari solo perché i thread girano con tempistiche aleatorie dovute a quei sleep con tempo casuale. Ma le possibilità che tu possa vedere testo mescolato (e magari anche male) ci sono, esistono.
Quindi la cosa più "pulita" che puoi fare è incapsulare la logica di scrittura del file in una classe a parte (che deve essere thread-safe, quindi deve avere metodi "sincronizzati") e poi passare 1 oggetto di questa classe ai tuoi thread.
P.S. Vedo che il tuo runnable riceve un SportelloThreadGrafico. Se alle tue istanze di SportelloThread passi lo stesso oggetto SportelloThreadGrafico, il problema di thread safety ci sarebbe per questo oggetto. Ma non so cosa fa, non so cosa è/fa getSg() e non so che oggetto restituisce. Questo devi valutarlo tu.