Pregunta

Nota : he leído otras publicaciones sobre cómo bloquear y desbloquear un archivo. No encontré nada especial de lo que no fuera consciente. Así que pondré mi escenario aquí para que alguien pueda dar algunas sugerencias.

En mi experiencia, FileChannel.lock no garantiza la situación de bloqueo y desbloqueo de un archivo cuando diferentes objetos de varias instancias de jvm intentan bloquear y actualizar el archivo.

El escenario en mi aplicación es: hay tres programas separados que actualizan un archivo. Esos programas se ejecutan en diferentes instancias jvm. Supongamos que los programas son A, B y C, y que el archivo es F. Si A bloquea el archivo F, B y C deben esperar a que se abra F antes de que uno de los otros programas pueda controlarlo. Esto funciona bien si los programas se ejecutan en la misma instancia de jvm. Desafortunadamente, esto no funciona en varias instancias de jvm.

Tuve otra idea que era tener un archivo plano donde indicaría si F debería actualizarse. El contenido de ese archivo plano puede estar BLOQUEADO o DESBLOQUEADO. El valor predeterminado / inicial sería DESBLOQUEADO. Entonces, cuando uno de los programas querría actualizar F, necesita ver la bandera en el archivo plano. Si la bandera dice BLOQUEADO, debe esperar. Sin embargo, en este enfoque hay un problema: ¿qué sucede si varios programas abren el archivo sin formato exactamente al mismo tiempo y ven " DESBLOQUEADO " o dos programas que esperaban a que el archivo plano se leyera DESBLOQUEADO y, al mismo tiempo, vea las lecturas de archivo " DESBLOQUEADAS " ;?

¿Alguna idea, chicos?

¿Fue útil?

Solución

Si necesita bloquear un sistema de archivos, debe crear un directorio. El directorio existe significa "bloqueado", faltando el directorio significa desbloqueado.

El motivo es que la creación y eliminación de directorios deben ser operaciones atómicas en cualquier sistema de archivos. Entonces, tan pronto como dos procesos intenten crear el mismo directorio, uno de ellos recibirá un error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top