Java ThreadLocal有什么作用你知道吗

网友投稿 389 2022-09-26


Java ThreadLocal有什么作用你知道吗

目录ThreadLocal有什么作用测试代码当前线程只能操作当前ThreadLocal定义的局部变量,其他线程是访问不了。测试结果总结

ThreadLocal有什么作用

ThreadLocal 的源码,可以看http://到源码注释中有很清楚的解释:它是线程的局部变量,这些变量只能在这个线程内被读写,在其他线程内是无法访问的。 ThreadLocal 定义的通常是与线程关联的私有静态字段(例如,用户ID或事务ID)。

ThreadLocal 是线程本地存储,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。通过这种方式,避免资源在多线程间共享。

经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作,不会出现 A 线程关了 B线程正在使用的 Connection; 还有 Session 管理 等问题。

比如用来存储用户 Session。Session 的特性很适合 ThreadLocal ,因为 Session 之前当前会话周期内有效,会话结束便销毁。我们先笼统但不正确的分析一次 web 请求的过程:

用户在浏览器中访问 web 页面;

浏览器向服务器发起请求;

服务器上的服务处理程序(例如tomcat)接收请求,并开启一个线程处理请求,期间会使用到 Session ;

最后服务器将请求结果返回给客户端浏览器。

从这个简单的访问过程我们看到正好这个 Session 是在处理一个用户会话过程中产生并使用的,如果单纯的理解一个用户的一次会话对应服务端一个独立的处理线程,那用 ThreadLocal 在存储 Session ,简直是再合适不过了。

测试代码

ThreadLocal 的使用非常简单,最核心的操作就是三个:创建、赋值、取值。

当前线程只能操作当前ThreadLocal定义的局部变量,其他线程是访问不了。

public class TestThreadLocal {

//线程本地存储变量

private static final ThreadLocal THREAD_LOCAL_NUM = new ThreadLocal() {

@Override

protected Integer initialValue() {

return 0;

}

};

public static void main(String[] args) {

for (int i = 0; i <3; i++) {//启动三个线程

Thread t = new Thread() {

@Override

public void run() {

add10ByThreadLocal();

}

http:// };

t.start();

}

}

/**

* 线程本地存储变量加 5

*/

private static void add10ByThreadLocal() {

for (int i = 0; i <5; i++) {

Integer n = THREAD_LOCAL_NUM.get();

n += 1;

THREAD_LOCAL_NUM.set(n);

System.out.println(Thread.currentThread().getName() + " : ThreadLocal num=" + n);

}

}

}

测试结果

答案:三个线程最终输出是5,代表一个线程 执行代码循环五次每次+1结果是5 在同一个线程内, 三个线程最终结果 并不是15,从而得出结论ThreadLocal接线程的局部变量。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:漫谈在华为设备上配置PPPoE(华为设备配置手册)
下一篇:H3C 交换机升级说明(h3cne是什么证书)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~