- 浏览: 120235 次
- 性别:
- 来自: 地球
文章分类
最新评论
-
754731046:
很适合对初学者适用,谢谢
Oracle存储过程详解 -
天明破晓:
我测试了,不好用
Java中的正则表达式验证各种电话号码 -
OracleX:
otom31 写道从来不用标签库,几乎不用struts,除了最 ...
标签库的优点、缺点大辩论 -
otom31:
从来不用标签库,几乎不用struts,除了最早公司要使用以外; ...
标签库的优点、缺点大辩论
基本的ThreadLocal使用
public class ThreadLocalTest { static ThreadLocal tl=new ThreadLocal(); public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ int data =new Random().nextInt(); public void run() { System.out.println(Thread.currentThread().getName()+"存入的数据是 "+data); tl.set(data); //存到了当前线程 new A().getThreadData(); } }).start(); } } static class A{ //静态类相当于一个外部类 public void getThreadData(){ System.out.println("data is "+tl.get()); } } }
结果可能是
Thread-0存入的数据是 1997234255
Thread-1存入的数据是 267171693
data is 1997234255
data is 267171693
通过包装对象非常烂的使用方式
class MyThreadScopeData{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class ThreadLocalTest { static ThreadLocal<MyThreadScopeData> myThreadScopeData=
new ThreadLocal<MyThreadScopeData>(); public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ int data =new Random().nextInt(); public void run() { MyThreadScopeData mydata=new MyThreadScopeData(); mydata.setName("name is name"+data); mydata.setAge(data); //把对象存入ThreadLocal 这样的做法非常烂!!!!! myThreadScopeData.set(mydata);
new B().showThreadScopeData(); } }).start(); } } static class B{ public void showThreadScopeData(){ System.out.println(myThreadScopeData.get().getName()); System.out.println("age is "+myThreadScopeData.get().getAge()); } } } }
标准使用方式
/** * 单列线程 * 在线程中范围内任意地方调,得到都是同一个实例对象 * 把ThreadLocal封装到单列的内部 */ class ThreadSingle{ private ThreadSingle(){} public static ThreadLocal<ThreadSingle> map=new ThreadLocal<ThreadSingle>(); //不需要加synchronized,即便有第2个线程进入,但拿到的map.get()是独有的。 public static ThreadSingle getThreadInstance(){ //方法得到是与本线程相关的实例 ThreadSingle obj=map.get(); /** * 如果A进入时obj=null,刚创建完还没赋值,此时B线程进入,但B和A没有关系。 */ if(obj==null){ obj=new ThreadSingle(); map.set(obj); } return obj; } private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class ThreadLocalTest { public static void main(String[] args) { for(int i=0;i<2;i++){ new Thread(new Runnable(){ int data =new Random().nextInt(); public void run() { ThreadSingle.getThreadInstance().setName("name"+data); ThreadSingle.getThreadInstance().setAge(data); new C().showData(); } }).start(); } }
发表评论
-
AOP的实现(JDK动态代理)
2011-11-29 16:21 969转自:http://www.blogjava.net/D ... -
Java 枚举7常见种用法
2011-11-27 22:54 851转自:http://helloyesyes.itey ... -
一个Java程序员应该掌握的10项技能
2011-11-18 11:57 9771、语法:必须比 ... -
Java回调函数使用
2011-08-16 16:14 687正常情况下开发人员使用已经定义好的API,这个过程叫 ... -
为什么要设置Java环境变量(详解)
2011-08-17 21:40 648从大二开始接触Java,之后是断断续续的学习。大三真正开始 ... -
很长空格的String转换成Array数组
2011-08-23 14:40 1257开发中碰到了一个需求,需要把键值对字符串分隔,但键值之 ... -
不同格式的日期字符串转换
2011-08-23 14:44 920先把字符串日期转换成对应的格式,然后再转换成日期 p ... -
用序列化(Serializable)保存、读取对象
2011-08-23 15:33 828实现Serializable借口的对象可以被转换成一系列 ... -
JUint测试
2011-08-23 15:36 628ClassA.java public class Cla ... -
解决Join方法的疑惑
2011-08-23 20:57 974很长时间对join方法感到疑惑,不明白到底是谁要阻塞,谁要继 ... -
线程学习笔记【1】----进程、线程概念及创建线程
2011-08-27 22:33 7731.进程与线程 每个进程都独享一块内存空间,一个应用程 ... -
线程学习笔记【2】---Timer(定时器)
2011-08-28 09:15 740入门 public class Time01 { ... -
线程学习笔记【3】---互斥技术
2011-08-29 15:10 719第一个示例更多的是运用了内部类的特性: 内部类重要特点:可以 ... -
线程学习笔记【4】---线程之间通信
2011-08-29 17:31 715子线程先循环10次,然后主线程循环100次,再子线程循环10次 ... -
各种创建单例模式的优缺点
2011-09-05 21:54 789单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全 ... -
格式化简单例子
2011-11-04 16:35 794参考:http://android.blog.51cto.co ... -
图片上传源码(commons-fileupload-1.2.2)分析
2011-11-03 11:20 2019题记:文章是供自己查看方便,所以没有进行格式化,请见谅 ... -
用序列化(Serializable)保存、读取对象
2011-08-23 15:56 877实现Serializable借口的对象可以被转换成一系 ... -
IO各种流使用清晰区别
2011-08-10 11:39 800引用:http://www.iteye.com/topic/1 ... -
创建File和Properties
2011-08-08 10:03 700package com.file; import ...
相关推荐
java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
通过ThreadLocal对象定位到线程:Thread.currentThread()通过ThreadLocal对象拿到所在的ThreadLocalMap: T
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解.pdf
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程状态的转换 ...Java线程:深入ThreadLocal 一、标准例子 二、不用ThreadLocal 三、自己实现个ThreadLocal 四、透过现象看本质 Java线程:大总结
2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...
Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal Java资料—详解ThreadLocal
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
本例以序列号生成的程序为例,展示ThreadLocal的使用
应用ThreadLocal进行多线程处理,经典小例子。可运行。
本地学习练习demo的eclipse工作空间:主要包括多线程的相关demo以及quartz调度的简单实现和其他java基础的demo练习
虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用ThreadLocal的set()方法设置的值。即使是两个不同的线程在同一个ThreadLocal对象上设置了不同的值,他们仍然无法访问到对方的值...
ThreadLocal原理及在多层架构中的应用
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。
{14.3.1}SAX应用}{206}{subsection.14.3.1} {14.4}dom4j}{207}{section.14.4} {14.5}XPath}{210}{section.14.5} {14.6}apache.commons}{211}{section.14.6} {15}sqlite3}{213}{chapter.15} {16}Web基础}{215}{...
目录一、背景介绍二、TestNG多线程详解2.1 TestNG多线程实现2.2 TestNG多线程效果演示三、ThreadLocal3.1 ThreadLocal概念3.2 具体实现 一、背景介绍 在使用Selenium+TestNG做WebUI自动化过程中,为了能够加快Web...
JAVA并发-自问自答学ThreadLocal
NULL 博文链接:https://yizhenn.iteye.com/blog/2293339