Hi Dirk,
also mit dem Singleton-Pattern wirst du das niemals schaffen. Das Singleton-Pattern verhindert (bei richtiger Implementierung -- Probleme mit mehrern Threads abfangen -> synchronized) , dass es mehr als eine
Instanz einer Klasse gibt. Wie du ja weißt werden alle Objekte auf dem Heap alloziert. Tja, der Heap
gehört zum Prozess bzw. Zum Adressraum des Prozesses. Wenn du deine Anwendung ein zweites Mal
startest, startest du einen neuen Prozess. Das kannst du ganz leicht mit dem Task-Manager nachvollziehen.
Jeder Prozess hat seinen eigenen virtuellen Adressraum. Die Hardware und das Betriebssystem sorgen
dafür, dass ein Prozess nicht den Speicher eines anderen lesen oder beschreiben kann. Das ist auch
gut so, sonst wäre der Manipulation von Daten ja Tür und Tor weit geöffnet.
Das was du suchst nennt man Interprozesskommunikation. Wau was für ein langes Wort.
Der eine Prozess soll dem anderen mitteilen, dass er schon läuft. Manche Betriebssysteme
bieten soetwas wie einen gemeinsamen Speicherbereich für die Interprozesskommunikation.
Man kann auch mit Pipes arbeiten. Indem man die Ausgabe des einen Prozesses über einen Puffer
in die Eingabe des Anderen umlenkt.
Aber die Lösung für dein Problem ist viel einfacher. Lass deinen Prozess einfach eine Datei an einer
bestimmten Position erstellen. Am besten im Arbeitsverzeichnis. Jeder Prozess prüft erst, ob es die Datei
schon gibt. Wenn es sie schon gibt wird beendet. Du musst jetzt allerdings darauf achten, dass deine
Anwendung die Datei beim Runterfahren wieder entfernt.
Diese Lösung ist noch nicht sehr schön. Also auf ein Neues. In Java gibt es seit JDK 1.4 das Paket
java.nio. Und darin gibt es channels. Aber jetzt mal langsam.
Erstelle einen FileInputStream auf eine beliebige Datei, welche als Synchronisationselement dienen soll.
Danach lässt du dir einen FileChannel vom FileInputStream geben. Das geht mit der getChannel-Methode.
Jetzt sperrst du die Datei exklusiv, indem du auf das FileChannel-Objekt die tryLock-Methode auf.
Wenn dir die ein FileLock-Objekt zurückgibt kann deine Anwendung weitermachen. Aber sicher dir eine
Referen auf das FileLock-Objekt (zum Beispiel private static FileLock lock). Wenn deine Anwendung fertig ist
rufst du einfach release auf dem FileLock-Objekt auf. Startet jetzt jemand einen zweiten Prozess mit deiner
Anwendung, so wird dieser von der tryLock-Methode eine null-Referenz zurückbekommen. Das bedeutet, dass
schon eine Anwendung läuft. Also abbrechen System.exit(1).
Du hast mit dieser Version auch keine Probleme, falls deine Anwendung abschmiert. Denn wenn der Prozess
aus irgendeinem Grund gekillt wird sorgt das Betriebssystem dafür, dass die Dateisperren freigegeben werden.
So ich hoffe das hilft weiter...
Und hier gibt es was grundlegendes über Betriebssysteme.
In zirka 2-3 Wochen werde ich, wenn ich mal wieder Zeit habe das Tutorial erweitern.
Mir schwebt ein Kapitel über Speicherverwaltung vor (Paging, Segmentierung usw.)
Also wenn du dann noch interesse hast schau noch mal rein.
http://www.computer-link.de/view.php?docID=1