国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java并發編程學習17--ThreadLocal

jayce / 1185人閱讀

摘要:概念類用來存放線程的局部變量,每個線程都有自己的局部變量彼此之間不共享。返回當前線程的局部變量初始值。工作流程的時候我們可以看見是從中獲取的,也就是說這些局部變量真正存儲在中的時候從中獲取到了,然后再從中獲取。和都用于解決多線程并發訪問。

【概念

ThreadLocal類用來存放線程的局部變量,每個線程都有自己的局部變量彼此之間不共享。TheadLocal主要有以下三個方法:

public T get():返回當前線程的局部變量。

protected T initValue():返回當前線程的局部變量初始值。默認情況下 initValue(), 返回 null 。線程在沒有調用 set 之前,第一次調用 get 的時候, get 方法會默認去調用 initValue 這個方法。所以如果沒有覆寫這個方法,可能導致 get 返回的是 null 。當然如果調用過 set 就不會有這種情況了。

public void set(T value):設置當前線程的局部變量。

ThreadLocal是如何做到為每一個線程提供多帶帶的局部變量呢?實際上在ThreadLocal類中有一個Map緩存,用于存儲每一個線程的局部變量。Map中元素的鍵為線程對象,而值對應線程的變量副本。

 /**
         * Construct a new map initially containing (firstKey, firstValue).
         * ThreadLocalMaps are constructed lazily, so we only create
         * one when we have at least one entry to put in it.
         */
        ThreadLocalMap(ThreadLocal firstKey, Object firstValue) {
            table = new Entry[INITIAL_CAPACITY];
            int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
            table[i] = new Entry(firstKey, firstValue);
            size = 1;
            setThreshold(INITIAL_CAPACITY);
        }
【工作流程

1.set()的時候:

 public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

我們可以看見ThreadLocalMap是從currentThread中獲取的,也就是說這些局部變量真正存儲在currentThread中:

void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

2.get()的時候:

 public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

從currentThread中獲取到了ThreadLocalMap,然后再從中獲取value。如果沒有值,則調用setInitialValue()。

【如何使用
package ThreadLocal;

import java.util.Random;

import static ThreadLocal.ThreadLocalTest.localSetter;

/**
 * 在每個線程中多帶帶存放一個值然后再獲取
 */
public class ThreadLocalTest {

    static ThreadLocal localSetter = new ThreadLocal();

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            MyThread t = new MyThread();
            t.start();
        }
    }
}
class MyThread extends Thread{

    private static Random random = new Random();

    @Override
    public void run(){
        //現在當前線程中存入一個隨機變量 v1
        int randomVar = random.nextInt(100);
        localSetter.set(randomVar);
        System.out.println(getName() + " random is " + randomVar);
        //獲取當前線程的隨機變量 v2
        //v1 永遠等于 v2
        System.out.println(getName() + " localVar is " + localSetter.get());
    }
}
【spring與ThreadLocal

spring中的bean大多都是單例的,但是我們應用又是支持并發的,所以將各個service,dao存放在ThreadLocal中是一個明智的做法。但是需要注意如果bean中包含共享變量,spring是沒有做任何的安全處理的。

【synchronized與ThreadLocal

ThreadLocal以空間換取時間,提供了一種非常簡便的多線程實現方式。
ThreadLocal和Synchonized都用于解決多線程并發訪問。但是ThreadLocal與synchronized有本質的區別:
synchronized是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。而ThreadLocal為每一個線程都提供了變量的副本。Synchronized用于線程間的數據共享,而ThreadLocal則用于線程間的數據隔離。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68300.html

相關文章

  • Java多線程學習(七)并發編程中一些問題

    摘要:相比與其他操作系統包括其他類系統有很多的優點,其中有一項就是,其上下文切換和模式切換的時間消耗非常少。因為多線程競爭鎖時會引起上下文切換。減少線程的使用。很多編程語言中都有協程。所以如何避免死鎖的產生,在我們使用并發編程時至關重要。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關鍵字(1) java多線程學習(二)syn...

    dingding199389 評論0 收藏0
  • Java多線程學習(七)并發編程中一些問題

    摘要:因為多線程競爭鎖時會引起上下文切換。減少線程的使用。舉個例子如果說服務器的帶寬只有,某個資源的下載速度是,系統啟動個線程下載該資源并不會導致下載速度編程,所以在并發編程時,需要考慮這些資源的限制。 最近私下做一項目,一bug幾日未解決,總惶恐。一日頓悟,bug不可怕,怕的是項目不存在bug,與其懼怕,何不與其剛正面。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Jav...

    yimo 評論0 收藏0
  • 超實用百道Java面試題

    摘要:是的簡稱,運行環境,為的運行提供了所需的環境。分割字符串,返回分割后的字符串數組。當計算的值相同時,我們稱之為沖突,的做法是用鏈表和紅黑樹存儲相同的值的。迭代器取代了集合框架中的,迭代器允許調用者在迭代過程中移除元素。 Java基礎1.JDK和JRE有什么區別? JDK 是java development kit的簡稱,java開發工具包,提供java的開發環境和運行環境。JRE 是j...

    MkkHou 評論0 收藏0
  • java并發編程學習---之一

    摘要:開始學習也有一段時間了,一些基礎的書也掃了一遍了。最近慢慢開始看和,后者的話和有類似之處,都是一些編程經驗的編程的世界里好多的東西都是相同的。這里其實是對的最佳實踐,之后該對象已經變成一個過期的引用了,此時就應該清空這個引用。 開始學習java也有一段時間了,一些基礎的書也掃了一遍了(think in java/core java volume 1)。最近慢慢開始看和,后者的話和有類似...

    chavesgu 評論0 收藏0

發表評論

0條評論

jayce

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<