Я не понимаю код и логику 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()))
}
Вы имеете в виду, что если один и тот же поток выполняет линию 'dateFormatDv.withValue' более одного раза, только один экземпляр« SimpleDateFormat »создается в первый раз и повторно используется в каждом последующем исполнении? –
Нет, я имею в виду, что вы выполняете '.withValue' один раз, а затем все внутри этого блока видит это значение. – Dima
, но все дело в том, что у вас много входящих потоков, выполняющих '.withValue' и выше, и вся точка' ThreadLocal' состоит в том, чтобы иметь отдельный экземпляр для каждого повторного использования, а не просто создавать новый экземпляр каждый раз. Таким образом, этот код, который вы написали, не на 100% совпадает с тем, что я написал. –