2017-02-03 12 views
0

これは以下のコードです。マルチスレッド環境でのアプリケーション全体にわたる変数の単一インスタンス

private static volatile Properties props = null; 
    private static volatile StanfordCoreNLP pipeline = null; 
    /** 
    * 
    * @return 
    */ 
    static { 
     if (props == null) { 
      props = new Properties(); 
      props.setProperty("annotators", "tokenize, ssplit, parse, sentiment"); 
     } 
     if (pipeline == null) { 
      pipeline = new StanfordCoreNLP(props); 
     } 
    } 

私はマルチスレッド化されている私のアプリケーション全体の変数propspipelineの単一のインスタンスを持っていると思います。

私のコードは正しいのですか、何か不足していますか?

ありがとうございました。

+0

を参照してください。ヌルをチェックする必要はありません。静的ブロックが実行される前に初期化できるようなものではありません。 – Kayaman

+0

これはどんなアプリケーションですか? – chrylis

+0

@chrylis maven 20 executorサービスを使用してスレッドされました –

答えて

0

あなたのコードは

以下のように使用すると、クラスのロード時にインスタンスを作成しているので、あなただけの彼ら

ためにゲッターを作成する必要がありますが、私はこの場合はシングルトンパターンを使用することをお勧め権利として思えます私はそれがメソッド呼び出しを使用してvolatileを取り除くと、まだ静的initializaを通じてスレッドの安全性を保持を取得することが可能ですマルチスレッド環境のために、二重ロックで

public class Utility{ 

     private static final Object masterLock = new Object(); 
     private static volatile Properties props = null; 
     private static volatile StanfordCoreNLP pipeline = null; 

     static Properties getPropertiesInstance(){ 

      if(props == null){ 

       synchronized (masterLock) { 
        if(props == null){ 
         props = new Properties(); 
        } 
       } 
      } 

      return props; 
     } 

     static StanfordCoreNLP getStanfordCoreNLPInstance(){ 

      if(pipeline == null){ 

       synchronized (masterLock) { 
        if(pipeline == null){ 
         pipeline = new StanfordCoreNLP(); 
        } 
       } 
      } 

      return pipeline; 
     } 
} 
+0

両方の同期ブロックのif条件に親切に必要な変更を加える –

+0

はい、シングルトンが機能します。私も数回それを使用しています。しかし、上記のコードでは、すべてのスレッドがこのクラスをロードしているときに、新しいオブジェクトが作成されることはありません。 –

+0

あなたが話しているオブジェクトの作成については理解していませんでしたが、上記のコードでは新しいオブジェクトではありません。 –

1

をシングルトンパターンを使用していました。

private static final Properties props = initProperties(); 
private static Properties initProperties() { 
    Properties props = new Properties(); 
    props.setProperty("annotators", "tokenize, ssplit, parse, sentiment"); 
    return props; 
} 

public static Properties getProperties() { 
    return props; 
} 

編集: かかわらず、あなたの質問に答えるために、OPではい、あなたのコードは、私が前に与えてくれたことは、私は個人的にそれを行うような方法ではあるが、安全なスレッド確かです。

関連する問題