2010-07-07 19 views

Respuesta

7

Usted puede utilizar el acceso exclusivo a un archivo en el sistema de archivos para lograr un comportamiento similar. No creo que haya algo similar a lo que has mencionado.

Ejemplos

+0

¿cómo conseguirías acceso exclusivo a un archivo? –

+0

polluelo esto: http://forums.sun.com/thread.jspa?threadID=465792 –

+0

http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileLock .html –

4

Cada vez que se inicia ejecutable de Java, se inicia una nueva instancia de la máquina virtual Java (JVM). Son como estaciones de trabajo diferentes. Es por eso que no existe tal cosa como mutex del sistema en Java.

+0

Entiendo que se encuentran en diferentes tiempos de ejecución/procesos, pero muchos (¿la mayoría?) de los sistemas operativos proporcionan una función mutex del sistema. ¿Java no tiene una forma de acceder a él? –

+0

El problema es que Mutex es una herramienta de sincronización. Si escribe una aplicación nativa, los mutex se pueden usar para sincronizar hilos (o procesos) en límites de una sola máquina. Pero si escribes una aplicación Java, entonces tu silencio es java.lang.Object. Tiene métodos de espera/notificación, pero tienen sentido solo en los límites de una sola máquina (JVM). Un ejemplo: alojamiento en la nube de Java en Google App Engine. Crea nuevas JVM a pedido. El programador no sabe si se crea una nueva JVM en el mismo host o en otro nodo del clúster. – Antonio

+6

Esa es la misma historia para, por ejemplo, Las aplicaciones .NET, sin embargo, tienen mutexes con nombre. La historia corta es que Java no. – nos

0

Si su sistema operativo proporciona estas exclusiones mutuas, tal vez usted podría hacer con una biblioteca nativa? (http://en.wikipedia.org/wiki/Java_Native_Interface) Por supuesto, accederá a este recurso de una manera específica del sistema operativo, por lo que perderá la portabilidad que Java puro le brinda.

2

Java es una herramienta mínimo común denominador que proporciona funcionalidad que es común a todas las plataformas que se ejecuta en, es decir, si se ha implementado todavía.
You could use JNA (Una manera simplificada acceder a la funcionalidad nativa)

En el pasado he utilizado tomas para asegurarse de que un programa no puede iniciarse si se estaba ejecutando.
Como se indica en otro lugar, un semáforo basado en archivos podría funcionar, por supuesto una desventaja de esto es si el programa se bloquea entonces su semáforo debe ser restablecido manualmente.

-1

Recuerde que Java se ejecuta en una máquina virtual Java. Al igual que los mecanismos de sincronización del nivel del sistema operativo generalmente solo afectan a la máquina en la que se ejecuta, los mecanismos nativos de sincronización de Java solo funcionan dentro de esa JVM.

Intentar evitar que se inicien varias JVM para hacer algo es análogo a tratar de evitar que una aplicación se ejecute al mismo tiempo en varias máquinas físicas, y probablemente no valga la pena.

+1

Eso solo es correcto con respecto a las aplicaciones del lado del servidor. Muchas aplicaciones de GUI del lado del cliente requieren solo una versión para ejecutarse a la vez y no hay ninguna alternativa. – Dennis

+1

Él no preguntaría si no valdría la pena ... Quizás no pueda evitar el arranque de varios JVM, pero ¿a quién le importa? Lo importante es colocar este bloqueo en el punto más temprano del programa para que pueda esperar/abortar si se están ejecutando otros procesos. – jontejj

Cuestiones relacionadas