利用ThreadLocal解决线程同步问题
线程安全是Java性能测试中绕不过去的一个坎,想要其测试必需对其有所了解,所谓知己知彼百战不殆。之前我也写过一些性能测试中线程安全和线程同步的文章:
但是就运行效能而言,加锁同步又会带来更多的性能消耗,有些得不偿失。在某些并发场景下加锁同步并不是唯一解决线程安全的方法,还有两种,其中一种是基于CAS
的替代方案,我已经之前文章线程安全类在性能测试中应用中使用的就是这个方案,包括性能测试框架第三版中也多次使用到这个方案,有兴趣的同学可以再看一看这两篇文章。
下面将另外一个避免同步的方案:避免同步发生的一个方法就是在每个线程中使用不同的对象,这样访问对象时就不存在竞争了。为保证线程安全,很多Java对象是同步的,但是它们未必需要共享。另一方面,很多Java对象创建的成本很高,或者是会占用大量内存。java.lang.ThreadLocal
这个方法就可以很好解决这个问题。每次有一个线程访问这个对象,就会得到一个新的对象,避免了线程竞争同一个对象,也就用不到同步,可以很大程度提升性能。
下面是Demo:
package com.fun;
import com.fun.frame.SourceCode;
public class AR extends SourceCode {
static ThreadLocal<String> local = new ThreadLocal<String>() {
public String initialValue() {
String s = new String(getNanoMark() + EMPTY);
output(s.hashCode());
return s;
}
};
public static void main(String[] args) throws InterruptedException {
AR ar = new AR();
ar.ss();
ar.ss();
Thread thread = new Thread(() -> ar.ss());
Thread thread2 = new Thread(() -> ar.ss());
thread.start();
thread2.start();
thread.join();
thread2.join();
}
public void ss() {
local.get();
}
}
控制台打印如下:
INFO-> 当前用户:fv,IP:192.168.0.104,工作目录:/Users/fv/Documents/workspace/fun/,系统编码格式:UTF-8,系统Mac OS X版本:10.15.3
INFO-> 851397249
INFO-> 1851572413
INFO-> 1875674350
Process finished with exit code 0
- 郑重声明:文章首发于公众号“FunTester”,禁止第三方(腾讯云除外)转载、发表。
技术类文章精选
- Linux性能监控软件netdata中文汉化版
- 性能测试框架第三版
- 如何在Linux命令行界面愉快进行性能测试
- 图解HTTP脑图
- 将swagger文档自动变成测试代码
- Selenium Python使用技巧(一)
- Selenium Python使用技巧(二)
- Selenium Python使用技巧(三)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南