ThreadLocal线程内单例跨线程调用测试
来源:互联网 发布:星际战甲漂亮捏脸数据 编辑:程序博客网 时间:2024/06/09 16:05
ThreadLocal我们都知道依靠线程为Key来维护每个线程一个副本,保证线程内单例,确保线程安全,但是如果从ThreadLocal中拿出该线程内单例之后人为地把它放到另一线程呢?(显然,不人为这么做,JDK本身是保证了该单例仅在本线程内使用的,不会出现我说的这种问题的,我的这种问题仅仅是突发奇想测试一下哈哈哈)。
上代码:
public class ThreadlocalTest {
static ThreadLocal<Object> threadLocal = new ThreadLocal<Object>();
public static void main(String[] args) {
threadLocal.set(Thread.currentThread());
final Object main = threadLocal.get();
System.out.println(main);
new Thread(new Runnable() {
@Override
public void run() {
threadLocal.set(Thread.currentThread());
Object name = threadLocal.get();
System.out.println(name);
((Thread)main).setName("main1");
System.out.println(main);
}
}).start();
}
}
代码内容很好理解,在main线程从ThreadLocal得到线程实例,在子线程中调用这个实例main,并修改名称为main1,子线程自己也放入一个实例,输出结果如下,很明显,在子线程中修改main线程中的实例main成功。
运行结果:
事实说明,ThreadLocal维持的每个线程一个唯一副本,在线程内部单例,但是如果把取出来的这个对象引用人为地拿到另一线程使用,还是可以的,因此ThreadLocal不会拒绝你跨线程使用线程内部单例,支持给你提供线程内部单例的前提,要保证线程安全的程序,还是要程序员人为地注意这一点,保证该单例只在本线程内部使用,相当于是契约式编程吧,可以这么理解。
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/07/22/ThreadLocal线程内单例跨线程调用测试/
- ThreadLocal线程内单例跨线程调用测试
- 【线程】 ThreadLocal
- 线程-ThreadLocal-线程局部变量
- 守护线程,线程组,线程池,ThreadLocal
- ThreadLocal---线程本地变量
- 线程局部变量ThreadLocal
- 线程(ThreadLocal)
- ThreadLocal 线程局部变量
- ThreadLocal 线程变量
- ThreadLocal本地线程
- ThreadLocal---线程本地变量
- Java线程之ThreadLocal
- 线程安全---ThreadLocal
- ThreadLocal 与线程池
- java线程之ThreadLocal
- 线程局部变量ThreadLocal
- Java线程ThreadLocal
- 线程学习2--ThreadLocal
- 阶段总结--业务系统代码中常见的异常错误总结以及避免方法
- CentOS安装vritualbox增强功能
- linux命令学习
- GDB调试中将信号发送给程序的方法
- House Robber II
- ThreadLocal线程内单例跨线程调用测试
- 链表初步
- SWID and SCAP
- Java之——类加载器探究
- Unity 中的旋转
- opencv GUI 指令
- Codeforces 484B Maximum Value
- 云南修改集群
- Tomcat在JavaEE中应用介绍