ThreadLocal简介

Posted juzhuxiaozhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreadLocal简介相关的知识,希望对你有一定的参考价值。

ThreadLocal

一. 概述


ThreadLocal(是Thread Local Variable,线程局部变量)类是Java为线程安全提供的一个工具类,代表一个线程局部变量。把数据放在ThreadLocal中可以让每个线程创建一个该变量的副本,线程间可以独立地改变自己的副本,而不会和其他线程产生副本冲突,从而避免并发访问的线程安全问题,就像每个线程都完全拥有该变量一样。

方法:

  • T get() 返回此线程局部变量的当前线程副本值
  • void remove() 删除此线程局部变量的当前线程的副本值
  • void set(T value) 设置此线程局部变量中当前线程副本值

二. 案例


package myThread;

/**
 * 若进程间不需要数据共享,则可使用此方法
 * 避免再去设计安全同步
 */
public class ThreadLocalTest {
    public static void main(String[] args) {
        Account acc = new Account("初始名");
        /*
        虽然两个线程共享一个账户,但该账户名是ThreadLocal类型
        每个线程拥有自己的副本,互不影响
         */
        new MyTest(acc,"线程甲").start();
        new MyTest(acc,"线程乙").start();
    }
}

class Account{
    /*
    定义一个ThreadLocal类型的线程局部变量(伪装成变量的对象),
     每个线程保存一个该变量的副本。
     */
    private ThreadLocal<String> name=new ThreadLocal<String>();

    public Account(String name){
        this.name.set(name);
        System.out.println("---"+this.name.get());
    }
    public String getName(){
        return this.name.get();
    }
    public void setName(String str) {
        this.name.set(str);
    }
}

class MyTest extends Thread{
    //定义一个Account的成员变量
    private Account account;
    public MyTest(Account account,String name){
        super(name);
        this.account=account;
    }

    /**
     * 进入run后,线程局部变量会被copy为默认值
     * string->null
     */
    public void run(){
        for (int i = 0; i < 10; i++) {
            if(i==6){
                /*
                此处的getName()是Thread的静态方法
                用线程名改变了原先的副本值(null)
                 */
                account.setName(getName());
            }
            System.out.println(account.getName()+"账户的i值:"+i);
        }
    }
}

三. 总结


ThreadLocal和其他所有同步机制一样,都是为了解决多线程中对同一变量的访问冲突。不同的是,在普通同步机制中,是通过对象加锁来实现安全访问的,而ThreadLocal从另一个角度来解决多线程的并发访问。简单说ThreadLocal就是一种以空间换时间的做法,在每个Thread里面维护了一个以开地址法实现的ThreadLocal.ThreadLocalMap,把数据进行隔离,数据不共享,自然就没有线程安全方面的问题了。

两者面向问题的领域不同,不能互相代替。

以上是关于ThreadLocal简介的主要内容,如果未能解决你的问题,请参考以下文章

ThreadLocal简介

ThreadLocal简介

(译)ThreadLocal简介

Java ThreadLocal 简介

javaThreadLocal 内存泄漏 代码演示 实例演示

ThreadLocal的三个方法简介