/**
* 线程范围内的数据共享
*
* 应用场景:减少库存量,增加流水账和修改总账 ,这几个操作要在同一个事务中, 事务需要放在线程范围内
*
*
* @time 上午10:10:13
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
public class ThreadLocalTest {
/**
* @param args
*/
public static void main(String[] args) {
final A a = new A();
final B b = new B();
for (int i = 0; i < 5; i++) {
new Thread() {
@Override
public void run() {
// MyThreadLocalData.set(new Random().nextInt(10000));
// System.out.println(Thread.currentThread() + ":has put " +
// MyThreadLocalData.get());
// a.say();
// b.sayHello();
MyThreadLocalData.getMyThreadLocalInstance().setNum(new Random().nextInt(10000));
System.out.println(Thread.currentThread() + ":has put " + MyThreadLocalData.getMyThreadLocalInstance().getNum());
a.say();
b.sayHello();
MyThreadLocalData.clear();
}
}.start();
}
}
}
/**
* 存放全局变量
*
* @time 上午10:27:49
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
class MyThreadLocalData {
/*
* private static ThreadLocal tl = new ThreadLocal();
*
* public static Object get() { return tl.get(); }
*
* public static void set(Object value) { tl.set(value); }
*/
private static ThreadLocal instanceContainer = new ThreadLocal();
/**
* 构造器
*/
private MyThreadLocalData() {
}
/**
* 单例
*
* @return
*/
public static MyThreadLocalData getMyThreadLocalInstance() {
MyThreadLocalData instance = (MyThreadLocalData) instanceContainer.get();
if (null == instance) {
instance = new MyThreadLocalData();
instanceContainer.set(instance);
}
return instance;
}
/**
* 清除
*/
public static void clear() {
instanceContainer.remove();
}
private Integer x;
public void setNum(Integer x) {
this.x = x;
}
public Integer getNum() {
return x;
}
}
class A {
public void say() {
// System.out.println(Thread.currentThread() + ":A has geted " +
// MyThreadLocalData.get());
System.out.println(Thread.currentThread() + ":A has geted " + MyThreadLocalData.getMyThreadLocalInstance().getNum());
}
}
class B {
public void sayHello() {
// System.out.println(Thread.currentThread() + ":B has geted " +
// MyThreadLocalData.get());
System.out.println(Thread.currentThread() + ":B has geted " + MyThreadLocalData.getMyThreadLocalInstance().getNum());
}
}
分享到:
相关推荐
多线程学习笔记,通过平时的学习所做的一些笔记,希望对广大同仁有所帮助
多线程学习笔记...多线程学习笔记...多线程学习笔记...多线程学习笔记...
java学习笔记2(多线程)java学习笔记2(多线程)
NULL 博文链接:https://baobeituping.iteye.com/blog/1190260
多线程学习笔记,好资源。包括线程基础等知识多线程学习笔记,好资源。包括线程基础等知识
多线程 学习笔记.md
Python3的多线程学习笔记[定义].pdf
多线程学习笔记,关于创建线程,删除线程等相关指令的应用。
UNIX多线程学习笔记.docx 第一节 概述 第二节 线程 第三节 互斥锁 第四节 条件变量 第五节 线程的私有数据 第六节 Posix有名信号灯 第七节 共享内存
Java 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...
这篇文档和对应的源代码 博文链接:https://interper56-sohu-com.iteye.com/blog/172303
线程的基本概念 线程的创建和启动 线程的调度和优先级 线程的状态控制 线程同步
Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...
JAVA多线程学习笔记整理(csdn)————程序
java多线程学习笔记02(csdn)————程序
四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 13 Java线程:线程的调度-优先级 16 Java线程:线程的...
Posix多线程编程学习笔记,包含多线程编程的众多知识
这是本人学习C++过程中积累的知识,对于学习多线程的同学有很好的参考作用。笔记精简,但叙述清楚。比看书长篇大论效率更高。这是第一份笔记,以后陆续上传。
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....