ThreadLocal详解

1. ThreadLocal原理
ThreadLocal为每个线程创建一个对象副本,将对象共享转变为对象“独有”,从而避免多线程对象共享的问题,每个线程都可以独立的读写对象,而对其他线程没有影响。
ThreadLocal内部有一个ThreadLocalMap内部类,用于维持线程本地变量。下面是ThreadLocal get()方法源代码:

 public T get() {
         //获取当前执行线程
        Thread t = Thread.currentThread();
        //取得当前线程的ThreadLocalMap实例
        ThreadLocalMap map = getMap(t);
        if (map != null) {
        //map以当前对象实例为key
        ThreadLocalMap.Entry e = map.getEntry(this);
           if (e != null)
                return (T)e.value;
        }
        //返回初始值
        return setInitialValue();
    }

从上面的源代码可以看出 get()该方法返回当前线程所对应的线程所持有的对象。ThreadLocal的其他:
void set(Object value)设置当前线程的线程局部变量的值。
public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用
protected Object initialValue()返回该线程局部变量的初始值, setInitialValue()方法返回的就是initialValue()设置的初始值。

2.ThreadLocal实例

package thread;
import org.junit.Test;
public class ThreadLocalTest {

    public final ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(){
         @Override
            protected Integer initialValue() {
                return 0;
            }
     };

    @Test
    public void threadLocaltest() {

         for (int i = 0; i < 5; i++) {
             new Thread(new Runnable() {
                @Override
                public void run() {
                    Integer sum = threadLocal.get();
                    for (int j = 1; j <10; j++) {
                        sum=sum+j;
                    }
                    threadLocal.set(sum);
      System.out.println(Thread.currentThread().getName()+": "+ threadLocal.get());
                };
            }).start();
        }       
    }
}

结果为:
Thread-0 : 45
Thread-1 : 45
Thread-2 : 45
Thread-3 : 45
Thread-4 : 45
说明ThreadLocal可以使各个线程独自拥有一个变量副本,互不影响,从而实现对象访问的线程安全。
3. ThreadLocal与同步机制的比较

同步机制是多线程共享一个变量,只是访问时通过锁使得同一个时间内只有一个线程可以访问变量,将并发访问转化为串行访问,是以时间换空间。
而ThreadLocal则是为每个线程创建一个变量副本,这里不再是多个线程之间的共享,是以空间换时间,并发性比同步机制要好。ThreadLocal提供了线程安全的共享对象方式,可以把不安全的变量封装进ThreadLocal实现线程安全。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值