【ThreadLocal】使用ThreadLocal实现线程安全
非线程安全
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
【ThreadLocal】使用ThreadLocal实现线程安全的更多相关文章
- ThreadLocal是什么?保证线程安全
早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 当使 ...
- Java中ThreadLocal无锁化线程封闭实现原理
虽然现在可以说很多程序员会用ThreadLocal,但是我相信大多数程序员还不知道ThreadLocal,而使用ThreadLocal的程序员大多只是知道其然而不知其所以然,因此,使用ThreadLo ...
- 【Java并发编程】12、ThreadLocal 解决SimpleDateFormat非线程安全
大致意思:Tim Cull碰到一个SimpleDateFormat带来的严重的性能问题,该问题主要有SimpleDateFormat引发,创建一个 SimpleDateFormat实例的开销比较昂贵, ...
- 正确理解ThreadLocal:ThreadLocal中的值并不一定是完全隔离的
首先再讨论题主的这个观点之前我们要明确一下ThreadLocal的用途是什么? ThreadLocal并不是用来解决共享对象的多线程访问问题. 看了许多有关ThreadLocal的博客,看完之后会给人 ...
- 【Python】[进程和线程]多进程,多线程,ThreadLocal,进程VS.线程,分布式进程
1.多进程,multiprocessing模块, 进程间的通信:Queue[队列],Pipes[管子]2.多线程, 注意:线程公用变量,混乱 解决方法Lock:因为只有一个锁,所以当要执 ...
- 阿里开源支持缓存线程池的ThreadLocal Transmittable ThreadLocal(TTL)
功能 在使用线程池等会缓存线程的组件情况下,提供ThreadLocal值的传递功能. JDK的InheritableThreadLocal类可以完成父子线程值的传递. 但对于使用线程池等会缓存线程的组 ...
- 关于ThreadLocal和一般的线程同步的详细解释
http://blog.csdn.net/lufeng20/article/details/24314381
- Android线程管理之ThreadLocal理解及应用场景
前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...
- 0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal
什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任 ...
- ThreadLocal实现方式&使用介绍—无锁化线程封闭
原文出处: xieyu_zy 虽然现在可以说很多程序员会用ThreadLocal,但是我相信大多数程序员还不知道ThreadLocal,而使用ThreadLocal的程序员大多只是知道其然而不知其所以 ...
随机推荐
- base标签对svg的影响
页面地址:http://127.0.0.1:8080/fullLink_node.html?project_id=2 base:<base href="http://127.0.0.1 ...
- Django中的应用
1.什么是应用 应用就是网站中的一个独立的程序模块,在Django中,主目录一般不处理具体的请求,主目录一般要处理的是项目的初始化操作以及请求的分发(分布式请求处理).而具体的请求是由各个应用去处理. ...
- CentOS右键菜单添加新增文件命令
进入模板文件夹, 增加空白文件即可. cd /home/tom/Templatesvi text01.txt //新增一个名为text01的文本文件. :wq //保存退出. 另外可以用LibreOf ...
- mac sz rz file tras
安装Zmodem的实现 brew install lrzsz 下载 iterm2-send-zmodem.sh 和 iterm2-recv-zmodem.sh 到路径/usr/local/bin/ ...
- Linux内核模块编程之Helloworld(初级)
注意printk那里,KERN_ALERT和打印消息之间是没有逗号的,搞得劳资查了半天才发现一直没有提示信息的原因 #include <linux/init.h> #include < ...
- The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
转载一片mongodb 迁移pg 数据库的文章 原文:https://www.infoq.com/news/2019/01/guardian-mongodb-postgresql The Guardi ...
- openresty 编译ngx_pagespeed 模块-docker 构建
ngx_pagespeed 是一个很不错的web 优化模块,我们通过简单的配置就可以对于web页面的加载有很大的提升 ngx_pagespeed 依赖psol 模块 Dockerfile # Do ...
- Python中字典get方法的使用
Python中字典get方法的使用 说起来,这个功能是否需要学习还真是有待于讨论.其实,知道了字典这种数据结构以后,通过最基本的Python功能也能够实现一个类似的功能.不过,既然内置了这个功能那么我 ...
- 艰苦的编译boost python (失败)
1.下载 boost_1_67_0 2.在目录下执行 bootstrap 3.将python36添加到path环境变量 4.执行 b2 --with-python,将会声场如下dll 2018/04/ ...
- MYSQL 中的 int(11) 到底代表什么意思?
各 INT 类型无符号最大值用单位表示: INT 类型 无符号最大值用单位表示 TINYINT 255 SMALLINT 65535 MEDIUMINT 1677 万 INT 42 亿 BIGINT ...