ThreadLocal的练习代码
场景:
有三个小孩儿,买了一个变形金刚玩具(Transformer)....
三个小孩都争着玩这个玩具....没有一个人可以玩...
第一种方式:每个人各玩一会....
第二种方式:再买两个玩具,一个人玩一个.
每个小孩都当成一个线程.三个小孩就有三个线程.
Child.java
import java.util.Random;
import java.util.concurrent.TimeUnit; public class Child implements Runnable{
private Transformer2 transformer; private String name ; public Child(Transformer2 transformer) {
this.transformer = transformer;
} public Child() {
} public Transformer2 getTransformer() {
return transformer;
} public void setTransformer(Transformer2 transformer) {
this.transformer = transformer;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void play(){ while (true) {
try {
//transformer = new Transformer();//每次调用该方法,该对象都是新的。 //想要的效果是每个小孩儿都有一个玩具,但是不管他玩多少次,这个玩具永远都是唯一的.
transformer = Transformer2.getInstance();
System.out.println(Thread.currentThread().getName() +" :"+transformer );
String str = "擎天柱" + new Random().nextInt(10);
System.out.println(Thread.currentThread().getName()
+ ": 将变形金刚设置成 :" + str);
transformer.setType(str);
TimeUnit.SECONDS.sleep(2); String type = transformer.getType(); System.out.println(Thread.currentThread().getName()
+ ": 获取到的变形金刚是:" + type); } catch (InterruptedException e) {
e.printStackTrace();
}
} } @Override
public void run() {
play();
} }
Transformer.java
import java.util.HashMap;
import java.util.Map; /*
* 每个线程都有且仅有一个 该类对象的引用。
* 不应该在外部类中随便的去new 所以构造方法私有
*
*/
public class Transformer { private static Map<Thread, Transformer> maps = new HashMap<Thread, Transformer>(); private String type; private Transformer(){} public static Transformer getInstance() {
Transformer instance = maps.get(Thread.currentThread());
if(instance == null) {
instance = new Transformer();
maps.put(Thread.currentThread(),instance);
}
return instance;
}
public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} }
Transformer2.java(使用ThreadLocal类)
import java.util.HashMap;
import java.util.Map; /*
* 每个线程都有且仅有一个 该类对象的引用。
*
*/
public class Transformer2 { //private static Map<Thread, Transformer2> maps = new HashMap<Thread, Transformer2>();
private static ThreadLocal<Transformer2> maps = new ThreadLocal<Transformer2>(); private String type; private Transformer2(){} public static Transformer2 getInstance() {
Transformer2 instance = maps.get();
if(instance == null) {
instance = new Transformer2();
maps.set(instance);
}
return instance;
}
public String getType() {
return type;
} public void setType(String type) {
this.type = type;
}
}
测试类:
public class Test {
public static void main(String[] args) {
//Transformer transformer = new Transformer();
for (int i = 0; i < 3; i++) {
new Thread(new Child()).start();
}
}
}
ThreadLocal的练习代码的更多相关文章
- Java ThreadLocal (Java代码实战-006)
ThreadLocal解决什么问题 由于 ThreadLocal 支持范型,如 ThreadLocal< StringBuilder >,为表述方便,后文用 变量 代表 ThreadLoc ...
- ThreadLocal内存溢出代码演示和原因分析!
ThreadLocal 翻译成中文是线程本地变量的意思,也就是说它是线程中的私有变量,每个线程只能操作自己的私有变量,所以不会造成线程不安全的问题. 线程不安全是指,多个线程在同一时刻对同一个全局 ...
- ThreadLocal的使用[代码片段]
1.ThreadLocal定义,在一个类中定义: 在类A中: private static ThreadLocal<String> kcsHtmlPath = new ThreadLoca ...
- 19.ThreadLocal方法解决代码不友好的问题
#ThreadLocal import threading #创建全局ThreadLocal loacl_school = threading.local() class Student(): def ...
- 【Java】深入理解ThreadLocal
一.前言 要理解ThreadLocal,首先必须理解线程安全.线程可以看做是一个具有一定独立功能的处理过程,它是比进程更细度的单位.当程序以单线程运行的时候,我们不需要考虑线程安全.然而当一个进程中包 ...
- ThreadLocal的应用与实现原理
本文对ThreadLocal的分析基于JDK 8. 本文大纲 1. ThreadLocal快速上手 2. ThreadLocal应用场景 3. TheadLocal set与get方法简析 4. Th ...
- ThreadLocal的原理,源码深度分析及使用
文章简介 ThreadLocal应该都比较熟悉,这篇文章会基于ThreadLocal的应用以及实现原理做一个全面的分析 内容导航 什么是ThreadLocal ThreadLocal的使用 分析Thr ...
- 并发编程(四)—— ThreadLocal源码分析及内存泄露预防
今天我们一起探讨下ThreadLocal的实现原理和源码分析.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两 ...
- ThreadLocal的使用及原理分析
文章简介 ThreadLocal应该都比较熟悉,这篇文章会基于ThreadLocal的应用以及实现原理做一个全面的分析 内容导航 什么是ThreadLocal ThreadLocal的使用 分析Thr ...
随机推荐
- const修饰指针时应注意的问题
1.指向常量的指针 顾名思义,一个指针指向const对象,则称它为指向常量的指针. ; int* ptr=&a; //错误 const int* ptr=&a; //必须用const来 ...
- Maven进行install的时候报错,COMPILATION ERROR : Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.13:test (default-test) on project cmu: There are test failures.
maven进行install的时候,test类里面报错: COMPILATION ERROR : [INFO] -------------------------------------------- ...
- leetcode-[3]Max Points on a Line
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line 思 ...
- POJ2229 Sumsets
Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 19024 Accepted: 7431 Descrip ...
- codeforces877c
C. Slava and tanks time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- hdu 5091 给定矩形覆盖尽量多点 扫描线+线段树
http://acm.hdu.edu.cn/showproblem.php?pid=5091 给你10000以内的敌舰的坐标(即分别为x,y),要求用W*H的矩形去围住一个区域,使得这个区域内的敌舰最 ...
- Scala_对象
对象 单例对象 Scala并没有提供Java那样的静态方法或静态字段,但是,可以采用 object关键字实现单例对象,具备和Java静态方法同样的功能. 可以看出,单例对象的定义和类的定义很相似,明显 ...
- yum-本地源配置(CentOS7)
服务器版本查看:# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 一.挂载ISO文件: 1.ISO镜像下载网站:网易镜像: ...
- Python自动化开发 - Django【进阶篇】
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- ASP.NET中实现回调
一.引言 在ASp.NET网页的默认模型中,用户通过单击按钮或其他操作的方式来提交页面,此时客户端将当前页面表单中的所有数据(包括一些自动生成的隐藏域)都提交到服务器端,服务器将重新实例化一个当前页面 ...