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.

codice:
import java.net.*;
import java.io.*;
public class SportelloThread implements Runnable{
	private Tagliando temp=null;
	private int name=0;
	private SportelloThreadGrafico g;
	
	public SportelloThread(int n,SportelloThreadGrafico h){
		g=h;
		name=n;
		}
		
	public void run(){
		int numclienti1=0;
		int numclienti2=0;
		try{
		PrintWriter out=new PrintWriter(new FileWriter("infospo.txt",true));
		while(true){
			Socket cs=new Socket("127.0.0.1",17001);
			ObjectInputStream in=new ObjectInputStream(cs.getInputStream());
			temp=(Tagliando)in.readObject();
			if(temp!=null) {
				if(temp.getType()==0) {
					System.out.println("==============\n
                                                          Sono lo Sportello: "+name+" Ho servito: \n"
                                                          +temp+
                                                          "Cliente Numero: " +numclienti1+
                                                          "\n==================");
					(g.getSg()).setGrafico(name,temp,numclienti1);
					out.println("Sportello: "+name+" Tipo1: "+numclienti1);
					out.flush();
					numclienti1++;
					Thread.sleep((int)(Math.random()*3000));
					}
				else {
					System.out.println("==============\n
                                                           Sono lo Sportello: "+name+" Ho servito: \n"
                                                           +temp+
                                                           "Cliente Numero: " +numclienti2+
                                                           "\n==================");
					(g.getSg()).setGrafico(name,temp,numclienti2);
					out.println("Sportello: "+name+" Tipo2: "+numclienti2);
					out.flush();
					numclienti2++;
					Thread.sleep((int)(Math.random()*3000));
					}
				}
			in.close();
			cs.close();
			}
		}catch(UnknownHostException e){
			System.out.println("Il server non risponde\n");
			e.printStackTrace();
			}
		catch(IOException e){
			System.out.println("Errore lettura\n");
			e.printStackTrace();
			}
		catch(ClassNotFoundException e){
			System.out.println("Classe Oggetto non trovata\n");
			e.printStackTrace();
			}
		catch(InterruptedException e){
				System.out.println("Errore Interrupted\n");
				e.printStackTrace();
				}
		}
	}