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 ...
随机推荐
- ARM、X86/Atom、MIPS、PowerPC
关注Android的时候,有一些CPU架构方面的术语知识,主要有:ARM.X86/Atom.MIPS.PowerPC1)ARM/MIPS/PowerPC均是基于精简指令集(RISC,Reduced I ...
- textrank的方法,大概懂了
https://www.cnblogs.com/clover-siyecao/p/5726480.html 介绍了textrank. 不过我觉得对于长文本,textrank才有用些.短文本的话,估计没 ...
- LeetCode题解:Rotate List
Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. For exa ...
- Libxml2函数及使用方法概述【转】
https://blog.csdn.net/chengwenyao18/article/details/7176082 一.关于XML: 在开始研究 Libxml2 库之前,先了解一下XML的相关基础 ...
- Round() 四舍五入 js银行家算法
首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下: var b = 0.825; ...
- sda, sdb, sdc, sda1, sda2在Linux中都代表什么
意义如下: 第一个软驱 /dev/fd0. 第二个软驱 /dev/fd1. 第一块硬盘 /dev/sda. 第二块硬盘 /dev/sdb, 以此类推. 第一个SCSI CD-ROM /dev/scd0 ...
- Spring Boot 直接用jar运行项目
概述 在Spring Boot 开篇-创建和运行一文中,介绍了如何创建一个Sprint Boot项目并且运行起来.但是运行的方式是在IDEA中直接Run起来的.还有另一中方式可以可以把Spring B ...
- distinct 多列详解
1.distinct单列 select distinct(a) from tableA; 2.distinct多列 select distinct a,b,c from tableA; 注意此时是将a ...
- 'Newtonsoft.Json' already has a dependency defined for 'NETStandard.Library'
安装NEST的时候报了如下的错误: PM> Install-Package NEST Attempting to resolve dependency 'Elasticsearch.Net (≥ ...
- Tomcat下设置项目为默认项目
项目的实际使用中常常须要将当前项目设为tomcat的默认项目,而不是进入到tomcat的页面,有几种方法能够实现,注意另外一种.第三种情况须要先删除webapps下的ROOT文件夹,否则会失败. 一. ...