Fork me on GitHub
返回顶部
跳到底部

ThreadLocal

ThreadLocal的基本含义

ThreadLocal代表线程局部变量,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程副本冲突。

它可以看做是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定到这个线程上的一个值。
下面是它的用法示例:

class Account {
    private ThreadLocal<String> name = new ThreadLocal<>();

    public Account(String string) {
        this.name.set(string);
    }

    public String getName() {
        return name.get();
    }

    public void setName(String string) {
        name.set(string);
    }
}

class MyTest extends Thread {
    private Account account;

    public MyTest(Account account, String name) {
        super(name);
        this.account = account;
    }

    public void run() {
        for (int i=0;i<5;i++) {
            if (i == 2) {
                account.setName(getName());
            }
            System.out.println(account.getName() + "账户的i的值:" + i);
        }
    }
}
public class ThreadLocalTest {
    public static void main(String[] args) {
        Account at = new Account("线程Main");
        //main线程中thradlocal中的变量值
        System.out.println(at.getName());

        new MyTest(at, "线程甲").start();
        new MyTest(at, "线程乙").start();
    }
}

运行结果如下:

线程Main
null账户的i的值:0
null账户的i的值:1
线程甲账户的i的值:2
线程甲账户的i的值:3
线程甲账户的i的值:4
null账户的i的值:0
null账户的i的值:1
线程乙账户的i的值:2
线程乙账户的i的值:3
线程乙账户的i的值:4

上面程序中变量的关系如下:

threadlocal.PNG

下面是一个使用ThreadLocal来实现计时功能的类:

public class Profiler {
    private static final ThreadLocal<Long> TIME_THREADLOCAL = new ThreadLocal<Long>(){
        @Override
        protected Long initialValue() {
            return System.currentTimeMillis();
        }
    };

    public static final void begin() {
        TIME_THREADLOCAL.set(System.currentTimeMillis());
    }

    public static final long end() {
        return System.currentTimeMillis() - TIME_THREADLOCAL.get();
    }

    public static void main(String[] args) throws Exception{
        Profiler.begin();
        TimeUnit.SECONDS.sleep(1);
        System.out.println("Cost: " + Profiler.end() + " mills");
    }
}

输出:

Cost: 1009 mills
posted @ 2019-01-13 17:17  sqmax  阅读(151)  评论(0编辑  收藏  举报