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 สำหรับแต่ละเธรด