Newsgroup: it.comp.java
Titolo: sincronizzazione file

Ho un servlet che deve scrivere un file su internet.
Per farlo utilizzo il codice:
FileOutputStream ostream = new FileOutputStream("nomefile.dat");
ObjectOutputStream o = new ObjectOutputStream(ostream);
o.writeObject(vector);
quello che vorrei evitare č che piů persone cerchino di modificare assieme
il file incappando in un errore.
Sň che devo sincronizzare il tutto, ma non sň come farlo.
Come devo modificare questo codice?
Grazie

Come devo modificare questo codice?
Puoi mettere il tutto all'interno di un metodo synchronized,
per saperne di più segui il link:
http://java.sun.com/docs/books/tutorial/essential/threads/multithreaded.html
Bye

modificare assieme il file incappando in un errore.
Credo di avere un esempio che fa a caso tuo, poi dimmi se ti è stato utile.
-----------------------------------------------------------------------------
/*
 DemoSynchronized - Demo of using synchronized method class
 Java Code by Castagna
 Semplicissimo esempio che mostra l'uso di synchronized con
 più threads che cercano di accedere contemporaneamente in
 scrittura allo stesso file.
*/
import java.lang.Compiler;
import java.lang.Class;
import java.io.PrintWriter;
import java.io.FileOutputStream;
import java.util.Random;
import java.util.GregorianCalendar;
class MyLogger {
  private PrintWriter f;
  private GregorianCalendar gc;
  MyLogger (String filename) throws Exception {
    FileOutputStream os = new FileOutputStream(filename);
    f = new PrintWriter (os);
    gc = new GregorianCalendar();
  } // MyLogger
 
  // Questo metodo è atomico, non può essere interrotto una volta iniziato...
  public synchronized void write (String s) throws Exception {
    f.println (gc.getTime().toString() + " - 1st time: " + s);
    Thread.sleep(1000); // Causa un ritardo nell'applicazione o al singolo MyThread?
    f.println (gc.getTime().toString() + " - 2nd time: " + s);
    Thread.sleep(1000);
    f.println (gc.getTime().toString() + " - 3rd time: " + s);
    Thread.sleep(1000);
    f.println (gc.getTime().toString() + " - 4th time: " + s);
    Thread.sleep(1000);
  }
 
  public void close() {
    f.close();
  }
}
class MyThread extends Thread {
  private MyLogger l;
 
  MyThread (String filename) throws Exception {
    l = new MyLogger ("nomefile.txt");
  } // MyThread
 
  public void run () {
    Random r = new Random();
    int i = r.nextInt (4) + 1; // Per vedere dove sta il problema uso i fisso...
    i = 3;
    for (int j = 0; j < i; j++) {
      try {
        l.write (getName() + ": Message number " + j + ". ");
      } 
      catch (Exception e) {}
      finally {
        l.close(); // E' veramente necessario?
      }
    }
    l.close();
  } // run
} // MyThread
public class DemoSynchronized {
 
  public static void main(String args[]) throws Exception {
    for (int i = 1; i < 40; i++) {
      System.out.print ("Starting Thread number " + i + " ...");
      new MyThread ("nomefile.txt").start(); // Secondo voi questo va bene?
      System.out.println ("done.");
    }
 
    // Il programma termina normalmente...
    System.exit(0);
  } // end main
 
} // end DemoSynchronized
-----------------------------------------------------------------------------

 o.writeObject(vector);
- la servlet implementa SingleThreadModel, oppure
- crei un thread che soddisfa una coda di richieste di scrittura al file,
oppure
- synchronize(this) {
  File...
}
ad ogni modo il tentativo di aprire un file in scrittura se lo è già dovrebbe
riportare una eccezione, no?
Se qualcuno di voi ha da fare obiezioni di qualsiasi tipo vi prego di farlo
perchè potrei aver detto qualche sciocchezza, ho sempre una mezza quintalata
di sonno arretrato... qualcuno ne vuole un po'? ;)
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------