java之ThreadLocal簡(jiǎn)單使用總結(jié)

1、介紹ThreadLocal

看安卓源碼的時(shí)候,在這個(gè)類Looper.java ,會(huì)有這個(gè)一句函數(shù)

static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

一開始我不是很懂ThreadLocal.java這個(gè)類,簡(jiǎn)單理解


ThreadLocal 就是把變量分成很多個(gè)拷貝,每個(gè)線程擁有一個(gè),比如說一個(gè)變量使用ThreadLocal修飾,則在線程中會(huì)創(chuàng)建這個(gè)變量的副本進(jìn)行操作.操作不會(huì)受另外一個(gè)線程影響.

 
2、常用API

ThreadLocal.java

1、構(gòu)造函數(shù)


public ThreadLocal() {}

2、initialValue函數(shù)

        protected T initialValue() {
            return null;
        }


3、get函數(shù)

public T get()

該函數(shù)用來獲取與當(dāng)前線程關(guān)聯(lián)的ThreadLocal的值
如果當(dāng)前線程沒有該ThreadLocal的值,則調(diào)用initialValue函數(shù)獲取初始值返回。

4、set函數(shù)

public void set(T value)

設(shè)置當(dāng)前線程的ThreadLocal的值為value

5、remove函數(shù)

public void remove()

將當(dāng)前線程的ThreadLocal綁定的值刪除
在某些情況下需要手動(dòng)調(diào)用該函數(shù),防止內(nèi)存泄露。

 
3、測(cè)試代碼


    package com.sangfor.threadlocal;
     
    public class TestThreadLocal {
        
        public static final ThreadLocal<Integer> sThreadLocal = new ThreadLocal<Integer>(){
             @Override
             protected Integer initialValue() {
                 return 0;
             }
        };
        
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                new MyThread(i).start();
            }
        }
        static class MyThread extends Thread {
            
            public int index;
            
            public MyThread(int index) {
                this.index = index;
            }
            @Override
            public void run() {
                System.out.println("線程" + index + "的初始value:" + sThreadLocal.get());
                    for (int i = 0; i < 10; i++) {
                        sThreadLocal.set(sThreadLocal.get() + i);
                    }
                System.out.println("線程" + index + "的累加value:" + sThreadLocal.get());
            }
        }
    }

 
4、運(yùn)行結(jié)果

    線程0的初始value:0
    線程0的累加value:45
    線程1的初始value:0
    線程1的累加value:45
    線程2的初始value:0
    線程2的累加value:45
    線程3的初始value:0
    線程3的累加value:45
    線程4的初始value:0
    線程4的累加value:45
    線程5的初始value:0
    線程5的累加value:45
    線程6的初始value:0
    線程7的初始value:0
    線程7的累加value:45
    線程6的累加value:45
    線程8的初始value:0
    線程8的累加value:45
    線程9的初始value:0
    線程9的累加value:45

 
5、總結(jié)

用ThreadLocal修飾的變量,感覺就是每個(gè)線程都擁有一份原始數(shù)據(jù)的拷貝,每個(gè)線程只能修改自己的數(shù)據(jù),其它線程不可以修改


作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)