ThreadLocal使用demo及源碼分析

1.使用demo

package com.xiayu.demo;

import lombok.extern.slf4j.Slf4j;

import java.util.Locale;

@Slf4j
public class ThreadLocalDemo {

    private static ThreadLocal<Integer> count = new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return 5;
        }
    }; //cout的初始值是0

    private static ThreadLocal<Locale> language = new ThreadLocal<Locale>(){
        @Override
        protected Locale initialValue() {
            return Locale.CHINA;
        }
    };//languag的初始值爲

    public static void main(String[] args) {

        Thread[] threads = new Thread[5];

        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(() -> {

                //language
                Locale lan = language.get();
                log.info(Thread.currentThread().getName() + ".language:" + lan);

                language.set(Locale.ENGLISH); //每一個線程可針對具體場景設置該線程須要的值

                log.info(Thread.currentThread().getName() + ".language:" + language.get());

                //--------------------------------------------------------------------------------
                int num = count.get(); //每一個線程獲取count的一個拷貝
                num += 5;
                count.set(num); //進行加5,後再保存到線程裏面
                //... 進行了別的業務操做

                count.get();//業務中須要獲取到count的值
                log.info(Thread.currentThread().getName() + ":" + count.get()); //再獲取到count的值

                count.remove();
                language.remove();
            }, "thread-" + i);
            threads[i].start();
        }
    }
}

運行結果
image.pngjava

2.源碼

a. set()方法ide

b. get()方法spa

c. remove()方法線程

相關文章
相關標籤/搜索