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

启动两个线程,同时去修改 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

最新文章

  1. 新建 ASP.NET Core MVC 项目 -- Hello World!
  2. LoadRunner 获取接口请求响应信息
  3. Aspose.Cells设置自动列宽(最佳列宽)及一些方法总结
  4. 【前台页面 BUG】回车按钮后,页面自动跳转
  5. Python开发入门与实战4-模板页面
  6. iptables 基础知识
  7. C# Driver LINQ Tutorial
  8. leetcode面试准备:Sliding Window Maximum
  9. Linux Increase The Maximum Number Of Open Files / File Descriptors (FD)
  10. Python之路第八天,基础(9)-面向对象(下)
  11. mysql 数据库备份ubuntu
  12. Laravel5中Cookie的使用
  13. 前端到后台ThinkPHP开发整站(6)
  14. 开发手机APP的神器 --- ionic
  15. Android 如何监听输入法关闭事件
  16. 如何理解JavaScript中的原型和原型链
  17. 《python语言程序设计》_第三章(数字函数、字符串和对象)
  18. Ext 修改内容之后 不做任何动作 再次修改时的数据是原来第一次修改前的数据
  19. oracle进阶之connect by笔记
  20. WebSocket和long poll、ajax轮询的区别,ws协议测试

热门文章

  1. C#7.0新特性和语法糖详解
  2. 【MM系列】SAP MM中物料帐下修改物料的价格
  3. 安全运维 - Windows系统应急响应
  4. Websocket如何建立连接
  5. P5444 [APIO2019]奇怪装置
  6. js中JSON和JSONP的区别,让你从懵逼到恍然大悟
  7. vim ctags
  8. git 操作遇到的问题与解决方法
  9. php内置函数分析之strtoupper()、strtolower()
  10. windows下laravel 快速安装