向ThreadLocal关联的Context类新增布尔字段对get/set操作的性能影响
新增Context布尔字段对ThreadLocal操作的性能影响
核心结论
几乎不会对ThreadLocal.get()、ThreadLocal.set()产生可感知的性能影响,不需要为此做额外的性能优化。
具体原因
ThreadLocal的get/set操作本质是操作当前线程绑定的ThreadLocalMap,存储和读取的都是Context对象的引用,不是对象本身的全量数据。不管Context类新增多少字段,引用的大小是固定的(32位JVM为4字节,64位JVM为8字节),字段增减不会改变引用的读写开销。- 新增布尔字段仅会影响
Context对象本身的实例化开销:对象的实例数据区会多占用1字节(加上可能的内存对齐填充,最多也就多占几字节),但这部分开销仅在new Context()的时候产生,和ThreadLocal的get/set操作完全无关。 - 唯一可能出现额外开销的场景是你为新增的布尔字段添加了复杂的构造逻辑、切面拦截逻辑等,但这部分是自定义代码的开销,和
ThreadLocal本身的机制无关。
示例说明
你新增字段后的代码和操作逻辑如下:
class Context { // 原有字段 ..... // 新增布尔字段 private boolean valid; public boolean isValid() { return valid; } public void setValid(boolean valid) { this.valid = valid; } } ThreadLocal<Context> threadLocal = new ThreadLocal<>();
不管有没有新增valid字段,下面的ThreadLocal操作开销完全一致:
// set操作仅传递Context对象的引用 Context context = new Context(); context.setValid(true); // 仅操作Context字段的开销,和ThreadLocal.set无关 threadLocal.set(context); // get操作仅读取Context对象的引用 Context ctx = threadLocal.get(); // 开销和Context字段数量无关 boolean isValid = ctx.isValid(); // 仅读取Context字段的开销,和ThreadLocal.get无关
内容的提问来源于stack exchange,提问作者Vamshi
相关产品推荐
相关产品推荐

