Java-JUC-ThreadLocal 左手的ㄟ右手 2023-09-30 09:11 6阅读 0赞 # ThreadLocal # * 提供线程内的局部变量,不同的线程之间不会互相干扰,只在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度 * 特点,应用了`弱引用` > 1. 线程并发,多线程并发的场景下使用 > 2. 传递数据,通过`ThreadLocal`在同一线程下,不同组件中传递 > 3. 线程隔离,每个线程变量都是独立的,不会互相影响 ## 使用 ## * 一个线程往`ThreadLocal`放,另一个线程取不到,有隔离特点 static ThreadLocal<Person> tl = new ThreadLocal<>(); public static void main(String[] args) { new Thread(() -> { try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } //null System.out.println(tl.get()); }).start(); new Thread(() -> { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } tl.set(new Person()); //com.java.threadlocal.Person@4ebf4ac7 System.out.println(tl.get()); }).start(); } ## 各部分关系 ## * 一个`Thread`有一个`ThreadLocalMap` * 一个`ThreadLocalMap`包含多个`Entry对` * 一个`Entry对`为一个`ThreadLocal`对象和`value`构成 * 一个`ThreadLocal`可以作为多个`Thread`的`ThreadLocalMap`的`key` * 一个`Thread`只能通过自己的`ThreadLocalMap`,根据`ThreadLocal`获取对应的`value` ![format_png][] * JDK8后,这种设计方式每个`ThreadLocalMap`存储的键值对少,每个`Thread`维护自己的`ThreadLocalMap`,一个`ThreadLocalMap`的键值对数量由`ThreadLocal`决定,而实际开发中,并不是很多,避免哈希冲突 > JDK8之间,由`ThreadLocal`维护一个`Map`,`Thread-value`作为键值对,个数由线程决定 * 当`Thread`销毁之后,`ThreadLocalMap`也会随之销毁,减少内存使用 ## 和sychronized区别 ## * 共同点,都能用于处理多线程并发访问变量的问题 * `sychronized`时间换空间,只提供一份变量,让不同线程排队访问,侧重点在于`多个线程访问资源的同步` * `ThreadLocal`空间换时间,为每个线程都提供一个线程独享的变量,实现同时访问而不互相干扰,侧重点在于`每个线程之间的数据隔离` ## spring事务中的应用 ## * 保证所有操作都在一个事务中,每个操作使用的连接都必须是同一个 > 数据层和服务层的`connection`是同一个 * 线程并发的情况下,每个线程只能操作各自的connection * 普通解决方案,需要将连接作为参数传入,并且要用`synchronized`保证线程安全 > 增加代码耦合度,影响性能 ### 源码实例 ### * `@Transactional`最终调用`DataSourceTransactionManager`,利用`ThreadLocal`传递`connection` * `doBegin`首先检查是否有连接对象,没有则获取一个,并且会设置给`newConnectionHolder` ![format_png 1][] * `doBegin`会检查是否是新的连接,如果是将新连接通过`TransactionSynchronizationManager`与`ThreadLocalMap`绑定 [format_png]: https://img-blog.csdnimg.cn/img_convert/1d2e37d0ed16bbfdd80078b914fcb9c2.webp?x-oss-process=image/format,png [format_png 1]: https://img-blog.csdnimg.cn/img_convert/47a6d3150ac190af310540e2745febe6.webp?x-oss-process=image/format,png
还没有评论,来说两句吧...