2012-08-15 31 views
7

Según lo que sé e investigado, la palabra clave synchronized en Java permite sincronizar un método o una instrucción de bloque de código para manejar el acceso de subprocesos múltiples. Si quiero bloquear un archivo para fines de escritura en un entorno de subprocesos múltiples, I debe debe utilizar las clases en el Java NIO package para obtener los mejores resultados. Ayer, surgió una pregunta sobre el manejo de un servlet compartido para las operaciones de E/S de archivos, y los comentarios de BalusC son buenos para ayudar con la solución, pero el código en this answer me confunde. No le estoy pidiendo a la comunidad que "queme esa publicación" o "vamos a rechazarlo" (nota: no lo he votado negativamente ni nada, y no tengo nada en contra de la respuesta), estoy pidiendo una explicación si el fragmento de código puede considerarse una buena prácticaSincronizar objeto de archivo

private static File theFile = new File("theonetoopen.txt"); 

private void someImportantIOMethod(Object stuff){ 
    /* 
     This is the line that confuses me. You can use any object as a lock, but 
     is good to use a File object for this purpose? 
    */ 
    synchronized(theFile) { 
     //Your file output writing code here. 
    } 
} 
+1

+1 porque ahora tiene más de 4000. – Hassan

+1

@Hassan sea quien sea y sea cual sea su reputación, no haga eso hasta que sienta que la pregunta/respuesta es útil. –

+0

@Nandkumar Me gusta esta pregunta, solo pensé que era divertida. – Hassan

Respuesta

4

El problema no se trata de bloqueo en un objeto File - puede bloquear en cualquier objeto y que realmente no importa (hasta cierto punto).

Lo que me sorprende es que está utilizando un monitor no final, por lo que si otra parte de su código reasigna el archivo: theFile = new File();, el siguiente hilo que se cierre se bloqueará con un objeto diferente y no tiene ninguna garantía de que su código no será ejecutado por 2 hilos simultáneamente más.

Si theFile fuera final, el código estaría bien, aunque es preferible utilizar monitores privados, solo para asegurarse de que no haya otro código que lo use para otros fines de bloqueo.

+0

Sí, estoy bastante seguro de que no importa que el candado en este caso sea un Archivo (aparte de la 'final' faltante, como ya lo notó). En todo caso, es un código confuso, ya que sugiere alguna conexión entre la tierra JRE y el terreno del sistema de archivos cuando (probablemente) no existe. – dsummersl

+0

Sí, la palabra clave 'final' marcará la diferencia, como se indica en la publicación [¿Cómo funciona la sincronización en Java?] (Http://javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html) Lo que me confundió fue bloquear el bloque de código usando un objeto 'File', de hecho me confundí por el bloqueo de Java y el bloqueo del sistema operativo en el archivo, pero creo que estos bloqueos son muy diferentes. –

1

¿Has visto: final Object lock = new Object(), estarías preguntando?
Como @assylias señaló que el problema es que el bloqueo no es final aquí

1

Todos los objetos en Java pueden actuar como un candado para la sincronización. Se llaman bloqueos intrínsecos. Solo un hilo a la vez puede ejecutar un bloque de código protegido por un bloqueo determinado.

Más sobre esto: http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

El uso de la palabra clave sincronizada para todo el método podría tener impacto en el rendimiento de la aplicación. Es por eso que a veces puedes usar bloques sincronizados.

Recuerde que la referencia de bloqueo no puede modificarse. La mejor solución es usar la palabra clave final.

2

Si solo necesita bloquear el archivo en una sola aplicación, entonces está bien (suponiendo que se haya agregado final).

Tenga en cuenta que la solución no funcionará si carga la clase más de una vez con cargadores de diferentes clases. Por ejemplo, si tiene una aplicación web que se implementa dos veces en el mismo servidor web, cada instancia de la aplicación tendrá su propio objeto de bloqueo.

Como mencionas, si deseas que el bloqueo sea robusto y el archivo bloqueado de otros programas también, debes usar FileLock (ver los documentos, en algunos sistemas no se garantiza que todos los programas deban respetar el bloqueo) .

Cuestiones relacionadas