【ThreadLocal】使用ThreadLocal实现线程安全
2024-10-13 18:02:39
非线程安全
public class UnSafeThreadLocalDemo {
private int count = 0;
public static void main(String[] args) {
UnSafeThreadLocalDemo unSafeThreadLocalDemo = new UnSafeThreadLocalDemo();
for (int i = 0; i < 5; i++) {
int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
unSafeThreadLocalDemo.process();
unSafeThreadLocalDemo.print(finalI);
}
}).start();
}
}
public void process() {
for (int i = 0; i < 10; i++) {
count += 1;
try {
TimeUnit.MILLISECONDS.sleep(new Random().nextInt(10) + 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void print(int i) {
System.out.println("count(" + i + ") = " + count);
}
}
输出:
count(1) = 44
count(0) = 46
count(3) = 47
count(2) = 49
count(4) = 49
线程安全
public class SafeThreadLocalDemo {
// private int count = 0;
private ThreadLocal<Integer> count = new ThreadLocal<Integer>() {
protected Integer initialValue() {
return 0;
}
};
public void process() {
for (int i = 0; i < 10; i++) {
count.set(count.get() + 1);
try {
TimeUnit.MILLISECONDS.sleep(new Random().nextInt(10) + 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void print(int i) {
System.out.println("count(" + i + ") = " + count.get());
}
public static void main(String[] args) {
SafeThreadLocalDemo safeThreadLocalDemo = new SafeThreadLocalDemo();
for (int i = 0; i < 5; i++) {
int finalI = i;
new Thread(new Runnable() {
@Override
public void run() {
safeThreadLocalDemo.process();
safeThreadLocalDemo.print(finalI);
}
}).start();
}
}
}
输出:
count(1) = 10
count(0) = 10
count(2) = 10
count(4) = 10
count(3) = 10
最新文章
- Join Attributes
- samba 最简单配置 共享
- windows操作系统日常使用
- 菜鸟学习SSH——目录
- day 0.
- json2.js使用参考
- SqLite 框架 GreenDAO
- 一些有用的javascript实例分析(二)
- JavaBean--实例:注册验证
- Fast R-CNN(理解)
- Hbase各版本环境要求
- C# 程序运行进度显示Lable
- ubuntu系统中安装eclipse
- MT【25】切线不等式原理及例题
- java web 使用maven打包绕过单元测试
- 即将上线的Kafka 集群(用CM部署的)无法使用“--bootstrap-server”进行消费,怎么破?
- java 把InputStream流写入到文件中
- bzoj 1826
- git 查看父分支
- Spring_总结_02_依赖注入
热门文章
- 环境变量、cp、mv、cat 等命令
- ES最佳实践之分片使用优化
- 逍遥大佬分享mysql知识
- 对中文进行MD5加密的注意事项(Java版,编码问题)
- 本地连接服务器的mongodb
- Singer 学习九 运行&;&;开发taps、targets (四 开发target)
- Hasura GraphQL schema 生成是如何工作的
- Web读取指定的config文件的内容
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 是“帐”还是“账” --- 由 FastAdmin 用户中心引出的讨论