ThreadLocal学习资料
2024-08-28 14:52:05
下面的这一段代码运行起来,就会发生线程安全问题:
启动两个线程,同时去修改 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
最新文章
- 新建 ASP.NET Core MVC 项目 -- Hello World!
- LoadRunner 获取接口请求响应信息
- Aspose.Cells设置自动列宽(最佳列宽)及一些方法总结
- 【前台页面 BUG】回车按钮后,页面自动跳转
- Python开发入门与实战4-模板页面
- iptables 基础知识
- C# Driver LINQ Tutorial
- leetcode面试准备:Sliding Window Maximum
- Linux Increase The Maximum Number Of Open Files / File Descriptors (FD)
- Python之路第八天,基础(9)-面向对象(下)
- mysql 数据库备份ubuntu
- Laravel5中Cookie的使用
- 前端到后台ThinkPHP开发整站(6)
- 开发手机APP的神器 --- ionic
- Android 如何监听输入法关闭事件
- 如何理解JavaScript中的原型和原型链
- 《python语言程序设计》_第三章(数字函数、字符串和对象)
- Ext 修改内容之后 不做任何动作 再次修改时的数据是原来第一次修改前的数据
- oracle进阶之connect by笔记
- WebSocket和long poll、ajax轮询的区别,ws协议测试