Java线程ThreadLocal

// ThreadLocal类:这个类可用来存放线程的局部变量,每个线程都有单独的局部变量,彼此之间不会共享
// 这个类包括三个方法:get() 返回当前线程的局部变量, initialValue() 返回当前线程的局部变量的初始值
// set(T value)设置当前线程的局部变量
// initialValue方法是一个延迟调用方法,当线程第一次调用ThreadLocal对象的get或set方法时才执行,并且只执行一次
// 在 ThreadLocal类本身的实现中,initialValue()方法直接返回一个null
// 为了每个线程提供一个单独的局部变量,在ThreadLocal类中有一个Map缓存,用于存储每个线程的局部变量
// 当一个线程运行结束后,从Map缓存中删除对这个线程的局部变量的引用,以下Counter1类用来为每一个线程分配一个序列号
// serialCount,这个serialCount变量被声明为ThreadLocal类型,他引用一个ThreadLocal的匿名子类的实例

// LocalTester是一个线程类,他的run方法中打印自己的序列号,然后把序列号加2

public class Test16 extends Thread{
	@Override
	public void run() {
		for(int i=0;i<3;i++){
			int c = Counter1.get();
			System.out.println(getName()+":" + c);
			Counter1.set(c+=2);
		}
	}
	
	// 线程t1启动时调用Counter1.get()的时候,触发了initialValue方法(每个线程只执行一次),返回0后将count++,t1输出2,此时t2启动调用Counter1.get()的时候
	// 也触发了initialValue()方法,此时count已经被改为1了,接着返回后1后count++,这两个线程之后都不会再触发initialValue()这个方法了,所以线程t1的结果是0,2,4,线程t2的结果是1,3,5
	public static void main(String[] args) {
		Thread t1 = new Test16();
		Thread t2 = new Test16();
		
		t1.start();
		t2.start();
	}
}

class Counter1 {
	private static int count;
	private static ThreadLocal<Integer> serialCount = new ThreadLocal<Integer>(){
		@Override
		protected synchronized Integer initialValue() {
			// TODO Auto-generated method stub
			return new Integer(count++);
		}
	};
	public static int get(){
		return serialCount.get().intValue();
	}
	public static void set(int i){
		serialCount.set(Integer.valueOf(i));
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值