Java Concurrency - Lớp ThreadLocal

Lớp ThreadLocal được sử dụng để tạo các biến cục bộ của luồng chỉ có thể được đọc và ghi bởi cùng một luồng. Ví dụ: nếu hai luồng đang truy cập mã có tham chiếu đến cùng một biến threadLocal thì mỗi luồng sẽ không thấy bất kỳ sửa đổi nào đối với biến threadLocal được thực hiện bởi luồng khác.

Phương thức ThreadLocal

Sau đây là danh sách các phương thức quan trọng có sẵn trong lớp ThreadLocal.

Sr.No. Phương pháp & Mô tả
1

public T get()

Trả về giá trị trong bản sao luồng hiện tại của biến cục bộ luồng này.

2

protected T initialValue()

Trả về "giá trị ban đầu" của luồng hiện tại cho biến cục bộ luồng này.

3

public void remove()

Loại bỏ giá trị của luồng hiện tại cho biến cục bộ của luồng này.

4

public void set(T value)

Đặt bản sao của luồng hiện tại của biến cục bộ luồng này thành giá trị được chỉ định.

Thí dụ

Chương trình TestThread sau đây trình diễn một số phương thức này của lớp ThreadLocal. Ở đây chúng tôi đã sử dụng hai biến đếm, một là biến bình thường và một biến khác là 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");
      }
   }
}

Điều này sẽ tạo ra kết quả sau.

Đầu ra

Counter: 1
threadLocalCounter: 0
Counter: 2
threadLocalCounter: 0
Counter: 3
threadLocalCounter: 0
Counter: 4
threadLocalCounter: 0

Bạn có thể thấy giá trị của bộ đếm được tăng lên theo từng luồng, nhưng threadLocalCounter vẫn là 0 cho mỗi luồng.