2012-03-15 5 views
2

私はGWTをかなり使い慣れています。以前はJavaサーブレットを使ったことがありませんでした。私はRPCを作成する方法を知っていますが、RPCのServiceImpl/RemoteServiceServletクラスでメンバー変数を宣言する際に並行性の問題があるのだろうかと思いました。私。同じ変数を上書きする複数の「同時」RPCから、変数がvolatile宣言されていないときのスレッドと同じようになります。GWTサーバサイドコードの変数

サーブレットのメンバーの一部を静的なものとして宣言して、他のスレッドがアクセスできるように問題があるかどうか疑問に思っていたので、サーバー側のコードで余分なスレッドを使用する必要がありました。サーブレットインスタンスへの参照を持たない変数同じRemoteServiceServletクラスの複数のインスタンスが同時に実行される可能性はありますか?

など。

public class MyServiceImpl extends RemoteServiceServlet implements MyService { 

    // Which of these variable declarations are a bad idea in a servlet? 
    private String someVariable; 
    private static String anotherVariable; 
    volatile private static String multiThreadedVariable; 

    public void init() { ... } 
    ... 
} 

ありがとうございます。

答えて

3

サーブレットはシングルトンなので、MyServiceImplクラスのインスタンスは1つだけです。これらの状態変数を導入することにより、複数のMyServiceImplインスタンスが存在する可能性があるわけではなく、すべての要求を処理するインスタンスが1つしかないため、スレッド安全性の問題が発生します。これらの変数へのアクセスを同期させない限り、スレッドセーフの問題が発生するため、完全に削除することをお勧めします。

+0

です。私はそれらを必要とすると思いますが、どうすればそれらへのアクセスを同期できますか?変数をvolatileとして宣言するか、synchronizedキーワードをMyServiceのRPCメソッドに追加する、通常のマルチスレッドアプリケーションと同じ方法ですか? – Doval

+0

他のJavaアプリケーションと変わりません。その変数を使用しているメソッドを同期させることも、コードブロックを同期させることもできます。実際の同期を行わずに 'volatile'(またはそれ以外のもの)を使用しても、スレッドセーフの問題は解決されません。 – Vladimir

+0

public static synchronized changeMultiThreadedVariable(){ここではmultiThreadedVariableで何かを実行}は – Vladimir

関連する問題