`

ThreadLocal实现共享对象

    博客分类:
  • java
 
阅读更多
当考虑到每个线程共享多个变量时,需要定义多个ThreadLocal变量,有时候这种定义方式不一定就行的通,这时可考虑将操作的多个变量封装到一个对象中,直接定义一个ThreadLocal变量即可。下面列出两种方式:
1、将对对象的获取放在当前线程中,也即当前线程中new一个新对象出来
2、将对对象的获取放在定义出来的对象中操作。(推荐)


第一种方式:

/**
 * @author
 * @date 2017年4月16日下午3:46:41
 * @description 线程范围内的共享对象如何设计
 */
public class ThreadLocalTest {
	//如果需要多个变量跟当前线程线程相关时,把多个变量定义在一个对象中
    private static ThreadLocal<OperatorData> myThreadData = new ThreadLocal<OperatorData>();
    public static void main(String[] args) {
		for(int i = 0; i < 2; i++){
			final int k = i;
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					
					OperatorData threadData = new OperatorData();
					threadData.setName("zhangsan" + k);
					threadData.setAge(k);
					threadData.setSex(k + "");
					myThreadData.set(threadData);
					
				}
			}).start();
			
		}

	}
}
/**
 * 
 * @author 
 * @description 将线程要操作的数据封装到一个对象中
 */
class OperatorData{
	private String name;
	private String sex;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

第二种方式:

/**
 * @author
 * @date 2017年4月16日下午3:46:41
 * @description 线程范围内的共享对象如何设计
 */
public class ThreadLocalTest {
    public static void main(String[] args) {
		for(int i = 0; i < 2; i++){
			final int k = i;
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					OperatorData threadData = OperatorData.getInstance();
					threadData.setName("zhangsan" + k);
					threadData.setAge(k);
					threadData.setSex(k + "");
					
				}
			}).start();
			
		}

	}
}
/**
 * 
 * @author 
 * @description 将线程要操作的数据封装到一个对象中
 */
class OperatorData{
	private String name;
	private String sex;
	private int age;
	//模仿单列的写法
	private OperatorData(){};
	private static ThreadLocal<OperatorData> myThreadDataLocal = new ThreadLocal<OperatorData>();
	public static OperatorData getInstance(){
		OperatorData instance = myThreadDataLocal.get();
		if(instance == null){
			instance = new OperatorData();
			myThreadDataLocal.set(instance);
		}
		return instance;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

分享到:
评论

相关推荐

    java多线程安全性基础介绍.pptx

    多个线程操作共享对象导致的状态不一致问题 原因 共享资源的竞态条件问题 问题 竞态条件 指令重排序 工作内存中主内存同步延迟 解决 要有安全策略文档或注释 不共享 线程封闭 仅在单线程内访问数据 栈...

    Java并发编程实战

    3.5.6 安全地共享对象 第4章 对象的组合 4.1 设计线程安全的类 4.1.1 收集同步需求 4.1.2 依赖状态的操作 4.1.3 状态的所有权 4.2 实例封闭 4.2.1 Java监视器模式 4.2.2 示例:车辆追踪 4.3 线程安全性的...

    java线程学习笔记

    2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...

    Java 并发编程实战

    3.5.6 安全地共享对象 第4章 对象的组合 4.1 设计线程安全的类 4.1.1 收集同步需求 4.1.2 依赖状态的操作 4.1.3 状态的所有权 4.2 实例封闭 4.2.1 Java监视器模式 4.2.2 示例:车辆追踪 4.3 线程安全性的...

    Java并发编程(学习笔记).xmind

    加锁机制、用锁保护状态、实现共享访问 锁的不恰当使用可能会引起程序性能下降 对象的共享使用策略 线程封闭:线程封闭的对象只能由一个线程拥有并修改 Ad-hoc线程封闭 栈封闭 ThreadLocal...

    Flask核心机制之上下文源码剖析

    一、前言 了解过flask的python开发者想必都知道flask中核心机制莫过于上下文管理,当然学习flask... python中的threading.local对象已经实现,其原理是利用线程的唯一标识作为key,数据作为value来保存其自己的数据,以

    java抢票软件源码-interview:java面试题整理

    java抢票软件源码 中高级java面试题整理 一 前端 ...解答: get和post的基本区别?说说 tcp/ip协议、三次握手、窗口滑动机制 解答: ...基本类型数据使用快速排序法,对象数组使用归并...ThreadLocal可以用来共享数据吗; Threa

    Spring-Reference_zh_CN(Spring中文参考手册)

    共享常见的切入点(pointcut)定义 6.2.3.4. 示例 6.2.4. 声明通知 6.2.4.1. 前置通知(Before advice) 6.2.4.2. 返回后通知(After returning advice) 6.2.4.3. 抛出后通知(After throwing advice) 6.2.4.4. ...

    互联网创意产品众筹平台

    │ 02-ThreadLocal解决线程资源共享 │ 03-弹层组件layer使用. [- l; o" [6 F# U# ~. a7 c │ 04-用户分页查询-分析-同步请求方式 │ 05-用户分页查询-分析-同步请求代码开发 │ 06-用户分页查询-分页导航条# a1 W7 ...

    JAVA核心知识点整理(有效)

    2.2.4. 堆(Heap-线程共享)-运行时数据区 ...................................................................................... 23 2.2.5. 方法区/永久代(线程共享) ............................................

    java核心知识点整理.pdf

    堆(Heap-线程共享)-运行时数据区 ...................................................................................... 23 2.2.5. 方法区/永久代(线程共享) ..................................................

Global site tag (gtag.js) - Google Analytics