线程本地存储

       先简要对ThreadLocal进行一下说明,大家都知道synchronized,他是为了解决线程互斥访问临界资源的。而ThreadLocal是为了隔离临界资源(可能这里不应该叫临界资源了,应该叫被共享的资源),创建副本解决synchronized要解决的那个问题的。

       看个例子先:

package com.wjy.threadlocal;


public class Student {
	private int age=0;
	public int getAge(){
		return this.age;
	}
	public void setAge(int age){
		this.age=age;
	}
}

 

package com.wjy.threadlocal;

import java.util.Random;

public class ThreadLocalDemo implements Runnable{
	private final static ThreadLocal studentLocal=new ThreadLocal();
	public static void main(String args[]){
		ThreadLocalDemo td=new ThreadLocalDemo();
		Thread t1=new Thread(td, "thread1");
		Thread t2=new Thread(td, "thread2");
		
		t1.start();
		t2.start();
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		accessStudent();
	}
	protected Student getStudent(){
		Student student=(Student)studentLocal.get();
		if(student==null){
			student=new Student();
			studentLocal.set(student);
		}
		return student;
	}
	public void accessStudent(){
		String currentThreadName=Thread.currentThread().getName();
		System.out.println("Current thread:  "+currentThreadName);
		
		Random random=new Random();
		int age=random.nextInt(100);
		
		Student student=getStudent();
		student.setAge(age);
		System.out.println("thread "+currentThreadName+" set age to:  "+age);
		
		System.out.println("thread "+currentThreadName+" first read age is: "+student.getAge());
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("thread "+currentThreadName+" second read age is: "+student.getAge());

	}
}

惊奇地发现,在同时被两个线程共享age的情况下,age竟然没有出现问题。两个线程运行正常,互不影响。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值