Ich habe eine Singleton Service Implementierungsklasse mit Enum in meinem Java-Web-Anwendung. Es startet einmal beim Starten und Beenden der Anwendung, wenn die Anwendung nicht bereitgestellt wurde. und es eine Service-Methode Client bieten:Gibt es in diesem Code irgendwelche Thread-Sicherheitsfehler?
public enum SingletonService{
INSTANCE;
private boolean isStarted;
public synchronized void start(){
if(!isStarted){
// do initialization stuff
isStarted = true;
}
}
public void stop(){
checkStarted();
// do stop jobs
isStarted = false;
}
private synchronized void checkStarted(){
if(!isStarted)
throw new RuntimeException("SingletonService is not ready");
}
public void service(){
checkStarted();
// do service job
}
}
Threading ein bisschen schwer für mich, ich bin beunruhigend, dass ich knifflige Fehler in meinem Code verpasst. Ist das notwendig, um start
und checkStarted
synchronisiert zu machen? Bitte sagen Sie mir etwas Schlechtes in einem solchen Code. Ich möchte auch wissen, ob es ein gemeinsames Muster dafür in Java gibt?
Threading ist hart, auch für intelligente Programme. Sie müssen den Zugriff auf freigegebene, veränderbare Daten schützen. Sie haben nur ein gemeinsames Datenelement. Sie haben alle Methoden bis auf eine synchronisiert. Ich würde auch den Dienst synchronisieren. – duffymo
@duffymo Ich habe checkStarted im Dienst aufgerufen, ist das nicht genug? – WestFarmer
@WestFarmer Es ist nicht notwendig, Service als Serviceaufrufe zu synchronisieren. CheckStarted-Methode, die eine synchronisierte Methode ist. Diese Klasse ist Thread-sicher, obwohl es nicht üblich ist, das Singleton-Muster zu implementieren. –