Ich arbeite eine Java-Programmdatei, die mehrmals gestartet werden kann, neu und möchte, dass der Prozess einzeln fortgesetzt wird. In C# würde ich dies mit einem named/system Mutex tun, aber das scheint in Java nicht möglich zu sein. Wie kann ich diese Funktionalität erreichen?Exklusives systemweites Sperren in Java erhalten
Antwort
Sie können den exklusiven Zugriff auf eine Datei im Dateisystem verwenden, um ein ähnliches Verhalten zu erzielen. Ich glaube nicht, dass es etwas Ähnliches gibt wie das, was Sie erwähnt haben.
Beispiele
Jedesmal, wenn Sie ausführbare Java starten, können Sie eine neue Instanz der Java Virtual Machine (JVM) starten. Sie sind wie ein anderer Arbeitsplatz. Aus diesem Grund gibt es in Java keine Systemmutexe.
Ich verstehe, dass sie sich in verschiedenen Laufzeiten/Prozessen befinden, aber viele (meisten?) Betriebssysteme bieten eine System-Mutex-Funktion. Hat Java keine Möglichkeit, darauf zuzugreifen? –
Das Problem ist, dass Mutex ein Synchronisierungswerkzeug ist. Wenn Sie eine native App schreiben, können Mutexe zum Synchronisieren von Threads (oder Prozessen) in Bereichen eines einzelnen Computers verwendet werden. Aber wenn Sie eine Java-App schreiben, dann ist Ihre james.java.lang.Object. Es hat Wait/Notify-Methoden, aber sie sind nur in den Grenzen einer einzelnen Maschine (JVM) sinnvoll. Ein Beispiel: Java-Cloud-Hosting bei Google App Engine. Es erstellt neue JVMs auf Anfrage. Der Programmierer weiß nicht, ob eine neue JVM auf demselben Host oder auf einem anderen Knoten des Clusters erstellt wird. – Antonio
Das ist die gleiche Geschichte für z.B. .NET-Anwendungen - sie haben jedoch Mutexe benannt. Kurzgeschichte ist, Java nicht. – nos
Wenn Ihr Betriebssystem diese Mutexe bereitstellt, könnten Sie vielleicht mit einer nativen Bibliothek auskommen? (http://en.wikipedia.org/wiki/Java_Native_Interface) Natürlich greifen Sie auf diese Ressource auf eine Betriebssystem-spezifische Weise zu, so dass Sie die Portabilität verlieren, die Ihnen reines Java bietet.
Java ist ein Tool mit dem geringsten gemeinsamen Nenner, das Funktionalität bietet, die allen Plattformen gemein ist, auf denen es ausgeführt wird, das heißt, wenn es bereits implementiert wurde.
You could use JNA (Eine vereinfachte Art und Weise nativen Funktionen zuzugreifen)
In der Vergangenheit habe ich Steckdosen verwendet haben, um sicherzustellen, dass ein Programm konnte nicht gestartet werden, wenn eine Störung ausgeführt wurde.
Wie bereits an anderer Stelle erwähnt, könnte ein File Based Semaphore funktionieren, natürlich ist ein Nachteil, dass das Semaphor manuell zurückgesetzt werden muss, wenn das Programm abstürzt.
Denken Sie daran, dass Java unter einer Java Virtual Machine ausgeführt wird. Wie Synchronisierungsmechanismen auf Betriebssystemebene wirken sich Synchronisierungsmechanismen im Allgemeinen nur auf die Maschine aus, auf der sie ausgeführt werden. Native Java-Synchronisationsmechanismen funktionieren nur innerhalb dieser JVM.
Der Versuch, zu verhindern, dass mehrere JVMs gestartet werden, entspricht dem Versuch, die gleichzeitige Ausführung einer Anwendung auf mehreren physischen Computern zu verhindern, und ist den Aufwand wahrscheinlich nicht wert.
Das stimmt nur in Bezug auf serverseitige Anwendungen. Viele GUI-Anwendungen auf der Client-Seite benötigen nur eine Version, die gleichzeitig ausgeführt werden kann. – Dennis
Er würde nicht fragen, ob es das nicht wert wäre ... Du wirst vielleicht nicht verhindern können, dass mehrere JVMs starten, aber wen interessiert das? Wichtig ist, diese Sperre an den frühesten Punkt im Programm zu setzen, damit sie warten/abbrechen kann, wenn andere Prozesse ausgeführt werden. – jontejj
Wie würden Sie den exklusiven Zugriff auf eine Datei erhalten? –
Chick this out: http://forums.sun.com/thread.jspa?threadID=465792 –
http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileLock .html –