/**
* 线程范围类的数据共享
* 核心: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的更多相关文章

  1. java 多线程 day05 线程范围内的数据共享

    import java.util.HashMap;import java.util.Map;import java.util.Random;/** * Created by chengtao on 1 ...

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

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

  3. 线程范围内的环境变量---ThreadLocal

    package cn.itcast.heima2; import java.util.HashMap; import java.util.Map; import java.util.Random; p ...

  4. 优雅的设计单线程范围内的数据共享(ThreadLocal)

    单线程范围内数据共享使用ThreadLocal /** * @Description TODO * @author zhanghw@chinatelecom.cn * @since 2015年12月1 ...

  5. JAVA多线程提高三:线程范围内共享变量&ThreadLocal

    今天我们学习的是如何在线程自己的范围内达到变量数据的共享,而各个线程之间又是互相独立开来,各自维护的,即我们说的ThreadLocal的作用. 一.概念 可以将每个线程用到的数据与对应的线程号存放到一 ...

  6. JAVA多线程学习五:线程范围内共享变量&ThreadLocal

    一.概念 可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据,就可以实现线程范围内共享相同的变量. 二.代码 Runnable中的run( ...

  7. Java中的线程--线程范围内共享数据

    接着学习Java中的线程,线程范围内的共享数据! 一.线程范围内的数据共享定义 对于相同的程序代码,多个模块在同一个线程中共享一份数据,而在另外线程中运行时又共享另外一份数据. 共享数据中存在的问题, ...

  8. 线程系列4--Java线程范围内的共享数据(一)

    这张图片是我看传智播客的视频时的截屏,这个图片很直观的展示了线程范围内的数据共享.当同一个线程在执行三个不同业务模块时,这三个业务模块访问的数据是共享的.更直白的说,当一个执行线索在穿个每个业务模块时 ...

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

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

随机推荐

  1. Mac环境下配置Tomcat+Eclipse

    下载Tomcat 首先在 Tomcat官方网站 找到自己合适的版本,下载 tar.gz 版本的,下载完成后解压缩到一个目录,进入这个目录下的 bin 执行 startup.sh,如果看到下面的界面,表 ...

  2. SVG.js 基础图形绘制整理(一)

    一.矩形 //指定width和height 画矩形 //返回rect对象 var draw = SVG('svg1').size(300, 300); var rect = draw.rect(100 ...

  3. Three.js中如何显示帧速【转】

    https://blog.csdn.net/hannahlwh1988/article/details/36876295 Step1:src中添加: <script src="js/s ...

  4. gradlew 命令行 build 调试 构建错误 Manifest merger failed MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. js面向对象之继承-原型继承

    //animal 父类 超类 var Animal = function(name) { this.name = name; this.sayhello = function() { alert(&q ...

  6. SQL 2008 R2 收缩日志,不用修改简单模式

    BACKUP LOG jmd8 TO DISK = N'C:\jmd8_20140429014500.trn' WITH NOREWIND, NOUNLOAD USE [JMD8]GODBCC SHR ...

  7. C++ 学习路线和看法

    C++ 学习路线和看法 原文地址:http://shundacao.blog.163.com/blog/static/1340404812010101982751101/     C++大体分为C++ ...

  8. 大数据开发实战:Hive表DDL和DML

    1.Hive 表 DDL 1.1.创建表 Hive中创建表的完整语法如下: CREATE [EXTERNAL] TABLE [IF NOT EXISTS]  table_name [ (col_nam ...

  9. 梯度消失(vanishing gradient)与梯度爆炸(exploding gradient)问题

    (1)梯度不稳定问题: 什么是梯度不稳定问题:深度神经网络中的梯度不稳定性,前面层中的梯度或会消失,或会爆炸. 原因:前面层上的梯度是来自于后面层上梯度的乘乘积.当存在过多的层次时,就出现了内在本质上 ...

  10. mysql的水平拆分和垂直拆分 (转)

    http://www.cnblogs.com/sns007/p/5790838.html 1,水平分割: 例:QQ的登录表.假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这1 ...