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

資訊專欄INFORMATION COLUMN

ThreadLocal、InheritableThreadLocal

lindroid / 1983人閱讀

摘要:介紹以下是源碼中對的官方解釋,已經非常精煉了。簡單例子其實源碼里已經給出了使用的樣例,這里就當自我熟悉一下。顧名思義,目的就是讓可以訪問的。而且可以通過重寫方法任意改變的簡單例子年月日主要源碼可以參考這篇文章源碼解讀

ThreadLoal介紹

以下是JDK1.8源碼中對ThreadLocal的官方解釋,已經非常精煉了。

Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the ThreadLocal instance is accessible; after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).

白話一點就是每個thread在自己的生命周期內維護著一個本地變量,僅供自身上下文使用。

ThreadLocal 簡單例子

其實JDK源碼里已經給出了使用的樣例,這里就當自我熟悉一下。(這個例子主要是為了用下initialValue(),可以直接看第二個簡單例子)

package cn.lw.thread;

import java.util.UUID;

/**
 * @author wanglei 2018年5月3日
 */
public class ThreadLocalTest3 {

    public static void main(String[] args) {
        MyThread3 myThread = new MyThread3();
        
        Thread t1 = new Thread(myThread, "t1");
        Thread t2 = new Thread(myThread, "t2");
        t1.start();
        t2.start();
        
        try {
            t1.join(); //等待t1終止
            t2.join(); //等待t2終止
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

class MyThread3 implements Runnable {

    @Override
    public void run() {
        // 初始化當前thread的local-value,僅當前thread可見
        ThreadLocal myThreadLocal = new ThreadLocal() {
            @Override protected String initialValue() {
                return UUID.randomUUID().toString();
            }
        };

        String name = Thread.currentThread().getName();
        // 獲取初始值
        String initialValue = myThreadLocal.get();
        
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        // 將當前thread的local-value改為指定值
        myThreadLocal.set(UUID.randomUUID().toString());
        System.out.println("Thread name: " + name + ", init: " + initialValue + ", next: " + myThreadLocal.get());
    }
    
}

Output:

Thread name: t2, init: 26e62cc8-1457-43a2-956c-6e53f5ccadd3, next: 7d32cd8d-7143-4879-a65b-a0841d2b6e9d
Thread name: t1, init: 9ab664fc-0af2-4a1d-bcd8-e4f056b6748f, next: 7a6f44dc-bd20-438e-85be-ff42ba19ad6e
InheritableThreadLocal

這個類繼承自ThreadLocal。顧名思義,目的就是讓child-thread可以訪問parent-thread的local-value。而且可以通過重寫childVaule()方法任意改變parent-thread的local-value.

InheritableThreadLocal 簡單例子
package cn.lw.thread;

import java.util.UUID;

/**
 * @author wanglei 2018年5月3日
 */
public class ThreadLocalDemo {

    public static void main(String[] args) {
        new Thread(new ParentClass("p1")).start();
        new Thread(new ParentClass("p2")).start();
        
    }

}

class ThreadLocalManager {
//    private static final ThreadLocal localValue = new ThreadLocal<>();
    private static final InheritableThreadLocal localValue = new InheritableThreadLocal<>();
    
    public static void setLocalValue() {
        localValue.set(UUID.randomUUID().toString());
    }
    
    public static String getLocalValue() {
        return localValue.get();
    }
    
    public static void removeLocalValue() {
        localValue.remove();
    }
    
}

class ParentClass implements Runnable {
    private String name;

    public ParentClass(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        ThreadLocalManager.setLocalValue();
        System.out.println("parent name: "+name+", loval value: "+ThreadLocalManager.getLocalValue());
        
        String childName = name + "_child";
        ChildClass childClass = new ChildClass(childName);
        Thread childThread = new Thread(childClass);
        
        childThread.start();
        try {
            childThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
}

class ChildClass implements Runnable {
    private String name;

    public ChildClass(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println("child name: "+name+", loval value: "+ThreadLocalManager.getLocalValue());
    }
    
}

Output:

parent name: p2, loval value: 3a623559-9457-4cb0-8ba1-b958336a70cd
parent name: p1, loval value: 48594e57-a114-43c1-980e-034074387d0a
child name: p2_child, loval value: 3a623559-9457-4cb0-8ba1-b958336a70cd
child name: p1_child, loval value: 48594e57-a114-43c1-980e-034074387d0a

ThreadLocal 主要源碼可以參考這篇文章:ThreadLocal源碼解讀

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

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

相關文章

  • Java多線程學習(五)線程間通信知識點補充

    摘要:我們通過之前幾章的學習已經知道在線程間通信用到的關鍵字關鍵字以及等待通知機制。今天我們就來講一下線程間通信的其他知識點管道輸入輸出流的使用的使用。將當前線程的此線程局部變量的副本設置為指定的值刪除此線程局部變量的當前線程的值。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關鍵字(1) java多線程學習(二)synchr...

    mating 評論0 收藏0
  • Java面試題必備知識之ThreadLocal

    摘要:方法,刪除當前線程綁定的這個副本數字,這個值是的值,普通的是使用鏈表來處理沖突的,但是是使用線性探測法來處理沖突的,就是每次增加的步長,根據參考資料所說,選擇這個數字是為了讓沖突概率最小。 showImg(https://segmentfault.com/img/remote/1460000019828633); 老套路,先列舉下關于ThreadLocal常見的疑問,希望可以通過這篇學...

    Maxiye 評論0 收藏0
  • Java 多線程下篇 線程通訊

    摘要:等待通知機制利用,實現的一個生產者一個消費者和一個單位的緩存的簡單模型上面例子中我們生產了一個數據后就需要對這個數據進行消費如果生產了但數據沒有被獲取則生產線程會在等待中直到調用了方法后才會被繼續執行反之也是一樣的也就是說方法是使線程暫停 等待/通知機制 利用wait,notify實現的一個生產者、一個消費者和一個單位的緩存的簡單模型: public class QueueBuffer...

    ethernet 評論0 收藏0
  • 分布式調用跟蹤實戰

    摘要:為了追蹤一個請求完整的流轉過程,我可以給請求分配一個唯一的,當請求調用其他服務時,我們傳遞這個。這是一個簡單的實現分布式調用追蹤的實踐,以上。 背景 分布式環境下,跨服務之間的調用錯綜復雜,如果突然爆出一個錯誤,雖然有日志記錄,但到底是哪個服務出了問題呢?是移動端傳的參數有錯誤,還是系統X或者系統Y提供的接口導致?在這種情況下,錯誤排查起來就非常費勁。 為了追蹤一個請求完整的流轉過程,...

    jlanglang 評論0 收藏0

發表評論

0條評論

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