java之ThreadLocal簡單使用總結(jié)
1、介紹ThreadLocal
看安卓源碼的時候,在這個類Looper.java ,會有這個一句函數(shù)
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
一開始我不是很懂ThreadLocal.java這個類,簡單理解
ThreadLocal 就是把變量分成很多個拷貝,每個線程擁有一個,比如說一個變量使用ThreadLocal修飾,則在線程中會創(chuàng)建這個變量的副本進行操作.操作不會受另外一個線程影響.
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綁定的值刪除
在某些情況下需要手動調(diào)用該函數(shù),防止內(nèi)存泄露。
3、測試代碼
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、運行結(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修飾的變量,感覺就是每個線程都擁有一份原始數(shù)據(jù)的拷貝,每個線程只能修改自己的數(shù)據(jù),其它線程不可以修改
作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進階人工智能(鏈接)