/**
* 线程范围类的数据共享
* 核心: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. Swift编程语言学习1.7——断言

    断言 可选能够让你推断值是否存在,你能够在代码中优雅地处理值缺失的情况.然而,在某些情况下,假设值缺失或者值并不满足特定的条件,你的代码可能并不须要继续执行.这时.你能够在你的代码中触发一个断言(as ...

  2. wamp设置自定义域名访问php网站

    wamp是一个在window系统下很不错的php开发套件,一般我都是使用此套件在本地进行开发和测试的 特别是alias功能特别好,可以同时开发N个php网站而不互相影响 但alias有一个问题,它其实 ...

  3. MongoDB server side Javascript 如何直接传入字符串?

    MongoDB server side Javascript的介绍如下: https://docs.mongodb.com/v3.0/core/server-side-javascript/#runn ...

  4. 关于ThinkPHP的一些编程技巧

    在TP学习过程中难免会遇到一些大大小小的问题,把这些问题积累下来就可以在以后遇到时能很快速的解决,提高编程效率. 1.让Runtime下的文件格式化:入口文件处:define(‘STRIP_RUNTI ...

  5. jdbc:initialize-database标签的研究

    在spring的applicationContext.xml中如果引入了:<?xml version="1.0" encoding="UTF-8"?> ...

  6. SQL还原后:目录名称无效

    使用Sql Server备份文件,还原数据库出现如下错误:目录名称无效 解决方法:在系统临时文件夹内,如C:\Users\Administrator\AppData\Local\Temp\ 下新建名称 ...

  7. Linux中10个有用的命令行补齐命令

    本文转自GeekFan,感觉确实比较极客范啊,[TAB][TAB]补全都知道,但是你知道可以定制化补全吗? ---------------------------------------------- ...

  8. iOS 按钮拖动。

    -(void)testMove { moveBtn = [[UIButton alloc ]init]; moveBtn.frame = CGRectMake(0, 30, 60, 60); move ...

  9. ACCESS和MSSQL-如何随机读取数据库记录

    查询语句只要这样写,就可以随机取出记录了 SQL="Select top 6 * from Dv_bbs1 where isbest = 1 and layer = 1 order by n ...

  10. APP测试体系

    网上找的图片,总结的很好: