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 ...
随机推荐
- sizeof新用法(c++11)
1.概念 1)sizeof是关键字,也是运算符,用来求对象占用空间的大小,返回字节数 2)c++11允许使用作用域运算符(::)来获取类中成员的大小,以前只允许先创建一个类的对象,通过类对象访问成员得 ...
- VIM 与 系统剪切版
1, 查看 vim 是否支持 clipboard 功能 $ vim --version | grep clipboard 2, 如果有 +clipboard 则跳过这一步; 如果显示的是 -clipb ...
- 安装SourceTree遇到的一个个坑
之前在公司的电脑上满心欢喜的安装了下,很顺利就成功了,回来在自己电脑上安装,结果坑不能停,以此来纪念下吧! 下载完成后,进行安装: 这里我是申请了个账户,选第一个user an existing ac ...
- CodeForces 916A Jamie and Alarm Snooze (水题)
题意:给定一个数字n,和一个时间,问你每次可以把当前时间往回调n分钟,然后调多少次后时间中包含数字7. 析:直接模拟就好,从当前分钟向后调,注意调成负数的情况就好.很简单. 代码如下: #pragma ...
- 微信 公众号平台 与 开放平台 获取用户信息 scope snsapi_login
微信公众号(公众平台) 和 微信开放平台 是两码事.公众号(公众平台)获取的scope只包括两种:snsapi_base 和snsapi_userinfo,前者是静默获取,用户无感知:后者是需要用户确 ...
- Atcoder Regular-074 Writeup
C - Chocolate Bar 题面 There is a bar of chocolate with a height of H blocks and a width of W blocks. ...
- 通过Windows API实现的MDI简易程序
## #include <windows.h> #include <tchar.h> HINSTANCE hInst; ATOM WindowRegister(WNDPROC ...
- Jack Straws(poj 1127) 两直线是否相交模板
http://poj.org/problem?id=1127 Description In the game of Jack Straws, a number of plastic or wood ...
- Establish a website in 5 minutes
$sudo apt-get update //update $sudo apt-get install tasksel ...
- ES基本查询
数据准备 # 创建索引PUT /lib1{ "settings": { "number_of_shards": 5 , "number_o ...