ThreadLocal обеспечит доступ к изменяемому объекту несколькими
потоки в несинхронизированном методе синхронизированы, что означает создание
изменяемый объект должен быть неизменным внутри метода.
Это
достигается путем предоставления нового экземпляра изменяемого объекта для каждого потока
попробуйте получить к нему доступ. Так что это локальная копия каждого потока. Это какой-то
взломать создание переменной экземпляра в методе для доступа, как
локальная переменная. Как вы знаете метод локальная переменная доступна только
для потока одно отличие есть; метод локальных переменных не будет
доступен потоку, когда выполнение метода закончено, где изменяемый
общий объект с threadlocal будет доступен через несколько
методы, пока мы не очистим это.
По определению:
Класс ThreadLocal в Java позволяет создавать переменные, которые могут
быть только прочитанным и написанным тем же потоком. Таким образом, даже если два потока
выполняем один и тот же код, и код имеет ссылку на
Переменная ThreadLocal, тогда два потока не могут видеть друг друга
ThreadLocal переменные.
Каждый Thread
в Java содержит ThreadLocalMap
в нем.
Где
Key = One ThreadLocal object shared across threads.
value = Mutable object which has to be used synchronously, this will be instantiated for each thread.
Достижение ThreadLocal:
Теперь создайте класс-оболочку для ThreadLocal, который будет содержать изменяемый объект, как показано ниже (с initialValue()
или без него).
Теперь методы получения и установки этой оболочки будут работать с локальным экземпляром, а не с изменяемым объектом.
Если getter () из threadlocal не нашел никакого значения с помощью в threadlocalmap Thread
; тогда он вызовет initialValue (), чтобы получить свою личную копию относительно потока.
class SimpleDateFormatInstancePerThread {
private static final ThreadLocal<SimpleDateFormat> dateFormatHolder = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd") {
UUID id = UUID.randomUUID();
@Override
public String toString() {
return id.toString();
};
};
System.out.println("Creating SimpleDateFormat instance " + dateFormat +" for Thread : " + Thread.currentThread().getName());
return dateFormat;
}
};
/*
* Every time there is a call for DateFormat, ThreadLocal will return calling
* Thread's copy of SimpleDateFormat
*/
public static DateFormat getDateFormatter() {
return dateFormatHolder.get();
}
public static void cleanup() {
dateFormatHolder.remove();
}
}
Теперь wrapper.getDateFormatter()
вызовет threadlocal.get()
и будет проверять, currentThread.threadLocalMap
содержит этот (threadlocal) экземпляр.
Если да, вернуть значение (SimpleDateFormat) для соответствующего экземпляра локального потока
иначе добавьте карту с этим локальным экземпляром thread, initialValue ().
При этом достигается безопасность потоков на этом изменяемом классе; каждый поток работает со своим изменяемым экземпляром, но с тем же экземпляром ThreadLocal. Означает, что весь поток будет использовать тот же экземпляр ThreadLocal, что и ключ, но другой экземпляр SimpleDateFormat в качестве значения.
https://github.com/skanagavelu/yt.tech/blob/master/src/ThreadLocalTest.java