Java多线程与并发应用-(5)-如何优雅的使用ThreadLocal类

内容来自,张孝祥老师的张孝祥-Java多线程与并发库高级应用》视频教程

package com.lipeng;

public class MyThreadLocalTest2 {

	private final static MyThreadLocal<String> myThreadLocal=new MyThreadLocal<String>();
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Thread(){
			public void run() {

				ThreadLocalData.getThreadLocalData().setAge(12);
				ThreadLocalData.getThreadLocalData().setName("张三");
				System.out.println(Thread.currentThread().getName()+"----------------"+A.getName());
				System.out.println(Thread.currentThread().getName()+"----------------"+B.getName());
			};
		}.start();
		new Thread(){
			public void run() {
				ThreadLocalData.getThreadLocalData().setAge(18);
				ThreadLocalData.getThreadLocalData().setName("李四");
				System.out.println(Thread.currentThread().getName()+"----------------"+A.getName());
				System.out.println(Thread.currentThread().getName()+"----------------"+B.getName());

			};
		}.start();

	}
	static class A
	{
		public static String getName()
		{
			return  ThreadLocalData.getThreadLocalData().getName();
		}

		public static void setName(String name)
		{
			myThreadLocal.set(name);
		}
	}

	static class B
	{
		public static String getName()
		{
			return  ThreadLocalData.getThreadLocalData().getName();
		}
		public static void setName(String name)
		{
			myThreadLocal.set(name);
		}
	}
}

class ThreadLocalData
{
	private static ThreadLocal<ThreadLocalData> threadLocal=new ThreadLocal<ThreadLocalData>();
	private String name;
	private int age;
	private ThreadLocalData(){  //不提供public的构造方法,只提供一个静态工厂方法,此方法返回与当前线程有关的当前类的实例对象。

	}

	public static ThreadLocalData getThreadLocalData()
	{
		ThreadLocalData threadLocalData=threadLocal.get();
		if(threadLocalData==null)
		{
			threadLocalData=new ThreadLocalData();
			threadLocal.set(threadLocalData);
		}
		return threadLocalData;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

<span style="white-space:pre">	</span>我们在获取一个与线程绑定的对象时,不希望看到ThreadLocal,而是直接得到与当前线程绑定的对象,在这里,将线程绑定的类的构造方法private,提供一个静态方法,使得要获得这个类的对象,必须通过这个方法,而这个方法是从ThradLocal中get到的即使当前线程绑定的实例。
时间: 2024-10-26 19:59:42

Java多线程与并发应用-(5)-如何优雅的使用ThreadLocal类的相关文章

JAVA多线程和并发基础面试问答【转】

JAVA多线程和并发基础面试问答 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观点) Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单 一进程.线程可以被称为轻量

JAVA 多线程和并发学习笔记(三)

Java并发编程中使用Executors类创建和管理线程的用法 1.类 Executors Executors类可以看做一个“工具类”.援引JDK1.6 API中的介绍: 此包中所定义的 Executor.ExecutorService.ScheduledExecutorService.ThreadFactory 和 Callable 类的工厂和实用方法.此类支持以下各种方法: 创建并返回设置有常用配置字符串的 ExecutorService 的方法. 创建并返回设置有常用配置字符串的 Sche

Java多线程与并发---学习总结(很详细)

Java多线程与并发---学习总结(很详细) 1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓存一致性:多处理器系统中,因为共享同一主内存,当多个处理器的运算任务都设计到同一块内存区域时,将可能导致各自的缓存数据不一致的情况,则同步回主内存时需要遵循一些协议. 乱序执行优化:为了使得处理器内部的运算单位能尽量被充分利用. 2.      JAVA

17、JAVA多线程和并发基础面试问答

JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观点) Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(se

Java多线程与并发库高级应用之公共屏障点CyclicBarrier

一个小队去登山,每位队员登山的速度不同.山上有几个集合点,在每一集合点处,先到达的队员只有等后面的队员全部到达集合点后才能继续向下一个集合点出发. JDK1.5提供的CyclicBarrier模拟了这种情况.每一个线程相当于一个登山队员,CyclicBarrier相当于山上的集合点.只有等所有线程都执行到了CyclicBarrier后才可以继续向下执行. CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程

Java多线程与并发库高级应用之信号量Semaphore

JDK1.5提供了一个计数信号量Semaphore类.Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,并提供了同步机制. Semaphore提供了两个构造器来创建对象: 1)Semaphore(int permits):创建具有给定的许可数和非公平的公平设置的Semaphore. 2)Semaphore(int permits, boolean fair):创建具有给定的许可数和给定的公平设置的Semaphore.如果此信号量保证在争用时按先进先出的顺序授予许可,则为

Java多线程与并发库高级应用之阻塞队列BlockingQueue

JDK1.5提供了阻塞队列接口BlockingQueue,它是一个有界阻塞队列.BlockingQueue实现是线程安全的,可以安全地与多个生产者和多个使用者一起使用. 使用时用其实现类 ArrayBlockingQueue,它一个由数组支持的有界阻塞队列.此队列按 FIFO(先进先出)原则对元素进行排序.队列的头部 是在队列中存在时间最长的元素.队列的尾部是在队列中存在时间最短的元素.新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素. 这是一个典型的"有界缓存区",固定

Java多线程与并发库高级应用之线程数据交换Exchanger

JDK1.5提供了Exchanger用于两个线程的数据交换.两个线程先后到达交换点,先到达的线程会等待后到达的线程,然后两个线程互相交换数据,交换后双方持对方的数据. Exchanger只提供了一个构造器: Exchanger():创建一个新的Exchanger. Exchanger中也只有两个方法: V exchange(V x): 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象. V exchange(V x, long timeout,

Java多线程与并发库高级应用之倒计时计数器

CountDownLatch 类是一个倒计时计数器,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数初始化 CountDownLatch.由于调用了countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞.之后,会释放所有等待的线程,await 的所有后续调用都将立即返回. CountDownLatch 是一个通用同步工具,它有很多用途.将计数1初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用 c