ThreadLocal akan memastikan mengakses objek yang dapat diubah oleh beberapa utas dalam metode yang tidak disinkronkan disinkronkan, berarti membuat objek yang dapat diubah menjadi tidak berubah dalam metode ini.
Ini dicapai dengan memberikan instance baru dari objek yang dapat diubah untuk setiap utas yang mencoba mengaksesnya. Jadi ini adalah salinan lokal untuk setiap utas. Ini beberapa hack membuat variabel instan dalam metode yang akan diakses seperti variabel lokal. Ketika Anda mengetahui metode variabel lokal hanya tersedia untuk utas, satu perbedaan adalah; metode variabel lokal tidak akan tersedia untuk utas setelah eksekusi metode selesai di mana objek yang dapat ditukar yang dibagikan dengan threadlocal akan tersedia di beberapa metode hingga kami membersihkannya.
Menurut definisi:
Kelas ThreadLocal di Java memungkinkan Anda membuat variabel yang hanya bisa dibaca dan ditulis oleh utas yang sama. Jadi, bahkan jika dua utas mengeksekusi kode yang sama, dan kode tersebut memiliki referensi ke variabel ThreadLocal, maka kedua utas tersebut tidak dapat melihat variabel ThreadLocal satu sama lain.
Masing-masing Thread
di java berisi ThreadLocalMap
di dalamnya.
Dimana
Key = One ThreadLocal object shared across threads.
value = Mutable object which has to be used synchronously, this will be instantiated for each thread.
Mencapai ThreadLocal:
Sekarang buat kelas pembungkus untuk ThreadLocal yang akan menampung objek yang bisa berubah seperti di bawah ini (dengan atau tanpa initialValue()
).
Sekarang pengambil dan penyetel dari pembungkus ini akan bekerja pada instance threadlocal alih-alih objek yang dapat diubah.
Jika pengambil () dari threadlocal tidak menemukan nilai apa pun di dalam threadlocalmap dari Thread
; maka ia akan memanggil initialValue () untuk mendapatkan salinan pribadinya sehubungan dengan utas.
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();
}
}
Sekarang wrapper.getDateFormatter()
akan memanggil threadlocal.get()
dan itu akan memeriksa contoh currentThread.threadLocalMap
berisi ini (threadlocal).
Jika ya kembalikan nilai (SimpleDateFormat) untuk instance threadlocal yang sesuai atau
tambahkan peta dengan instance threadlocal ini, initialValue ().
Dengan ini keselamatan benang dicapai pada kelas yang bisa berubah ini; oleh masing-masing thread bekerja dengan instance yang dapat berubah sendiri tetapi dengan instance ThreadLocal yang sama. Berarti Semua utas akan membagikan instance ThreadLocal yang sama sebagai kunci, tetapi contoh SimpleDateFormat yang berbeda sebagai nilai.
https://github.com/skanagavelu/yt.tech/blob/master/src/ThreadLocalTest.java