下面的这一段代码运行起来,就会发生线程安全问题:

启动两个线程,同时去修改 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学习资料的更多相关文章

  1. webapi的学习资料

    猿教程_-webapi教程-WebAPI教程 猿教程_-webapi教程-Web API概述 猿教程_-webapi教程-新建Web Api项目 猿教程_-webapi教程-测试Web API 猿教程 ...

  2. netty学习资料

    netty学习资料推荐官方文档和<netty权威指南>和<netty in action>这两本书.下面收集下网上分享的资料 netty官方参考文档 Netty 4.x Use ...

  3. iOS 开发学习资料整理(持续更新)

      “如果说我看得比别人远些,那是因为我站在巨人们的肩膀上.” ---牛顿   iOS及Mac开源项目和学习资料[超级全面] http://www.kancloud.cn/digest/ios-mac ...

  4. 最新JavaScript、Ajax典藏级学习资料下载分类汇总 (2011年12月21日更新)

    其他网站开发相关资料            超强HTML和xhtml,CSS精品学习资料下载汇总                                               最新htm ...

  5. VC++/MFC(VC6)开发技术精品学习资料下载汇总

    工欲善其事,必先利其器,VC开发MFC Windows程序,Visual C++或Visual Studio是必须的,恩,这里都给你总结好了,拿去吧:VC/MFC开发必备Visual C++.Visu ...

  6. C/C++编程语言学习资料尽收眼底 电子书+视频教程

    Visual C++(VC/MFC)学习电子书及开发工具下载请看这里 史无前例的网络最全最强C/C++资料索引: C/C++编程语言学习资料尽收眼底 电子书+视频教程 VC++/MFC(VC6)开发技 ...

  7. yaf学习资料

    yaf学习资料 文档 鸟哥的官方文档 Yaf框架结合PHPUnit的集成测试 php yaf框架扩展实践六--单元测试.计划任务.第三方库等 php yaf框架扩展实践一--配置篇 yaf实战例子 y ...

  8. [整理]FPGA学习资料汇总

    01.特权同学倾情奉献海量FPGA学习资料 http://pan.baidu.com/s/1pJIb32F

  9. Python学习资料下载地址(转)

    [转]Python学习资料和教程pdf 开发工具: Python语言集成开发环境 Wingware WingIDE Professional v3.2.12 Python语言集成开发环境 Wingwa ...

随机推荐

  1. Vue Router:使用 props 将组件和路由解耦

    在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性. 可以使用 props 将组件和路由解耦. 一 路由配置(布尔模式): impo ...

  2. Python解决ModuleNotFoundError: No module named 'Queue'的问题

    我们知道Python2和Python3两个版本之间,有些不兼容的地方,Python3中引入Queue会报出这个问题. Python3中要这样引入: import queue Python2中要这样引入 ...

  3. TensorFlow学习笔记12-word2vec模型

    为什么学习word2word2vec模型? 该模型用来学习文字的向量表示.图像和音频可以直接处理原始像素点和音频中功率谱密度的强度值, 把它们直接编码成向量数据集.但在"自然语言处理&quo ...

  4. centos7安装配置jdk、tomcat

    centos7安装jdk1.8 1.新建文件夹java,上传文件jdk-8u111-linux-x64.tar.gz到java文件夹 2.解压tar包: tar -zxvf jdk-8u111-lin ...

  5. 来自python自学者的小问题

    我想使用python的第三方库,但是我的IDE给我一个错误代码: D:\untitled\venv\Scripts\python.exe "D:/py code/venv/sxsxsxsxs ...

  6. 实验报告一 &第三周课程总结

    实验报告 1.打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 实验代码: public class wdnmd{ publ ...

  7. Spark-Core RDD的创建

    一.RDD创建的3种方式: 1.从集合中创建RDD 2.从外部存储创建RDD 3.从其他RDD转换得到新的RDD 二.从集合中创建RDD 1.使用parallelize函数创建 scala> v ...

  8. git ssh key配置&解决git每次输入密码

    git ssh key配置&解决git每次输入密码:https://blog.csdn.net/qq_42817227/article/details/81415404

  9. CodeForces 877E DFS序+线段树

    CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...

  10. BZOJ 3252题解(贪心+dfs序+线段树)

    题面 传送门 分析 此题做法很多,树形DP,DFS序+线段树,树链剖分都可以做 这里给出DFS序+线段树的代码 我们用线段树维护到根节点路径上节点权值之和的最大值,以及取到最大值的节点编号x 每次从根 ...