<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. java語言

    Java并發編程:深入剖析ThreadLocal

    時間:2025-03-15 23:04:02 java語言 我要投稿
    • 相關推薦

    Java并發編程:深入剖析ThreadLocal

      ThreadLocal類可以理解為ThreadLocalVariable(線程局部變量),提供了get與set等訪問接口或方法,這些方法為每個使用該變量的線程都存有一份獨立的副本,因此get總是返回當前執行線程在調用set時設置的最新值。可以將ThreadLocal視為 包含了Map對象,保存了特定于該線程的值。

      概括起來說,對于多線程資源共享的問題,同步機制采用了“以時間換空間”的方式,而ThreadLocal采用了“以空間換時間”的方式。前者僅提供一份變量,讓不同的線程排隊訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。

      模擬ThreadLocal

      復制代碼 代碼如下:

      import java.util.Collections;

      import java.util.HashMap;

      import java.util.Map;

      public class SimpleThreadLocal{

      private MapvalueMap = Collections

      .synchronizedMap(new HashMap());

      public void set(T newValue) {

      valueMap.put(Thread.currentThread(), newValue); // ①鍵為線程對象,值為本線程的變量副本

      }

      public T get() {

      Thread currentThread = Thread.currentThread();

      T o = valueMap.get(currentThread); // ②返回本線程對應的變量

      if (o == null && !valueMap.containsKey(currentThread)) { // ③如果在Map中不存在,放到Map中保存起來。

      o = initialValue();

      valueMap.put(currentThread, o);

      }

      return o;

      }

      public void remove() {

      valueMap.remove(Thread.currentThread());

      }

      protected T initialValue() {

      return null;

      }

      }

      實用ThreadLocal

      復制代碼 代碼如下:

      class Count {

      private SimpleThreadLocalcount = new SimpleThreadLocal() {

      @Override

      protected Integer initialValue() {

      return 0;

      }

      };

      public Integer increase() {

      count.set(count.get() + 1);

      return count.get();

      }

      }

      class TestThread implements Runnable {

      private Count count;

      public TestThread(Count count) {

      this.count = count;

      }

      @Override

      public void run() {

      // TODO Auto-generated method stub

      for (int i = 1; i <= 3; i++) {

      System.out.println(Thread.currentThread().getName() + "t" + i

      + "tht" + count.increase());

      }

      }

      }

      public class TestThreadLocal {

      public static void main(String[] args) {

      Count count = new Count();

      Thread t1 = new Thread(new TestThread(count));

      Thread t2 = new Thread(new TestThread(count));

      Thread t3 = new Thread(new TestThread(count));

      Thread t4 = new Thread(new TestThread(count));

      t1.start();

      t2.start();

      t3.start();

      t4.start();

      }

      }

      輸出

      復制代碼 代碼如下:

      Thread-0 1th 1

      Thread-0 2th 2

      Thread-0 3th 3

      Thread-3 1th 1

      Thread-1 1th 1

      Thread-1 2th 2

      Thread-2 1th 1

      Thread-1 3th 3

      Thread-3 2th 2

      Thread-3 3th 3

      Thread-2 2th 2

      Thread-2 3th 3

    【Java并發編程:深入剖析ThreadLocal】相關文章:

    java并發編程參考10-30

    簡單地分析Java線程編程中ThreadLocal類的使用08-10

    java編程術語11-10

    java編程基礎07-26

    Java編程語言10-02

    Java中同步與并發的運用07-31

    java教程之Java編程基礎09-12

    Java編程環境的搭建06-03

    java編程規范介紹07-10

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人