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)階人工智能(鏈接)