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 ...
随机推荐
- oracle 11g 数据库恢复技术 ---04 rman
四 RMAN RMAN体系结构的主要组成部分: --1 目标数据库(target) --2 RMAN命令行客户端 --3 通道(channel) --4 快速恢复区(fast recovery are ...
- == 和 equals的区别
== 和 equals的区别 基本类型:== 比较的是两个变量的面值大小 对象对象: 比较的是内存地址 特例: String a = "abc" String b = &qu ...
- 项目被os x占用
xattr -d com.apple.FinderInfo 空格后拖入项目回车就行了
- Flash存储模块调试
Flash存储模块 Flash存储模块之前SPI一直读deviceID有问题原因如下: 用正点原子的例程是可以的,但是转移到自己的工程项目里就不行!!原因是正点原子没有在SPI初始化里 RCC ...
- 在react中用装饰器来装饰connect
假设我们在react中有如下header组件: import React, { PureComponent } from 'react'; import { connect } from 'react ...
- Bootstrap真的总是好的吗
原文地址:Bootstrap considered harmful 原文作者:Hidde de Vries 译文出自:neal 译者: Neal 个人主页:http://neal1991.python ...
- JS对象总结
JS对象总结 复习: 1.1 JS中对象有三种:内置对象(数组Array对象.String字符串对象.RegExp正则表达式对象.Math对象). 宿主对象(JS脚本所在的运行环境,目前我们讲的脚 ...
- jQuery中attr()和prop()及removeAttr()和removeProp()的区别
在jquery1.6之前的所有版本中设置和获取元素属性(固有属性和自定义属性)都使用attr方法,后来单独把设置和获取元素固有属性单独做成了prop()方法. 一般来说: 对于HTML元素本身就带有的 ...
- weakHashMap 用法
WeakHashMap,此种Map的特点是: 当除了自身有对key的引用外,此key没有其他引用,那么GC之后此map会自动丢弃此值 当使用 WeakHashMap 时,即使没有显示的添加或删除任何元 ...
- 行人重识别(ReID) ——数据集描述 CUHK03
数据集简介 CUHK03是第一个足以进行深度学习的大规模行人重识别数据集,该数据集的图像采集于香港中文大学(CUHK)校园.数据以"cuhk-03.mat"的 MAT 文件格式存储 ...