私はJavaアプリケーションのWebアプリケーションで列挙型を使用して、シングルトンサービスのimplementaionクラスを持っています。アプリケーションの起動時に一度起動され、アプリケーションがアンデプロイされたときにシャットダウンされます。そしてこれは、クライアントにいくつかのサービスメソッドを提供します。このようなコードにスレッドセーフのバグはありますか?
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
}
}
スレッディングが私のために少し難しいですが、私は私が私のコードでトリッキーなバグを逃したことを心配しています。 start
とcheckStarted
を同期させる必要がありますか?このようなコードで悪いことを教えてください。私はまた知ってほしいjavaのようなことのための共通のパターンがある場合は?理由と
スマートなプログラムであっても、スレッド化は困難です。共有され、変更可能なデータへのアクセスを保護する必要があります。共有データメンバーは1つだけです。あなたは1つ以外のすべての方法を同期しました。私もサービスを同期したいと思う。 – duffymo
@duffymoサービスでcheckStartedが呼び出されましたが、十分ではありませんか? – WestFarmer
@WestFarmerサービスコールを同期させる必要はありません。同期メソッドであるcheckStartedメソッドです。このクラスは、シングルトンパターンを実装する標準的な方法ではないが、スレッドセーフです。 –