Hallo,
ich greife per Java auf eine Windows-COM-Anwendung zu. Um nicht bei jedem Zugriff eine neue Verbindung aufbauen zu müssen, kapsele ich die Verbindung in einem Singleton Pattern. Das funktioniert sehr gut: Zugriffe aus dem Haupt-Thread des Programms gehen problemlos.
Allerdings will ich jetzt auch aus einem zweiten Thread auf das Singleton zugreifen und die COM-Verbindung nutzen. Dabei gibt es aber Probleme:
Obwohl ich laut hashCode() und diverser Variablenattribute eindeutig zur korrekten Singleton-Instanz gelange, scheint die COM-Verbindung nicht nutzbar zu sein, solange ich nicht im neuen Thread ebenfalls eine neue COM-Verbindung aufbaue. Es ist also ganz eindeutig ein Unterschied, ob ich aus dem Hauptthread oder aus dem Zweitthread auf das Singleton zugreife.
Das widerspricht ein wenig meinem Verständnis des Singleton Patterns: Sollte es für die Verarbeitung im Singleton nicht eigentlich völlig egal sein, von wo ich auf das Singleton zugreife? Wo liegt denn der Unterschied bei einem Zugriff aus einem zweiten Thread?
Zur Verdeutlichung hier mal der grobe Aufbau des Singletons
Das hier funktioniert:
Das hier funktioniert nicht:
ich greife per Java auf eine Windows-COM-Anwendung zu. Um nicht bei jedem Zugriff eine neue Verbindung aufbauen zu müssen, kapsele ich die Verbindung in einem Singleton Pattern. Das funktioniert sehr gut: Zugriffe aus dem Haupt-Thread des Programms gehen problemlos.
Allerdings will ich jetzt auch aus einem zweiten Thread auf das Singleton zugreifen und die COM-Verbindung nutzen. Dabei gibt es aber Probleme:
Obwohl ich laut hashCode() und diverser Variablenattribute eindeutig zur korrekten Singleton-Instanz gelange, scheint die COM-Verbindung nicht nutzbar zu sein, solange ich nicht im neuen Thread ebenfalls eine neue COM-Verbindung aufbaue. Es ist also ganz eindeutig ein Unterschied, ob ich aus dem Hauptthread oder aus dem Zweitthread auf das Singleton zugreife.
Das widerspricht ein wenig meinem Verständnis des Singleton Patterns: Sollte es für die Verarbeitung im Singleton nicht eigentlich völlig egal sein, von wo ich auf das Singleton zugreife? Wo liegt denn der Unterschied bei einem Zugriff aus einem zweiten Thread?
Zur Verdeutlichung hier mal der grobe Aufbau des Singletons
Code:
public class ComSingleton {
private static final ComSingleton INSTANCE = new ComSingleton();
private ComConnection connection;
private ComSingleton() {
}
public static getInstance() {
return INSTANCE;
}
public void connect() {
// neue COM-Verbindung
connection = new ComConnection();
}
public Data getComData() {
// COM-Daten auslesen und ausgeben
return connection.getSomeData();
}
}
Das hier funktioniert:
Code:
//im Hauptthread
ComSingleton.getInstance().connect();
Data data = ComSingleton.getInstance().getComData();
Das hier funktioniert nicht:
Code:
//im Hauptthread
ComSingleton.getInstance().connect();
startNewThread();
//im Zweitthread
// fügt man diese Zeile hinzu, geht es: ComSingleton.getInstance().connect();
Data data = ComSingleton.getInstance().getComData();