Synchronized用于线程间的数据共享,ThreadLocal则用于线程间的数据隔离
S以时间换空间,提供一份变量、线程排队访问;T以空间换时间,每个线程提供变量,互不影响
TL有TheadLocalMap属性:threadLocals,保存该线程本地变量
每个线程有自己的数据,做到了不同线程间数据的隔离,保证了数据安全
每个线程new创建对象,一个线程一个,通过set将新对象引用保存到线程map中
用线程ID为key,实例对象(传入model内存地址)value,各个线程的值隔离
ThreadLocal为使用该变量的线程提供独立变量副本,每个线程可独立改变自己的副本,不影响其他线程副本
http://www.iteye.com/topic/103804https://blog.csdn.net/lufeng20/article/details/24314381https://blog.csdn.net/winwill2012/article/details/71625570基本操作:
initialValue:设置ThreadLocal初始值,protected类型建议子类重载
get时调用;先调set则不掉用该方法,只被调用一次,除remove后又调get
get获取当前线程关联的ThreadLocal值
无值调用ThreadLocal获初始值
set:设置当前线程ThreadLocal值
remove:当前ThreadLocal绑定的值删除,某些情况手动调用防内存泄漏
thread.join()
https://www.cnblogs.com/dolphin0520/p/3920407.html 看完博客看8楼评论
https://blog.csdn.net/sinat_29384657/article/details/52228578
弱引用还是比较清晰的:
关于ThreadLocalMap<ThreadLocal, Object>弱引用问题:
当线程没有结束,但ThreadLocal已经被回收,则可能导致线程中存在ThreadLocalMap<null, Object>的键值对,造成内存泄露
ThreadLocal被回收,ThreadLocal关联的线程共享变量还存在
虽然ThreadLocal的get,set方法可以清除ThreadLocalMap中key为null的value,但是get,set方法在内存泄露后并不会必然调用
1、用完 线程共享变量后,调用ThreadLocalMap.remove清除线程共享变量;
2、JDK建议ThreadLocal定义为private static,这样ThreadLocal的弱引用问题则不存在了,延迟生命周期、一直都在
https://www.cnblogs.com/coshaho/p/5127135.html
所以ThreadLocal保存线程内共享变量,从某些方面减少了多线程并发的影响