Tengo varios hilos (algunos creados por Process X, otros por Process Y, y otros), y cada hilo debe escribirse en un archivo MyFile
. Sin embargo, si Thread T1
empieza a escribir a MyFile
primero, y luego, cuando Thread T2
empieza a escribir, tiene que esperar a que T1
a versión del archivo, para que se pueda leer el contenido que fueron escritos en Thread T1
. En otras palabras, cada hilo tendría un método finalizeThread
, así:Bloqueo de archivos Java
private void finalizeThread() {
File f = new File("MyFile.dat");
f.createNewFile(); // atomically creates the file, if it doesn't exist
locked_section {
readContentsFromFile(f); // read contents if some other thread already modified the file
modifyContentsFromFile(f); // modify
writeFile(f); // write, so that new threads can see the content modified by this thread
}
}
Mi pregunta es: ¿Cómo puedo lograr que la locked_section
en el código anterior? Estaba buscando en la clase FileLock
, pero dice en el Javadoc que "Los bloqueos de archivos se llevan a cabo en nombre de toda la máquina virtual Java. No son adecuados para controlar el acceso a un archivo por varios subprocesos dentro de la misma máquina virtual"..
¿Estás seguro de que realmente quieres el método finalize()? – Dmitry
No, el nombre del método no es en realidad 'finalize'. Es un método/devolución de llamada que se llama después de que el hilo (en realidad, un conjunto de hilos, pero esto es irrelevante para el caso) ha terminado con su trabajo, ya que no estoy usando los hilos de la API Java Concurrency API estándar. Voy a cambiarle el nombre para evitar confusiones con 'Object # finalize'. –