ThreadLocal个人理解梳理

记录一下自己对ThreadLocal的理解。

看了《实战java高并发程序设计》的书,里面有关于ThreadLocal的讲解,里面提到了ThreadLocal,ThreadLocalMap,threadlocals,entry等,看了半天没明白。

一个ThreadLocal在多线程中是如何存储的?

如果代码中定义了多个ThreadLocal,又是如何存储的?

先看下比较重要的set和get方法

#set
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

#get
public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }
View Code

先解释定义一个ThreadLocal的存储

每一个线程进来后,使用set方法,用线程作为key去查threadlocals(这是个变量,类型就是ThreadLocalMap)中是不是有值(这个值,就是一个entry类型),如果有entry,就将entry.value设置成新值,否则就创建一个entry。这里针对只有一个ThreadLocal变量的时候,创建一个entry其实也是创建一个threadlocals。所以最后每个线程中都有一个自己的threadlocals,里面存的就是自己要设置的值。

那多个ThreadLocal变量呢?

其实这里重要的就是entry了,ThreadLocalMap中其实有一组entry,而entry其实也是类似map的结构,map的key就是ThreadLocal的变量名,value就是真实要设置的值。这样就可以保证了在每个线程中,threadlocals保存了不同的ThreadLocal变量的value值

转载于:https://www.cnblogs.com/tianphone/p/10954356.html

<think>嗯,用户问的是Java面试中的项目点该怎么介绍。这个问题挺常见的,毕竟项目经验在面试中非常重要。首先,我需要理清楚用户在准备面试时可能遇到的困难。他们可能对如何有效展示项目经验不够自信,或者不知道面试官关注的重点在哪里。 用户可能是应届毕业生或者有一定工作经验的求职者,但不管哪种情况,项目经验都是面试中的关键部分。他们需要知道如何结构化地描述项目,突出自己的技术能力和解决问题的能力。 首先,我应该考虑面试官在项目环节最关注什么。通常包括技术深度、解决问题的能力、团队协作、实际应用场景等。所以,回答需要涵盖这些方面,并给出具体的例子和建议。 然后,用户可能需要具体的步骤或结构来组织他们的回答。比如,项目的背景、技术选型、个人职责、难点与解决方案、项目成果、复盘与优化等。这些都是常见的结构点,需要详细说明每个部分应该包含什么内容。 另外,用户可能对如何量化成果不太清楚,需要提醒他们使用具体的数据,比如性能提升了多少,用户量增长了多少,这样更有说服力。同时,技术亮点的部分要结合Java生态,比如使用的框架、中间件、设计模式等,展示自己的技术深度。 还有,用户可能会担心被面试官追问技术细节,所以需要建议他们深入理解项目中的关键技术点,比如多线程、JVM调优、数据库优化等,并准备好相关的底层原理和扩展知识。 最后,需要提醒用户避免泛泛而谈,要具体,用STAR法则来组织回答,这样结构更清晰,也更容易让面试官抓住重点。同时,强调复盘的重要性,展示自我反思和持续改进的能力。 可能用户没有提到的深层需求是,如何让自己的项目在众多候选人中脱颖而出,所以需要指导他们如何挖掘项目的亮点,如何将技术细节与业务需求结合,展示自己的综合能力。例如,处理高并发场景时,不仅要说用了什么技术,还要说明为什么选择这个技术,带来了什么实际效果。 总结下来,回答的结构应该分步骤,涵盖项目结构、技术亮点、常见问题、准备建议和注意事项,每个部分都给出具体的例子和解释,帮助用户系统地准备项目相关的面试问题。</think>以下是为Java面试项目经验准备的系统性指导,分为核心考察点、项目结构梳理、技术亮点挖掘、高频问题解析四部分: $$项目核心考察点 = 技术深度 \times 业务价值 + 问题解决能力$$ 一、项目描述结构化(STAR法则) 1. **场景(Situation)**:用数据量化业务场景 ✦ 例:`日均订单10万+的电商优惠系统,要求99.99%可用性` 2. **任务(Task)**:明确个人职责边界 ✦ 例:`负责分布式锁模块开发,确保秒杀场景下库存扣减的原子性` 3. **行动(Action)**:关键技术方案+实现细节 ```java // 示例:Redisson分布式锁实现 RLock lock = redisson.getLock("stockLock"); try { lock.lock(); // 执行库存校验与扣减 } finally { lock.unlock(); } ``` 4. **结果(Result)**:可衡量的成果 ✦ 例:`QPS从500提升至3000,超卖率降至0.01%以下` 二、必挖技术亮点 1. **并发处理** - 线程池参数设计:`corePoolSize=CPU核数+1,队列选择SynchronousQueue` - 锁优化:`CAS -> LongAdder -> Redis分布式锁 -> 分段锁对比选型` 2. **JVM调优** $$GC暂停时间 = \frac{堆内存}{吞吐量} \times 垃圾产生速率$$ - 案例:`通过G1替换CMS,Young GC时间从200ms降至50ms` 3. **数据库优化** ```sql -- 索引优化示例 EXPLAIN SELECT * FROM orders WHERE user_id=123 AND status='PAID' ORDER BY create_time DESC LIMIT 10; ``` - 成果:`联合索引(user_id,status,create_time)使查询耗时从2s→50ms` 三、高频问题拆解 1. **设计模式应用** - 模板方法模式:`支付流程抽象` - 策略模式:`多种风控规则动态切换` 2. **分布式问题** - 幂等性保障:`Token机制+唯一索引` - 一致性方案:`最终一致性(MQ) vs 强一致性(TCC)` 3. **源码级追问** - `HashMap扩容时为什么选择2的幂次方?` - `Spring循环依赖的三级缓存解决机制?` 四、避坑指南 1. **技术选型对比** | 场景 | Redis | Zookeeper | Etcd | |-----------|-------|-----------|----------| | 配置中心 | △ | √ | √ | | 分布式锁 | √ | √ | √ | | 服务发现 | × | √ | √ | 2. **故障复盘要点** - 案例:`FullGC频繁→内存泄漏定位→MAT分析→ThreadLocal未清理` 3. **性能压测数据** ```text 压测阶梯:100 → 500 → 1000 QPS 异常拐点:800 QPS时数据库连接池耗尽 优化方案:HikariCP替换Druid,最大连接数调至100 ``` 五、项目延展准备 1. 业务维度:`该项目的上下游系统如何交互?` 2. 技术维度:`如果流量增加10倍,系统瓶颈会在哪?` 3. 架构维度:`如何改造为微服务架构?需要哪些组件?` 建议选择1-2个深度参与的项目重点打磨,确保能回答5层追问: $$技术深度 = 实现细节 \rightarrow 设计思路 \rightarrow 方案对比 \rightarrow 原理剖析 \rightarrow 扩展应用$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值