ThreadLocal线程内单例跨线程调用测试
2016-12-04 00:35
190 查看
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/07/22/ThreadLocal线程内单例跨线程调用测试/
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我们都知道依靠线程为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线程内单例跨线程调用测试/
相关文章推荐
- 关于同一线程两次调用EnterCriticalSection的测试
- 测试多个线程调用同一静态方法(无静态变量)时是否有线程安全问题
- 基于用户级线程的远程调用效率测试
- 代码调用DruidDataSource来管理conn连接,同时声明了ThreadLocal对象来保存每次线程请求所获取的连接,这样可以避免每个new一个JDBC
- 线程变量(ThreadLocal)的使用和测试
- 基于用户级线程的远程调用效率测试
- 测试多个线程调用同一静态方法(无静态变量)时是否有线程安全问题
- 如何在调用线程的时候传递参数
- 线程安全主要是由同时调用非synchronized方法来操作类的成员变量引起的。这句话对吗?
- 利用Windows自带的Debug程序测试DOS的21#功能调用
- WR中调用dll及连接数据库扩展测试功能的用法
- 创建某控件的线程之外的其他线程试图调用该控件引发的问题
- COM 经验的八个教训(7):使用线程或异步调用来避免 DCOM 超时设定太长
- 怎样使用mock object测试一个启动新线程的类
- CLR 的异步调用的测试
- 如何跨越线程调用窗体上的控件
- WR中调用dll及连接数据库扩展测试功能的用法
- 对于在一个线程中调用一个新窗口的理解
- 在WinFrom应用中,如果使用后台线程来操作界面应调用Control.Invoke()方法
- 衔接UI线程和管理后台工作线程的类(多线程、异步调用)