码迷,mamicode.com
首页 > 编程语言 > 详细

java基础-ThreadLocal变量和普通变量的区别

时间:2015-04-10 15:39:23      阅读:674      评论:0      收藏:0      [点我收藏+]

标签:threadlocal

       java提供了ThreadLocal这个类型,具有该类型的成员变量,每个使用到该变量的线程都保留一份该属性的备份数据,在线程内部对该属性的操作都是自己备份的数据,所以声明为ThreadLocal类型的成员变量都是线程安全的。

      简单测试了一下ThreadLocal类型的成员和普通成员的区别,在多线程环境,每个线程都会存有一个ThreadLocal的值,而普通成员则是线程共享的。

import java.util.Date;

public class MyThreadLocal {
	private ThreadLocal date = new ThreadLocal();
	private Date d = null;
	
	public void process(){
		if(date.get()==null){
			date.set(new Date());
			System.out.println("<span style="font-family: Arial, Helvetica, sans-serif;">thread local fileld</span>:"+date.get());
		}
	}
	//操作普通成员,需要同步处理
	public void p(){
		synchronized(MyThreadLocal.class){
			if(d==null){
				d = new Date();
				System.out.println("ordinary field:"+d);
			}
		}
	}
}
       测试类:定义一个MyThreadLocal对象实例,由5个线程同时访问它的方法。

import java.util.Date;

public class Test {
	public static void main(String[] args) {
		final MyThreadLocal t = new MyThreadLocal();
		for(int i = 0;i<5;i++){
			Thread thread = new Thread(){
				public void run(){
					t.process();
					t.p();
				}
			};
			thread.start();
		}
		Date d1 = new Date();
		Date d2 = new Date();
		System.out.println(d1==d2);
		System.out.println(d1.hashCode()==d2.hashCode());
	}
}
        测试结果:

false
true
thread local fileld:Fri Apr 10 14:47:30 CST 2015
ordinary field:Fri Apr 10 14:47:31 CST 2015
thread local fileld:Fri Apr 10 14:47:30 CST 2015
thread local fileld:Fri Apr 10 14:47:30 CST 2015
thread local fileld:Fri Apr 10 14:47:30 CST 2015
thread local fileld:Fri Apr 10 14:47:30 CST 2015
        测试结果分析:很显然共享的成员变量d只被一个线程初始化了一次,所以p方法的代码只执行了一次;而ThreadLocal成员变量,每个访问该变量的线程都会自己创建一个备份数据,process方法被执行了五次。此外,还发现两次new Date()得到的对象的hashCode很容易相等,但的确是两个不同对象。

java基础-ThreadLocal变量和普通变量的区别

标签:threadlocal

原文地址:http://blog.csdn.net/wojiushiwo945you/article/details/44979285

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!