2015-07-21 3 views
4

Если мне нужна переменная ThreadLocal, нужно ли также использовать Поставщик (также поточно-безопасный)?Поставщик ThreadLocal?

Например, Поставщик не нужен для обеспечения безопасности потоков здесь?

private ThreadLocal<Supplier<MyClass>> myObject = new ThreadLocal<Supplier<MyClass>>(); 

Thanks.

ответ

8

Ваш вопрос не показывает типичный способ использования Поставщика с ThreadLocal. Если вы хотите ThreadLocal из MyClass, старый (предварительно +1,8) способ сделать это было типично:

ThreadLocal<MyClass> local = new ThreadLocal<MyClass>(); 

// later 
if (local.get() == null) { 
    local.put(new MyClass()); 
} 
MyClass myClass = local.get(); 

Альтернатива была delcare подкласс ThreadLocal, что отменяют метод initialValue.

В 1.8, вы можете использовать вместо этого поставщика, чтобы справиться с этой инициализации:

ThreadLocal<MyClass> local = ThreadLocal.withInitial(() -> new MyClass()); 

Функционально эти два основном идентичны, но версия поставщика намного меньше кода писать.

+2

Вы можете записать его еще короче, заменив '() -> новый MyClass()' на 'MyClass :: new'. – Holger

+0

Неплохо, я не знал, что вы можете использовать этот синтаксис для конструкторов. Благодаря! – Sbodd

3

Это зависит от того, как возвращается класс поставщика.

Он должен быть синхронизирован в этих случаях:

  • Позволяет говорит, что сохраняет некоторое состояние между каждым творением, оно должно быть поточно. т. е. необходимо синхронизировать метод Supplier.get().
  • Если вы извлекаете возвращаемый объект из кеша.

Это не должны быть синхронизированы в следующих случаях:

  • Если проще завод, который всегда создает и возвращает объект.

В обоих случаях MyClass не нужно синхронизировать. Потому что он всегда локален для потока.

+0

Спасибо. Не могу ли я просто удалить Поставщика, и объект MyClass все равно будет потокобезопасным? – mstrom

+0

Отредактировал свой ответ. –