<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            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

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院