2017-02-03 39 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); 
     } 
    } 

Я хочу иметь один экземпляр переменной props и pipeline по всему моему приложению, которое многопоточные.

Является ли мой код правильным или мне что-то не хватает?

Спасибо.

+0

Нет необходимости проверять наличие нулей. Это не похоже на то, что они могут быть инициализированы до запуска статического блока. – Kayaman

+0

Какое приложение это? – chrylis

+0

@chrylis maven 20 threaded using service service –

ответ

0

ваш код кажется правильным, как вы создаете экземпляр во время загрузки класса, поэтому вам нужно только создать добытчик для них

Но я рекомендую использовать одноплодную шаблон в этом случае, как показано ниже

я использовал одноплодный шаблон с двойной блокировкой для многопоточной среды

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

любезно внести необходимые изменения в состояние «если» обоих синхронизированных блоков –

+0

Да, singleton будет работать. Я тоже использовал его несколько раз. Но в моем предыдущем коде новые объекты не создаются, когда каждый поток загружает этот класс. –

+0

не понял о создании объекта, о котором вы говорите, «но в моем выше коде не будут появляться новые объекты ...». –

1

можно избавиться от volatile с помощью вызова метода и по-прежнему сохраняет безопасность потока через статический initializa Тион.

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; 
} 

Edit: Чтобы ответить на ваш вопрос, хотя, да код в OP действительно Потокобезопасная, хотя то, что я дал, прежде чем это способ, которым я хотел бы сделать это лично.