2016-12-10 7 views
1

Я не понимаю код и логику DynamicVariable:Scala DynamicVariable о ThreadLocal

  • Сначала вы создаете DynamicVariable экземпляр со значением по умолчанию ... значение по умолчанию ??? вам нужно значение за поток! означает ли это, что у вас одинаковый по умолчанию общий доступ к потенциально всем потокам? побеждает цель ... или?
  • Затем я вижу во всех примерах, что withValue выглядит как создание нового экземпляра каждый раз, или?

например. ThreadLocal с классическим случаем, который имеет смысл SimpleDateFormat, что очень дорого создавать каждый раз, и это не поточно-:

import java.text.SimpleDateFormat; 

static ThreadLocal<SimpleDateFormat> dateFormatTl = new ThreadLocal<SimpleDateFormat>(); 
... 
// many threads execute this, check if there already exists a 
// Thread-bound instance otherwise create a new one per-thread 
if (dateFormatTl.get() == null) { 
    dateFormatTl.set(new SimpleDateFormat("yyyy-dd-MM HH:mm:ss")); 
} 
// safely use the Thread-bound instance 
SimpleDateFormat dateFormat = dateFormatTl.get(); 
dateFormat.format(new Date(java.util.Date.getTime())); 

Как я могу повторить ту же самую функциональность выше, но в Scala и используя DynamicVariable?

// create with default instance ... 
// what for? I don't want the same instance shared across all Threads! 
val dateFormatDv = new DynamicVariable[SimpleDateFormat](new SimpleDateFormat("yyyy-dd-MM HH:mm:ss")) 

// many threads execute this ... 
// I see it is creating one new instance each time, and 
// that is not what I want 
dateFormatDv.withValue(new SimpleDateFormat("yyyy-dd-MM HH:mm:ss")) { 
    // safely use the Thread-bound instance, but this is a new one each time arrrggggg 
    dateFormatDv.value.format(new Date(java.util.Date.getTime())) 
} 

ответ

1

То, что вы хотите сделать, можно сделать так:

Future { 
    dateFormatDv.withValue(new SimpleDateFormat("yyyy-dd-MM HH:mm:ss")) { 
     doStuffWithDateFormat(dateFormatDv.value) 
     doMoreStuffWithTheSameFormatInstance(dateFormatDv.value) 
    }   
    } 

    Future { 
    dateFormatDv.withValue(new SimpleDateFormat("yyyy-dd-MM HH:mm:ss")) { 
     useADifferentInstanceOfDateFormat(dateFormat.value) 
    } 
    } 

Что касается значения по умолчанию, он просто позволяет установить его так, что вы можете использовать его удобно в текущем потоке без .withValue

doSomethingWithDefaultFormatInstance(dateFormat.value) 
+0

Вы имеете в виду, что если один и тот же поток выполняет линию 'dateFormatDv.withValue' более одного раза, только один экземпляр« SimpleDateFormat »создается в первый раз и повторно используется в каждом последующем исполнении? –

+0

Нет, я имею в виду, что вы выполняете '.withValue' один раз, а затем все внутри этого блока видит это значение. – Dima

+0

, но все дело в том, что у вас много входящих потоков, выполняющих '.withValue' и выше, и вся точка' ThreadLocal' состоит в том, чтобы иметь отдельный экземпляр для каждого повторного использования, а не просто создавать новый экземпляр каждый раз. Таким образом, этот код, который вы написали, не на 100% совпадает с тем, что я написал. –

0

ThreadLocal кации из в Scala DynamicVariable будет больше, как это я думаю:

+0

Да, это то же самое, что и '.withValue', и менее идиоматично. Вместо этого вы можете просто использовать 'ThreadLocal'. – Dima