一)什么是threadlocal
java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的
局部变量。
1)ThreadLocal不是线程,是线程的一个变量
2)为每个线程维护一个副本(姑且成为‘拷贝’容易理解),让每个线程独立访问
3)ThreadLocal适用于资源共享但不需要维护状态的情况,也就是一个线程对资源的修改,不影响另一个线程的运行;这种设计是‘空间换时间’,synchronized顺序执行是‘时间换取空间’。
二)threadlocal的4个函数
1)void set(Object value)设置当前线程的线程局部变量的值。
2)public Object get()该方法返回当前线程所对应的线程局部变量。
3)public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
4)protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。
三)代码样例
package com.threadlocal;
public class TestNum {
//通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值
private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {
public Integer initialValue() {
return 0;
}
};
//获取下一个序列值
public int getNextNum() {
seqNum.set(seqNum.get() + 1);
return seqNum.get();
}
private static class TestClient extends Thread {
private TestNum sn; //被线程共享的sn
public TestClient(TestNum sn) {
this.sn = sn;
}
public void run() {
//每个线程打出3个序列值
for (int i = 0; i < 3; i++) {
//线程名+sn Number
System.out.println("thread[" + Thread.currentThread().getName() + "] --> sn[" + sn.getNextNum() + "]");
}
}
}
public static void main(String[] args) {
TestNum sn = new TestNum();
//产生3个线程,3个线程共享sn,各自产生序列号
TestClient t1 = new TestClient(sn);
TestClient t2 = new TestClient(sn);
TestClient t3 = new TestClient(sn);
t1.start();
t2.start();
t3.start();
}
}
代码运行的结果大致为:
thread[Thread-2] --> sn[1]
thread[Thread-0] --> sn[1]
thread[Thread-1] --> sn[1]
thread[Thread-0] --> sn[2]
thread[Thread-2] --> sn[2]
thread[Thread-0] --> sn[3]
thread[Thread-1] --> sn[2]
thread[Thread-2] --> sn[3]
thread[Thread-1] --> sn[3]
三个线程都有自己独立的sn数值,互不影响。尽管它们共享了TestNum sn中的Threadlocal seqNum 。
分享到:
相关推荐
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。
ThreadLocal
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
正确理解ThreadLocal.pdf
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
主要介绍ThreadLocal的原理,实例分析以及注意事项
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
JDBC事务的封装和Threadlocal实例,参考博客:http://blog.csdn.net/daijin888888/article/details/50988053
java 简单的ThreadLocal示例
本例以序列号生成的程序为例,展示ThreadLocal的使用
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露
设计模式及ThreadLocal详细讲解资料,想要学习java或者提升自己技术的同学可以下载观看
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。
ThreadLocal源码(版本:Android4.3,,含注释)
ThreadLocal原理及在多层架构中的应用