package com.cn.gbx;

import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask; public class TestThread {
static class A{
public void get() {
User user = User.getInstance();
System.out.println("A from " + Thread.currentThread().getName() + " get data:" + user.getName() + " : " + user.getPassword());
}
}
static class B{
public void get(){
User user = User.getInstance();
System.out.println("B from " + Thread.currentThread().getName() + " get data:" + user.getName() + " : " + user.getPassword());
}
}
public static void main(String[] args) {
for (int i = 0; i < 2; ++i) {
new Thread(
new Runnable() {
@Override
public void run() {
int data = new Random().nextInt();
System.out.println(Thread.currentThread().getName() + " : data = " + data);
User.getInstance().setName("name:" + data);
User.getInstance().setPassword("p:" + data);
new A().get();
new B().get();
//A,B 模块得到的都是与本线程相关联的数据, 例如数据库connection等等
}
}
).start();
}
}
} class User{ //类似单例的懒汉模式 其实ThreadLocal 就是一个Map只不过是自动将key设为本地线程
private static ThreadLocal<User> threadLocal = new ThreadLocal<User>();
private User() {}
public static User getInstance() {
User user = threadLocal.get();
if (user == null) {
user = new User();
threadLocal.set(user);
}
return user;
} private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
输出: Thread-1 : data = 1362065454
Thread-0 : data = 1208952694
A from Thread-0 get data:name:1208952694 : p:1208952694
A from Thread-1 get data:name:1362065454 : p:1362065454
B from Thread-1 get data:name:1362065454 : p:1362065454
B from Thread-0 get data:name:1208952694 : p:1208952694

  

ThreadLocal 实现线程内共享变量的更多相关文章

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

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

  2. Java多线程——线程范围内共享变量

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

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

    一.如何理解线程范围内共享数据 1.static int num=0; 2.线程1访问num变量,并设置为num=2:线程2访问num变量,并设置为num=3: 3.当线程1中对象A.B.C 在访问线 ...

  4. JAVA 并发编程-线程范围内共享变量(五)

    线程范围内共享变量要实现的效果为: 多个对象间共享同一线程内的变量 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsi ...

  5. 并发库应用之一 & ThreadLocal实现线程范围的共享变量

    ThreadLocal用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据. 每个线程调用全局ThreadLocal对象的 ...

  6. 多线程篇四:ThreadLocal实现线程范围内变量共享

    1.static实现线程范围内变量共享 package com.test.shareData; import java.util.Random; /** * 多线程范围内的数据共享 * @author ...

  7. ThreadLocal解决线程安全问题

    一.线程安全问题产生的原因 线程安全问题都是由全局变量及静态变量引起的 二.线程安全问题 SimpleDateFormate sdf = new SimpleDateFormat();使用sdf.pa ...

  8. ThreadLocal本地线程变量的理解

     一般的Web应用划分为展现层.服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用.在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程.       ...

  9. ThreadLocal(线程本地存储)

    1. ThreadLocal,即线程本地变量或线程本地存储. threadlocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的 ...

随机推荐

  1. JS 动态加载脚本 执行回调_转

    关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解 ...

  2. 坑爹的SQL ISNUMERIC

    select ISNUMERIC('01,02') ISNUMERIC返回 1,后面用patindex代替了...折腾/ select patindex('%[^0-9]%','01,02')

  3. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.7.搜索过滤数据

    1 基础 搜索和过滤功能,是使用确定的条件,查找匹配行数据.jqGrid提供几种搜索模式: Search Dialog 单搜索选项 Search Dialog 多搜索选项 ToolBar Search ...

  4. hdwiki中模板的使用说明

    HDwiki所有模版文件都在根目录view下的default文件里,以admin_开头的是后台的模版文件,其它不是以admin_开头的,就是所有的前台文件.具体列表如下:首页模版文件:  index. ...

  5. 20145227 《Java程序设计》实验四实验报告

    20145227 <Java程序设计>实验四实验报告 实验内容 安装Andriod Studio并配置软件 使用Andriod Studio软件实现Hello World的小程序 实验步骤 ...

  6. SpringMVC 接收ajax发送的数组对象

    本文粘贴自:http://my.oschina.net/jiefalcon/blog/384153?fromerr=24Lewn46 [转]SpringMVC @RequestBody接收Json对象 ...

  7. 使用System.arraycopy()实现数组之间的复制

    System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制. 其函数原型是: public static void arraycopy(Object src, int s ...

  8. Python 字典(Dictionary)

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: d = ...

  9. YTU 2296: KMP模式匹配 二(串)

    2296: KMP模式匹配 二(串) 时间限制: 1 Sec  内存限制: 128 MB 提交: 29  解决: 17 题目描述 输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成 ...

  10. Wall(凸包POJ 1113)

    Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32360 Accepted: 10969 Description On ...