ThreadLocal, değiştirilemeyen nesneye, senkronize edilmemiş yöntemdeki birden fazla iş parçacığıyla senkronize edilmesini sağlar; bu, değişebilir nesnenin yöntem içinde değiştirilemez hale getirilmesi anlamına gelir.
Bu, erişmeye çalışılan her iş parçacığı için yeni değişken nesne örneği verilerek gerçekleştirilir. Yani her iş parçacığının yerel kopyasıdır. Bu, yerel bir değişken gibi erişilecek bir yöntemde örnek değişkeni yapmaya yönelik bir hack'tir. Yerel değişkenin yalnızca iş parçacığı tarafından kullanılabildiğini bildiğinizden, bir fark; yöntem yerel değişkenleri, threadlocal ile paylaşılan mutable nesnenin onu temizleyene kadar birden çok yöntemde kullanılabileceği yerde yöntem yürütme bittiğinde iş parçacığı tarafından kullanılamaz.
Tanım olarak:
Java'daki ThreadLocal sınıfı, yalnızca aynı iş parçacığı tarafından okunabilen ve yazılabilen değişkenler oluşturmanıza olanak tanır. Böylece, iki iş parçacığı aynı kodu yürütüyor ve kod bir ThreadLocal değişken başvurusu olsa bile, iki iş parçacığı birbirlerinin ThreadLocal değişkenleri göremez.
Thread
Java ThreadLocalMap
içindeki her biri içerir .
Nerede
Key = One ThreadLocal object shared across threads.
value = Mutable object which has to be used synchronously, this will be instantiated for each thread.
ThreadLocal'a ulaşmak:
Şimdi ThreadLocal için mutable nesnesini aşağıdaki gibi tutacak bir sarmalayıcı sınıfı oluşturun initialValue()
.
Şimdi bu paketleyicinin alıcısı ve ayarlayıcısı, değişken nesne yerine threadlocal örneği üzerinde çalışacaktır.
Threadlocal getter () yöntemi, threadlocalmap değerinde herhangi bir değer bulamazsa Thread
; daha sonra thread'a göre özel kopyasını almak için initialValue () yöntemini çağırır.
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();
}
}
Şimdi wrapper.getDateFormatter()
arayacak threadlocal.get()
ve bu (threadlocal) örneği currentThread.threadLocalMap
içerdiğini kontrol edecektir .
Evet ise, karşılık gelen threadlocal örneği için değeri (SimpleDateFormat) döndürürseniz,
haritayı initialValue () olan bu threadlocal örneğiyle ekleyin.
İşbu değişken sınıfta elde edilen iplik güvenliği ile; her iş parçacığı tarafından kendi mutable örneği ancak aynı ThreadLocal örneği ile çalışıyor. Tüm iş parçacığı anahtarla aynı ThreadLocal örneğini, ancak değer olarak farklı SimpleDateFormat örneğini paylaşacak anlamına gelir.
https://github.com/skanagavelu/yt.tech/blob/master/src/ThreadLocalTest.java