ThreadLocal学习资料
下面的这一段代码运行起来,就会发生线程安全问题:
启动两个线程,同时去修改 name 属性值。
package com.liwei.thread; /**
* 下面的代码演示了线程安全发生的由来
*
* @author Administrator
*
*/
public class ThreadLocalTest implements Runnable {
private int i = 0;
private String name = null; @Override
public void run() {
for (; i < 10; i++) {
name = Thread.currentThread().getName();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + name);
}
} public static void main(String[] args) {
ThreadLocalTest tlt = new ThreadLocalTest();
Thread t1 = new Thread(tlt, "AAA");
Thread t2 = new Thread(tlt, "BBB");
t1.start();
t2.start();
}
}
为了解决这个问题,我们给代码加上同步监视器,如下:
package com.liwei.thread; /**
* 下面的代码演示了线程安全发生的由来
*
* @author Administrator
*
*/
public class ThreadLocalTest implements Runnable {
private int i = 0;
private String name = null; @Override
public void run() {
for (; i < 10000; i++) {
synchronized (this) {
name = Thread.currentThread().getName();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + name);
}
}
} public static void main(String[] args) {
ThreadLocalTest tlt = new ThreadLocalTest();
Thread t1 = new Thread(tlt, "AAA");
Thread t2 = new Thread(tlt, "BBB");
t1.start();
t2.start();
}
}
下面,我们的主角就要登场了,让我们来看看 ThreadLocal 的威力:
package com.liwei.thread; /**
* 下面的代码演示了线程安全发生的由来
*
* @author Administrator
*
*/
public class ThreadLocalTest2 implements Runnable { private int i = 0;
private ThreadLocal<String> threadLocal = new ThreadLocal<>(); @Override
public void run() {
for (; i < 100; i++) {
threadLocal.set(Thread.currentThread().getName()); try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + threadLocal.get()); }
} public static void main(String[] args) {
ThreadLocalTest2 tlt = new ThreadLocalTest2();
Thread t1 = new Thread(tlt, "CCC");
Thread t2 = new Thread(tlt, "DDD");
t1.start();
t2.start();
}
}
我们通过看源码可以知道:ThreadLocalMap 以当前的 ThreadLocal 作为键。
参考资料:
ThreadLocal-分析-总结 - 洞玄 - ITeye技术网站
http://mxdba.iteye.com/blog/777716
深入浅出ThreadLocal - Java综合 - Java - ITeye论坛
http://www.iteye.com/topic/757478
ThreadLocal学习资料的更多相关文章
- webapi的学习资料
猿教程_-webapi教程-WebAPI教程 猿教程_-webapi教程-Web API概述 猿教程_-webapi教程-新建Web Api项目 猿教程_-webapi教程-测试Web API 猿教程 ...
- netty学习资料
netty学习资料推荐官方文档和<netty权威指南>和<netty in action>这两本书.下面收集下网上分享的资料 netty官方参考文档 Netty 4.x Use ...
- iOS 开发学习资料整理(持续更新)
“如果说我看得比别人远些,那是因为我站在巨人们的肩膀上.” ---牛顿 iOS及Mac开源项目和学习资料[超级全面] http://www.kancloud.cn/digest/ios-mac ...
- 最新JavaScript、Ajax典藏级学习资料下载分类汇总 (2011年12月21日更新)
其他网站开发相关资料 超强HTML和xhtml,CSS精品学习资料下载汇总 最新htm ...
- VC++/MFC(VC6)开发技术精品学习资料下载汇总
工欲善其事,必先利其器,VC开发MFC Windows程序,Visual C++或Visual Studio是必须的,恩,这里都给你总结好了,拿去吧:VC/MFC开发必备Visual C++.Visu ...
- C/C++编程语言学习资料尽收眼底 电子书+视频教程
Visual C++(VC/MFC)学习电子书及开发工具下载请看这里 史无前例的网络最全最强C/C++资料索引: C/C++编程语言学习资料尽收眼底 电子书+视频教程 VC++/MFC(VC6)开发技 ...
- yaf学习资料
yaf学习资料 文档 鸟哥的官方文档 Yaf框架结合PHPUnit的集成测试 php yaf框架扩展实践六--单元测试.计划任务.第三方库等 php yaf框架扩展实践一--配置篇 yaf实战例子 y ...
- [整理]FPGA学习资料汇总
01.特权同学倾情奉献海量FPGA学习资料 http://pan.baidu.com/s/1pJIb32F
- Python学习资料下载地址(转)
[转]Python学习资料和教程pdf 开发工具: Python语言集成开发环境 Wingware WingIDE Professional v3.2.12 Python语言集成开发环境 Wingwa ...
随机推荐
- Python 使用openpyxl导出Excel表格的时候,使用save()保存到指定路径
在使用openpyxl导出Excel表格的使用,如何指定导出的路径呢. 使用sava(filename),会保存到当前执行文件的路径下. 使用sava("/tmp/{}.xlsx" ...
- Hand on Machine Learning 第二章:端到端的机器学习
1.import 模块 import os import tarfile from six.moves import urllib import pandas as pd pd.set_option( ...
- Mac018--VisualBox & ubuntu 安装
一.安装虚拟机VMware 参考博客:https://blog.csdn.net/u013142781/article/details/50529030 Step1:下载ubuntu镜像 注:选择Ub ...
- Token 认证
Token 认证 From今日头条:https://www.toutiao.com/i6516654967204348430/?tt_from=weixin&utm_campaign=clie ...
- TypeScript + Webpack 环境搭建
TypeScript + Webpack 环境搭建步骤 安装Node.js 安装npm 创建一个npm项目 安装typescript,配置ts 安装webpack,配置webpack 初始化一个npm ...
- R语言基础篇——数据对象
1.基本数据类型(numeric,logical,character,NA,double,complex,integer) 2.日期变量 常用函数 Sys.Date()-返回系统当前的日期,Sys.t ...
- LeetCode106. 从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树 描述 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 示例 例如,给出 中序遍历 inorder = [9,3,15,20 ...
- Vue slot-scope的理解(适合初学者)
百度上已经有很多的关于slot-scope的文章,但我感觉都是那些以前没学好,又回头学的人,他们都使用了.Vue文件,我觉得有点不适合初学者,所以我就写一篇适合初学者的. 先抛例程: <!DOC ...
- SQL Server 查找字符串中指定字符出现的次数
要查找某个指定的字符在字符串中出现的位置,方法比较简单,使用 len() 函数和 replace() 函数结合就可以. SELECT TOP 200 approveInfo approveInfo2, ...
- STS插件创建springboot项目,pom第一行报unkown错误
Description Resource Path Location TypeUnknown pom.xml /amq-provider line 1 ...