4、线程范围内的数据共享之ThreadLocal
2015-09-03 21:24
531 查看
/** * 线程范围类的数据共享 * 核心:ThreadLocal类 * 实际场景: * Hibernate的getCurrentSession方法,就是从线程范围内获取存在的session,如果不存在则新建一个并绑定到线程上 * struts将一个请求里的所有参数绑定到一个线程范围内的对象里 * @author yzl * */ public class ThreadPart_4 { public static void main(String[] args) { new Thread(new Runnable() { public void run() { MyThreadLocalObj obj = MyThreadLocalObj.getInstance(); while(obj.getData()<20){ obj.add(); System.out.println(Thread.currentThread().getName() + " after add method value :" + obj.getData()); //这里操作其实就是同一个MyThreadLocalObj对象 new MyAdd().add(); System.out.println(Thread.currentThread().getName() + " after MyAdd add method value :" + obj.getData()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { public void run() { MyThreadLocalObj obj = MyThreadLocalObj.getInstance(); while(obj.getData()>0){ obj.sub(); System.out.println(Thread.currentThread().getName() + " after sub method value :" + obj.getData()); //这里操作其实就是同一个MyThreadLocalObj对象 new MySub().sub(); System.out.println(Thread.currentThread().getName() + " after MySub sub method value :" + obj.getData()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } } class MyAdd{ public void add(){ MyThreadLocalObj.getInstance().add(); } } class MySub{ public void sub(){ MyThreadLocalObj.getInstance().sub(); } } /** * 单例模式下的 * 线程范围内共享 * 线程范围外互不影响 * @author yzl * */ class MyThreadLocalObj{ private int data = 10; public void add(){ data++; } public void sub(){ data--; } private MyThreadLocalObj(){}; private static ThreadLocal<MyThreadLocalObj> local = new ThreadLocal<MyThreadLocalObj>(); public static MyThreadLocalObj getInstance(){ if(local.get() == null){ local.set(new MyThreadLocalObj()); } return local.get(); } public int getData() { return data; } }
运行结果:
不同线程操作的对象不是同一个,同一个线程操作的是同一个
1 Thread-0 after add method value :11 2 Thread-1 after sub method value :9 3 Thread-0 after MyAdd add method value :12 4 Thread-1 after MySub sub method value :8 Thread-1 after sub method value :7 Thread-0 after add method value :13 Thread-1 after MySub sub method value :6 Thread-0 after MyAdd add method value :14 Thread-1 after sub method value :5 Thread-0 after add method value :15 Thread-1 after MySub sub method value :4 Thread-0 after MyAdd add method value :16 Thread-0 after add method value :17 Thread-1 after sub method value :3 Thread-0 after MyAdd add method value :18 Thread-1 after MySub sub method value :2 Thread-0 after add method value :19 Thread-0 after MyAdd add method value :20 Thread-1 after sub method value :1 Thread-1 after MySub sub method value :0
相关文章推荐
- NOIP2014解方程
- iOS开发问题之the file “XXX” could not be opened because you don't have permission to view it
- C语言hash函数
- 编写一个方法,找出给定字符串的位置。
- 反射部分学习
- USACO 1.3 Mixing Milk
- python list元素为dict时的排序
- iOS 9.0 随机数
- MyEclipse10.x添加jadClipse反编译插件
- 随时随地笔记“好学”全程实践(零) - 简介及目录
- J2SE大完结
- Linux 硬限制和软限制 http://www.52ml.net/2624.html
- hdu 2222 Keywords Search (ac自动机)
- 2015暑期多校训练第一场 1,2,3
- php大力力 [045节] 兄弟连高洛峰 PHP教程 2014年[已发布,点击下载]
- hihoCoder #1162 : 骨牌覆盖问题·三 (矩阵快速幂,DP)
- HTTP 状态码的完整列表
- 关于结构体的操作符重载和定义在内部的函数
- 继承中的构造方法
- Python