thread mkyong ejemplo java multithreading mutex

mkyong - Obtención de bloqueo exclusivo de todo el sistema en Java



semaphore java (5)

Cada vez que inicia el ejecutable Java, inicia una nueva instancia de Java Virtual Machine (JVM). Son como estaciones de trabajo diferentes. Es por eso que no existe tal cosa como el sistema de exclusión mutua en Java.

Estoy trabajando de nuevo en un ejecutable Java que puede iniciarse varias veces, y quiero que el proceso proceda de uno en uno. En C # haría esto con un Mutex nombrado / sistema, pero esto no parece ser posible en Java. ¿Cómo puedo lograr esta funcionalidad?


Java es una herramienta de denominador menos común que proporciona una funcionalidad que es común a todas las plataformas en las que se ejecuta, es decir, si ya se ha implementado.
Podría usar JNA (una forma simplificada de acceder a la funcionalidad nativa)

En el pasado, he usado sockets para asegurarme de que un programa no pudiera iniciarse si se estaba ejecutando.
Como se indica en otra parte, un Semáforo basado en archivos podría funcionar, por supuesto, una desventaja es que si el programa falla, su semáforo tiene que restablecerse manualmente.



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

Tratar de evitar que se ejecuten 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.


Si su sistema operativo proporciona estos mutexes, ¿quizás podría hacerlo 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 le brinda Java puro.