Java線程封閉

線程封閉

  • 多線程中不需要使用共享數(shù)據(jù),使用數(shù)據(jù)封閉避免使用同步的技術(shù)
  • 線程封閉的具體實(shí)現(xiàn):ThreadLocal、局部變量
ThreadLocal

它是一個(gè)線程級(jí)別的變量,每個(gè)線程都有擁有自己獨(dú)立的變量,與其他線程互不影響。

用法:ThreadLocal<T> var = new ThreadLocal<T>();
會(huì)自動(dòng)在每一個(gè)線程上創(chuàng)建一個(gè)T的副本,副本之間彼此獨(dú)立,互不影響

package com.study.hc.thread.chapter1.thread;

/** 線程封閉示例 */
public class Demo7 {
    /** threadLocal變量,每個(gè)線程都有一個(gè)副本,互不干擾 */
    public static ThreadLocal<String> value = new ThreadLocal<>();

    /**
     * threadlocal測(cè)試
     * 
     * @throws Exception
     */
    public void threadLocalTest() throws Exception {

        // threadlocal線程封閉示例
        value.set("這是主線程設(shè)置的123"); // 主線程設(shè)置值
        String v = value.get();
        System.out.println("線程1執(zhí)行之前,主線程取到的值:" + v);

        new Thread(new Runnable() {
            @Override
            public void run() {
                String v = value.get();
                System.out.println("線程1取到的值:" + v);
                // 設(shè)置 threadLocal
                value.set("這是線程1設(shè)置的456");

                v = value.get();
                System.out.println("重新設(shè)置之后,線程1取到的值:" + v);
                System.out.println("線程1執(zhí)行結(jié)束");
            }
        }).start();

        Thread.sleep(5000L); // 等待所有線程執(zhí)行結(jié)束

        v = value.get();
        System.out.println("線程1執(zhí)行之后,主線程取到的值:" + v);

    }

    public static void main(String[] args) throws Exception {
        new Demo7().threadLocalTest();
    }
}


棧封閉 - 局部變量

局部變量的固有數(shù)據(jù)之一就是封閉在線程中,它們位于執(zhí)行線程的棧中,其他線程無(wú)法放到這個(gè)棧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容