java之ThreadLocal简单使用总结

1、介绍ThreadLocal

看安卓源码的时候,在这个类Looper.java ,会有这个一句函数

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

一开始我不是很懂ThreadLocal.java这个类,简单理解


ThreadLocal 就是把变量分成很多个拷贝,每个线程拥有一个,比如说一个变量使用ThreadLocal修饰,则在线程中会创建这个变量的副本进行操作.操作不会受另外一个线程影响.

 
2、常用API

ThreadLocal.java

1、构造函数


public ThreadLocal() {}

2、initialValue函数

        protected T initialValue() {
            return null;
        }


3、get函数

public T get()

该函数用来获取与当前线程关联的ThreadLocal的值
如果当前线程没有该ThreadLocal的值,则调用initialValue函数获取初始值返回。

4、set函数

public void set(T value)

设置当前线程的ThreadLocal的值为value

5、remove函数

public void remove()

将当前线程的ThreadLocal绑定的值删除
在某些情况下需要手动调用该函数,防止内存泄露。

 
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、运行结果

    线程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、总结

用ThreadLocal修饰的变量,感觉就是每个线程都拥有一份原始数据的拷贝,每个线程只能修改自己的数据,其它线程不可以修改


作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)