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相关推荐

  1. 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)

    ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...

  2. 线程范围内的数据共享

    1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码不同,这时候需要用不同的Runna ...

  3. ThreadLocal线程范围内的共享变量

    模拟ThreadLocal类实现:线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程. package com.ljq.test.thread;import java.util.Hash ...

  4. Java多线程——线程范围内共享变量和ThreadLocal

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...

  5. Java高并发编程:线程范围内共享数据

    笔记摘要 所谓线程范围内共享数据,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据,API中为我们提供了一个操作线程范围内共享数据的类Threa ...

  6. Java实现并发线程中线程范围内共享数据

    ---恢复内容开始--- 利用Map,HashMap键值对的数据结构,实现并发线程中线程范围内数据共享. package cn.qy.heima2;import java.util.HashMap; ...

  7. 多线程学习(四)-线程范围内共享数据

    一:线程范围内共享数据: 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这时候需要 ...

  8. 获取返回值作为变量_解决多线程间共享变量线程安全问题的大杀器——ThreadLocal...

    微信公众号:Zhongger 我是Zhongger,一个在互联网行业摸鱼写代码的打工人! 关注我,了解更多你不知道的[Java后端]打工技巧.职场经验等- 上一期,讲到了关于线程死锁.用户进程.用户线 ...

  9. 高并发的epoll+线程池,epoll在线程池内

    epoll是linux下高并发服务器的完美方案,因为是基于事件触发的,所以比select快的不只是一个数量级. 单线程epoll,触发量可达到15000,但是加上业务后,因为大多数业务都与数据库打交道 ...

最新文章

  1. 艺考可以报考清华的计算机系吗,考中传的人太多?艺考生或许可以考虑一下清华、浙大...
  2. 9个技巧让你的PyTorch模型训练变得飞快!
  3. 测试眉形的有哪个软件_心理测试:你的眉形是下面的哪种?测你生来命运如何!超准...
  4. 每天一道LeetCode-----判断给定字符串是否符合某个模式
  5. 基于GCCAVR的TLC2543读写程序----模拟SPI方式实现
  6. ubuntu安装sublime3并配置python3环境
  7. 【iCore3 双核心板_ uC/OS-III】例程二:任务的建立与删除
  8. web安全day48:session和cookie、同源策略的初步理解
  9. 断开所有sql用户连接(转)
  10. Linux vip地址通信原理,IPv6的组播地址(掌握IPv6通信原理的关键知识点)
  11. Java for循环的几种用法详解(转载)
  12. 中奖人js滚动效果_jQuery教程 如何实现中奖人员信息向上滚动
  13. from scipy.misc import comb ImportError: cannot import name comb
  14. laravel中faker的方法总结
  15. C# 的1ms延时函数
  16. Linux个人机器使用465发送邮件
  17. web测试 (四)兼容性测试
  18. buildroot快速入门
  19. 如何搭建一个公链?公链生态“吸金“七件套,缺一不可
  20. python贪心算法最短路径_dijkstra算法(贪心算法)——解决最短路径问题

热门文章

  1. pstools psexec 执行文件
  2. VC控件 Edit Control
  3. 使用OpenSSL进行RSA加密和解密(非对称)
  4. shared_ptr和new结合使用的几个简单例子
  5. python3 测试函数的一个例子
  6. c++ find_last_of 函数应用一个例子
  7. mysql字段说明_mysql 字段类型说明
  8. linux下使用VS CODE + CMAKE 调试C++程序
  9. 概率论-4.2 中心极限定理
  10. 利用SoapUI 测试web service的方法介绍