tutorialspoint threads thread que multi manage implement example java multithreading

java - threads - Acceso multiproceso al archivo



runnable java (7)

Consideraría la sincronización en este caso. Imagine que 2 hilos (t1 y t2) abren el archivo al mismo tiempo y comienzan a escribir en él. Los cambios realizados por el primer subproceso se sobrescriben en el segundo subproceso porque el segundo subproceso es el último en guardar los cambios en el archivo. Cuando un hilo t1 está escribiendo en el archivo, t2 debe esperar hasta que t1 termine su tarea antes de que pueda abrirlo.

Además, si le importa la última actualización posible del archivo, debe sincronizar los hilos de escritura con el hilo que lee el archivo, de modo que si hay algún hilo que escriba el archivo, el hilo de lectura debería esperar.

Tenemos un programa java multiproceso. Varios hilos escribirán en un archivo, y un hilo leerá de ese archivo. Estoy buscando algunas ideas de diseño. ¿Es necesaria la sincronización?


Necesita sincronización (bloqueo) si tiene una combinación de lectores y escritores o escritores y escritores. Si solo tiene lectores, no necesita ninguna sincronización.

No desea que dos procesos escriban en el mismo archivo o un proceso escribiendo un archivo que otro está leyendo.


Si la sincronización es importante, puede hacer que su escritor se ejecute en su propio subproceso y permitir que otros subprocesos graben escrituras en el archivo. Aunque creo que lo primero a considerar es si escribir en un archivo es realmente lo que quieres hacer. Especialmente en situaciones de mucho tráfico, tener muchas E / S de disco puede no ser muy eficiente.


Si quisiera varios lectores y un escritor, estaría buscando un Bloqueo de lectura o un Mutex de escritura.

Pero quieres múltiples escritores y un lector. ¿Cómo sabes que estos escritores no sobrescribirán los datos de los demás? ¿Están de alguna manera segregados?


Una vez que varios subprocesos acceden a los datos compartidos, la sincronización es necesaria. Si varios hilos escriben en el mismo archivo sin alguna forma de bloqueo, entonces posiblemente terminará con un problema de actualización perdido.

Leer no es un problema tan grande en todas las circunstancias, así que debes considerar ... si un hilo está leyendo el archivo y al mismo tiempo otro hilo actualiza el archivo, ¿el hilo de lectura necesita saber sobre el cambio? Si es así, también debe bloquear el archivo para el hilo de lectura.


La sincronización es necesaria en este caso. FileChannel es útil para evitar que los archivos sean modificados por procesos externos a la JVM: no ocurre lo mismo con las aplicaciones que incluyen múltiples hilos que escriben en un solo archivo. Desde (más abajo en) JavaDoc para FileChannel:

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 hilos dentro de la misma máquina virtual.

Vea esta publicación para una breve discusión de las estrategias para compartir la escritura de archivos entre hilos.


FileChannel es, en teoría, seguro para subprocesos. Desde el javadoc:

Los canales de archivos son seguros para ser utilizados por múltiples hilos concurrentes. El método de cierre puede invocarse en cualquier momento, según lo especificado por la interfaz del canal. Solo una operación que involucra la posición del canal o puede cambiar el tamaño de su archivo puede estar en progreso en cualquier momento; intenta iniciar una segunda operación de este tipo mientras la primera está aún en progreso y se bloqueará hasta que se complete la primera operación. Otras operaciones, en particular aquellas que toman una posición explícita, pueden proceder concurrentemente; si de hecho lo hacen depende de la implementación subyacente y, por lo tanto, no está especificado.

Si puede usarlos, puede usar la sincronización integrada, en lugar de tener que escribir la suya propia.