4、线程范围内的数据共享之ThreadLocal
/**
* 线程范围类的数据共享
* 核心: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
4、线程范围内的数据共享之ThreadLocal的更多相关文章
- java 多线程 day05 线程范围内的数据共享
import java.util.HashMap;import java.util.Map;import java.util.Random;/** * Created by chengtao on 1 ...
- 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)
ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...
- 线程范围内的环境变量---ThreadLocal
package cn.itcast.heima2; import java.util.HashMap; import java.util.Map; import java.util.Random; p ...
- 优雅的设计单线程范围内的数据共享(ThreadLocal)
单线程范围内数据共享使用ThreadLocal /** * @Description TODO * @author zhanghw@chinatelecom.cn * @since 2015年12月1 ...
- JAVA多线程提高三:线程范围内共享变量&ThreadLocal
今天我们学习的是如何在线程自己的范围内达到变量数据的共享,而各个线程之间又是互相独立开来,各自维护的,即我们说的ThreadLocal的作用. 一.概念 可以将每个线程用到的数据与对应的线程号存放到一 ...
- JAVA多线程学习五:线程范围内共享变量&ThreadLocal
一.概念 可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据,就可以实现线程范围内共享相同的变量. 二.代码 Runnable中的run( ...
- Java中的线程--线程范围内共享数据
接着学习Java中的线程,线程范围内的共享数据! 一.线程范围内的数据共享定义 对于相同的程序代码,多个模块在同一个线程中共享一份数据,而在另外线程中运行时又共享另外一份数据. 共享数据中存在的问题, ...
- 线程系列4--Java线程范围内的共享数据(一)
这张图片是我看传智播客的视频时的截屏,这个图片很直观的展示了线程范围内的数据共享.当同一个线程在执行三个不同业务模块时,这三个业务模块访问的数据是共享的.更直白的说,当一个执行线索在穿个每个业务模块时 ...
- ThreadLocal线程范围内的共享变量
模拟ThreadLocal类实现:线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程. package com.ljq.test.thread; import java.util.Has ...
随机推荐
- 利用js实现 禁用浏览器后退 浏览器返回
现在很多的内部系统,一些界面,都是用户手动点击退出按钮的.但是为了避免,用户误操作 点击浏览器后退,或者用鼠标手势后退什么的.容易出现误操作. 所以在有些页面上,适当的禁用浏览器的后退, ...
- Understanding Linux CPU stats
Your Linux server is running slow, so you follow standard procedure and run top. You see the CPU met ...
- SQL Server 数据库项目
ylbtech-.NET Framework: SQL Server 数据库项目 SQL Server 数据库项目 类型:SQL Server 用于创建 SQL Server 数据库的项目 1. 新建 ...
- uva 331 Mapping the Swaps 求交换排序的map 纯DFS
给出一个序列,每次交换两个数,求有几种交换方法能使序列变成升序. n不大于5,用dfs做. 代码: #include <cstdio> #include <cstring> # ...
- Octave环境的安装
Octave是一种解释类的编程语言,并且是GNU项目下的开源软件,与之相对是大家都非常熟悉的matlab,Octave和matlab语法基本上一致,都是用来快速做一些强大的矩阵运算来使用的,最大的不同 ...
- Android 混合式开发AppCan介绍
Android程序员开发已从最早的异常火热到现在已经逐渐趋向稳定,目前企业针对Android开发工程师的要求要求已逐步提高,现在想从众多的面试者中脱颖而出,必须打好坚实的代码基础. 今天为大家介绍一款 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(一)VMW安装四台CentOS,并实现本机与它们能交互,虚拟机内部实现可以上网。
使用VMW安装四台CentOS-7-x86_64-DVD-1804.iso虚拟机: 计划配置三台centos虚拟机: master:192.168.0.120 slave1:192.168.0.121 ...
- WordPress 获取指定分类ID的分类信息
get_term:直接从数据库中获取分类信息get_the_category:使用post_id作为参数,先根据post_id查询对应的文章然后再返回对应的分类信息,如果没有文章信息则返回Null 之 ...
- unity中使用自定义shader进行光照贴图烘培无法出现透明度的坑爹问题
最近开发中在对场景进行光照贴图烘焙时发现一个坑爹问题,在使用自定义shader的时候,shader命名中必须包含Transparent路径,否则烘焙的时候不对alpha通道进行计算,烘焙出来都是狗皮膏 ...
- 《数字图像处理原理与实践(MATLAB版)》一书之代码Part1
本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part1(P1~42).代码运行结果请參见原书配图. P20 I = imread('lena.jpg');BW1 = ...