Java Concurrency - คลาส ThreadLocal
คลาส ThreadLocal ใช้เพื่อสร้างตัวแปรโลคัลเธรดซึ่งสามารถอ่านและเขียนโดยเธรดเดียวกันเท่านั้น ตัวอย่างเช่นหากสองเธรดกำลังเข้าถึงโค้ดที่มีการอ้างอิงถึงตัวแปร threadLocal เดียวกันแต่ละเธรดจะไม่เห็นการแก้ไขใด ๆ กับตัวแปร threadLocal ที่เธรดอื่น
วิธีการ ThreadLocal
ต่อไปนี้เป็นรายการวิธีการสำคัญที่มีอยู่ในคลาส ThreadLocal
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | public T get() ส่งคืนค่าในสำเนาของเธรดปัจจุบันของตัวแปรเธรดโลคัลนี้ |
2 | protected T initialValue() ส่งคืน "ค่าเริ่มต้น" ของเธรดปัจจุบันสำหรับตัวแปรเธรดโลคัลนี้ |
3 | public void remove() ลบค่าของเธรดปัจจุบันสำหรับตัวแปรเธรดโลคัลนี้ |
4 | public void set(T value) ตั้งค่าสำเนาของเธรดปัจจุบันของตัวแปรเธรดโลคัลนี้เป็นค่าที่ระบุ |
ตัวอย่าง
โปรแกรม TestThread ต่อไปนี้แสดงให้เห็นถึงวิธีการเหล่านี้บางส่วนของคลาส ThreadLocal ที่นี่เราใช้ตัวแปรตัวนับสองตัวตัวแปรหนึ่งเป็นตัวแปรปกติและอีกตัวแปรหนึ่งคือ ThreadLocal
class RunnableDemo implements Runnable {
int counter;
ThreadLocal<Integer> threadLocalCounter = new ThreadLocal<Integer>();
public void run() {
counter++;
if(threadLocalCounter.get() != null) {
threadLocalCounter.set(threadLocalCounter.get().intValue() + 1);
} else {
threadLocalCounter.set(0);
}
System.out.println("Counter: " + counter);
System.out.println("threadLocalCounter: " + threadLocalCounter.get());
}
}
public class TestThread {
public static void main(String args[]) {
RunnableDemo commonInstance = new RunnableDemo();
Thread t1 = new Thread(commonInstance);
Thread t2 = new Thread(commonInstance);
Thread t3 = new Thread(commonInstance);
Thread t4 = new Thread(commonInstance);
t1.start();
t2.start();
t3.start();
t4.start();
// wait for threads to end
try {
t1.join();
t2.join();
t3.join();
t4.join();
} catch (Exception e) {
System.out.println("Interrupted");
}
}
}
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้
เอาต์พุต
Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0
คุณสามารถเห็นค่าของตัวนับเพิ่มขึ้นตามแต่ละเธรด แต่ threadLocalCounter ยังคงเป็น 0 สำหรับแต่ละเธรด