【java基础】ThreadLocal 线程内局部变量

 
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保存线程内共享变量,从某些方面减少了多线程并发的影响



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值