ThreadLocal浅谈

一、什么是ThreadLocal?
ThreadLocal 英文直译“线程本地”或“本地线程”,但其实它真实代表一个容器,用于存放线程的局部变量。
它是为了解决多线程并发问题而设计的。

举例说明下:一个web应用中,需要实现一个序列号生成器,可能会有多个并发线程访问它,要保证每个线程得到的序列都是自增的,而不能相互干扰。
先搞个接口:
public interface Sequence{
        int getNumber();
}

然后实现一个线程类:
public class Clinet extends Thread{
    private Sequence squence;
//构造
    public Client(Sequence squence){
        this.squence=squence;
        }
public void run(){
    for(int i=0;i<3;i++){
        System.out.println(Thread.currentThread().getName()+"---->"+squence.getNumber());
        }
    }
}
先不用ThreadLocal,搞个实现类:
public class TestA implements Sequence{
    private static int number=0;
    public int getNumber(){
        number=number+1;
        return number;
        } public static void main(String[] args){
     TestA squenceA=new Clinet();
    Client thread1=new Clinet(squenceA);
    Client thread2=new Clinet(squenceA);
    Client thread3=new Clinet(squenceA);
    thread1.start();
    thread2.start();
    thread3.start();
    }
}
自己可以运行下程序
预想的结果是每个线程都是1,2,3
但会出现4,5,6的情况......
如何解决?

未完。。。。
#Java工程师#
全部评论

相关推荐

一面(5.30)45min自我介绍说说java中常用的集合linkedList&nbsp;和&nbsp;ArrayList的区别以及在什么时候会使用如果现在要自己实现一个hashmap,会怎么设计链表法和开放寻址有了解过吗?有哪些数据结构运用了开放寻址法说一下运行时数据区域里面有什么新实例化一个对象在堆上的一个分配流程是什么对gc的了解synchronized和juc包下面的工具类在日常开发中是怎么用的如何理解synchronized对性能有影响偏向锁是什么synchronized锁升级的流程threadlocal实现原理在开发中用到threadlocal中有没有什么坑为什么要在finally移除掉这个threadlocal强引用&nbsp;弱引用&nbsp;软引用&nbsp;虚引用是什么concurrentHashMap的实现原理如何理解悲观锁和乐观锁,为什么认为乐观锁的性能会更好一次上下文切换大概要消耗多少性能,cpu空转又要消耗多少资源上下文切换的流程,上下文切换本质synchronized锁上了一个线程后,对于多核系统来说cpu资源可能会是什么状态spring的aop是基于什么实现的对cglib的了解,它是怎么去实现代理的在做项目的时候遇到特别有成就感的一件事在一个交易系统中,后端程序去调用微信支付接口,用户在使用微信支付时很久都没有支付,而后端程序并不知道支付成功还是支付失败,要怎么解决这种场景的发生为什么选择大二出来实习你以后是更希望成为一个更偏向业务的程序员还是更偏向技术的程序员校内的经历反问二面(6.5)&nbsp;40min自我介绍讲一下mybatis拦截器的实现思路和应用场景数据隔离是怎么做的假如不限制时间不限制成本,实现数据隔离的方法threadLocal出现的bug怎么解决动态线程池是怎么设计的定时任务对动态线程池的作用假如说现在想要监控线程池的一些状态,你会想监控哪些属性讲一下双token机制探讨如何实现用户在token即将过期时无感的获取到新的token说一下对滑动窗口的理解想要实现随着时间变化的排行榜top100怎么实现问职业规划接不接受转go语言反问
点赞 评论 收藏
分享
05-28 14:23
门头沟学院 Java
民本大三&nbsp;学到比较晚&nbsp;基础也不好,做的两个烂大街项目&nbsp;就开始在各大网站投实习,结果一个面试都没有,上周学校双选会,投了投,好不容易有一个面试机会,结果一问三不知,我已经感觉到面试官的无语了😶。面经:me:首先是自我介绍&nbsp;。。。&nbsp;(临时让ai生成的)h&nbsp;r:然后问我简历中的这两个项目&nbsp;自认为比较好的地方&nbsp;me:我看了看&nbsp;当时很紧张&nbsp;脑子一边空白&nbsp;只记得某马点评的&nbsp;秒杀功能&nbsp;的超卖问题(因为比较难&nbsp;印象深,但是不会😂)h&nbsp;r:问我如何实现的&nbsp;我说通过乐观锁解决(对就这几个字&nbsp;没有多余的&nbsp;因为我也说不上来了&nbsp;太紧张了)h&nbsp;r:追问这个只通过乐观锁也不能解决啊(充满质疑的疑问)me:于是我又补充道&nbsp;同时引入了Redisson分布式锁&nbsp;(真的说不出来了&nbsp;大脑一片空白,好在hr没有继续追问&nbsp;可能知道我也说不清了)hr:又问&nbsp;另一个**外卖项目比较满意那一部分&nbsp;me:&nbsp;我是真的不知道哪里比较好&nbsp;我记随便说了&nbsp;redis缓存热点key&nbsp;1.&nbsp;redis&nbsp;和&nbsp;堆内存&nbsp;存储的区别?这个问题一开始我以为适合mysql的区别,直接回答redis是存储到内存,hr立马打断说&nbsp;堆内存也是内存,我就蒙了,没有印象,只能说不太了解😭2.&nbsp;如果&nbsp;两个用户的密码完全相同,此时用MD5加密算法后得到的密码相同吗,如何解决?首先说明相同,然后问我如何解决&nbsp;我之前没有来了解过&nbsp;加盐处理&nbsp;只能说&nbsp;在原来的处理上加入随机值。3.&nbsp;外卖项目如何实现websocket的来单提醒?websocket更是没有了解过,只是做项目时&nbsp;看了看&nbsp;完全回答不上来4.&nbsp;我看你项目中用到了websocket和redis&nbsp;现在设计一个在线聊天系统&nbsp;当用户登陆后&nbsp;实时将登录用户展现在界面&nbsp;如何实现?5.&nbsp;如何使用mysql&nbsp;语句&nbsp;查询&nbsp;两个用户是否相互关注?6.&nbsp;点评项目&nbsp;自定义拦截器如何实现的&nbsp;?这个问题刚好,之前整理过,不过回答完&nbsp;hr不太理解实现了什么作用,并没有什么效果,我多次解释补充后,hr也是放弃了这个话题项目都是速成&nbsp;很多都不熟悉,各位牛友可否解答一下面试官的问题&nbsp;同时给点建议吗,真的很想找一份实习😭
查看11道真题和解析 面试问题记录 牛客创作赏金赛
点赞 评论 收藏
分享
评论
点赞
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务