4、线程范围内的数据共享之ThreadLocal
1 /** 2 * 线程范围类的数据共享 3 * 核心:ThreadLocal类 4 * 实际场景: 5 * Hibernate的getCurrentSession方法,就是从线程范围内获取存在的session,如果不存在则新建一个并绑定到线程上 6 * struts将一个请求里的所有参数绑定到一个线程范围内的对象里 7 * @author yzl 8 * 9 */ 10 public class ThreadPart_4 { 11 public static void main(String[] args) { 12 new Thread(new Runnable() { 13 public void run() { 14 MyThreadLocalObj obj = MyThreadLocalObj.getInstance(); 15 while(obj.getData()<20){ 16 obj.add(); 17 System.out.println(Thread.currentThread().getName() + " after add method value :" + obj.getData()); 18 //这里操作其实就是同一个MyThreadLocalObj对象 19 new MyAdd().add(); 20 System.out.println(Thread.currentThread().getName() + " after MyAdd add method value :" + obj.getData()); 21 try { 22 Thread.sleep(1000); 23 } catch (InterruptedException e) { 24 e.printStackTrace(); 25 } 26 } 27 } 28 }).start(); 29 30 new Thread(new Runnable() { 31 public void run() { 32 MyThreadLocalObj obj = MyThreadLocalObj.getInstance(); 33 while(obj.getData()>0){ 34 obj.sub(); 35 System.out.println(Thread.currentThread().getName() + " after sub method value :" + obj.getData()); 36 //这里操作其实就是同一个MyThreadLocalObj对象 37 new MySub().sub(); 38 System.out.println(Thread.currentThread().getName() + " after MySub sub method value :" + obj.getData()); 39 try { 40 Thread.sleep(1000); 41 } catch (InterruptedException e) { 42 e.printStackTrace(); 43 } 44 } 45 } 46 }).start(); 47 } 48 } 49 50 class MyAdd{ 51 public void add(){ 52 MyThreadLocalObj.getInstance().add(); 53 } 54 } 55 56 class MySub{ 57 public void sub(){ 58 MyThreadLocalObj.getInstance().sub(); 59 } 60 } 61 62 /** 63 * 单例模式下的 64 * 线程范围内共享 65 * 线程范围外互不影响 66 * @author yzl 67 * 68 */ 69 class MyThreadLocalObj{ 70 private int data = 10; 71 72 public void add(){ 73 data++; 74 } 75 76 public void sub(){ 77 data--; 78 } 79 80 private MyThreadLocalObj(){}; 81 private static ThreadLocal<MyThreadLocalObj> local = new ThreadLocal<MyThreadLocalObj>(); 82 83 84 public static MyThreadLocalObj getInstance(){ 85 if(local.get() == null){ 86 local.set(new MyThreadLocalObj()); 87 } 88 return local.get(); 89 } 90 91 public int getData() { 92 return data; 93 } 94 }
运行结果:
不同线程操作的对象不是同一个,同一个线程操作的是同一个
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 5 Thread-1 after sub method value :7 6 Thread-0 after add method value :13 7 Thread-1 after MySub sub method value :6 8 Thread-0 after MyAdd add method value :14 9 Thread-1 after sub method value :5 10 Thread-0 after add method value :15 11 Thread-1 after MySub sub method value :4 12 Thread-0 after MyAdd add method value :16 13 Thread-0 after add method value :17 14 Thread-1 after sub method value :3 15 Thread-0 after MyAdd add method value :18 16 Thread-1 after MySub sub method value :2 17 Thread-0 after add method value :19 18 Thread-0 after MyAdd add method value :20 19 Thread-1 after sub method value :1 20 Thread-1 after MySub sub method value :0
转载于:https://www.cnblogs.com/yangzhilong/p/4780751.html
4、线程范围内的数据共享之ThreadLocal相关推荐
- 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)
ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...
- 线程范围内的数据共享
1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码不同,这时候需要用不同的Runna ...
- ThreadLocal线程范围内的共享变量
模拟ThreadLocal类实现:线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程. package com.ljq.test.thread;import java.util.Hash ...
- Java多线程——线程范围内共享变量和ThreadLocal
多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...
- Java高并发编程:线程范围内共享数据
笔记摘要 所谓线程范围内共享数据,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据,API中为我们提供了一个操作线程范围内共享数据的类Threa ...
- Java实现并发线程中线程范围内共享数据
---恢复内容开始--- 利用Map,HashMap键值对的数据结构,实现并发线程中线程范围内数据共享. package cn.qy.heima2;import java.util.HashMap; ...
- 多线程学习(四)-线程范围内共享数据
一:线程范围内共享数据: 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这时候需要 ...
- 获取返回值作为变量_解决多线程间共享变量线程安全问题的大杀器——ThreadLocal...
微信公众号:Zhongger 我是Zhongger,一个在互联网行业摸鱼写代码的打工人! 关注我,了解更多你不知道的[Java后端]打工技巧.职场经验等- 上一期,讲到了关于线程死锁.用户进程.用户线 ...
- 高并发的epoll+线程池,epoll在线程池内
epoll是linux下高并发服务器的完美方案,因为是基于事件触发的,所以比select快的不只是一个数量级. 单线程epoll,触发量可达到15000,但是加上业务后,因为大多数业务都与数据库打交道 ...
最新文章
- 艺考可以报考清华的计算机系吗,考中传的人太多?艺考生或许可以考虑一下清华、浙大...
- 9个技巧让你的PyTorch模型训练变得飞快!
- 测试眉形的有哪个软件_心理测试:你的眉形是下面的哪种?测你生来命运如何!超准...
- 每天一道LeetCode-----判断给定字符串是否符合某个模式
- 基于GCCAVR的TLC2543读写程序----模拟SPI方式实现
- ubuntu安装sublime3并配置python3环境
- 【iCore3 双核心板_ uC/OS-III】例程二:任务的建立与删除
- web安全day48:session和cookie、同源策略的初步理解
- 断开所有sql用户连接(转)
- Linux vip地址通信原理,IPv6的组播地址(掌握IPv6通信原理的关键知识点)
- Java for循环的几种用法详解(转载)
- 中奖人js滚动效果_jQuery教程 如何实现中奖人员信息向上滚动
- from scipy.misc import comb ImportError: cannot import name comb
- laravel中faker的方法总结
- C# 的1ms延时函数
- Linux个人机器使用465发送邮件
- web测试 (四)兼容性测试
- buildroot快速入门
- 如何搭建一个公链?公链生态“吸金“七件套,缺一不可
- python贪心算法最短路径_dijkstra算法(贪心算法)——解决最短路径问题