场景:

有三个小孩儿,买了一个变形金刚玩具(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的练习代码的更多相关文章

  1. Java ThreadLocal (Java代码实战-006)

    ThreadLocal解决什么问题 由于 ThreadLocal 支持范型,如 ThreadLocal< StringBuilder >,为表述方便,后文用 变量 代表 ThreadLoc ...

  2. ThreadLocal内存溢出代码演示和原因分析!

    ThreadLocal 翻译成中文是线程本地变量的意思,也就是说它是线程中的私有变量,每个线程只能操作自己的私有变量,所以不会造成线程不安全的问题. ​ 线程不安全是指,多个线程在同一时刻对同一个全局 ...

  3. ThreadLocal的使用[代码片段]

    1.ThreadLocal定义,在一个类中定义: 在类A中: private static ThreadLocal<String> kcsHtmlPath = new ThreadLoca ...

  4. 19.ThreadLocal方法解决代码不友好的问题

    #ThreadLocal import threading #创建全局ThreadLocal loacl_school = threading.local() class Student(): def ...

  5. 【Java】深入理解ThreadLocal

    一.前言 要理解ThreadLocal,首先必须理解线程安全.线程可以看做是一个具有一定独立功能的处理过程,它是比进程更细度的单位.当程序以单线程运行的时候,我们不需要考虑线程安全.然而当一个进程中包 ...

  6. ThreadLocal的应用与实现原理

    本文对ThreadLocal的分析基于JDK 8. 本文大纲 1. ThreadLocal快速上手 2. ThreadLocal应用场景 3. TheadLocal set与get方法简析 4. Th ...

  7. ThreadLocal的原理,源码深度分析及使用

    文章简介 ThreadLocal应该都比较熟悉,这篇文章会基于ThreadLocal的应用以及实现原理做一个全面的分析 内容导航 什么是ThreadLocal ThreadLocal的使用 分析Thr ...

  8. 并发编程(四)—— ThreadLocal源码分析及内存泄露预防

    今天我们一起探讨下ThreadLocal的实现原理和源码分析.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两 ...

  9. ThreadLocal的使用及原理分析

    文章简介 ThreadLocal应该都比较熟悉,这篇文章会基于ThreadLocal的应用以及实现原理做一个全面的分析 内容导航 什么是ThreadLocal ThreadLocal的使用 分析Thr ...

随机推荐

  1. matlab画无向图,基于坐标的无向图联系作者

    %函数名netplot %使用方法输入请help netplot %无返回值 %函数只能处理无向图 %作者:tiandsp %最后修改: function netplot(A,flag) %调用方法输 ...

  2. AngularJS实战之filter的使用二

    博文一中的filter是angular自带的filter,一般不会满足我们的使用.我们可以自定义filter. 一.自定义filter实现反转字符串 <div>{{ceshi|revers ...

  3. GCC基础知识学习

    GCC基础知识学习 一.GCC编译选项解析 常用编译选项 命令格式:gcc [选项] [文件名] -E:仅执行编译预处理: -S:将C代码转换为汇编代码: -c:仅执行编译操作,不进行连接操作: -o ...

  4. silverlight 父窗体传值给ChildWindow

    在网上找了许多列子,有的没有看懂,有的太麻烦. 现在有两种方法又简单又实用的,分享给大家! 第一种:使用构造函数传值 1.子页面新建一个构造函数 public ChildWindowTest(stri ...

  5. 1045 Favorite Color Stripe 动态规划

    1045 Favorite Color Stripe 1045. Favorite Color Stripe (30)Eva is trying to make her own color strip ...

  6. Eclipse怎么全局搜索和替换(整个项目)

    我们用Eclipse编程,有时候需要将整个项目的某个字符串替换成其他的.那么我们该怎么操作呢?请接着往下看! 一,我们首先打开Eclipse,单击要替换字符串的项目 二,按下组合键:ctrl + H, ...

  7. struts2 18拦截器详解(十)

    ModelDrivenInterceptor 该拦截器处于defaultStack中的第九的位置,在ScopedModelDrivenInterceptor拦截器之后,要使该拦截器有效的话,Actio ...

  8. poj1573模拟

    Robot Motion Time Limit: 1000 MS Memory Limit: 10000 KB 64-bit integer IO format: %I64d , %I64u Java ...

  9. Django:全文检索功能可参考博客

    https://blog.csdn.net/AC_hell/article/details/52875927 https://www.zmrenwu.com/courses/django-blog-t ...

  10. C# 判断access建库、建表、文件是否存在等

    1.创建数据库 2.判断表是否存在 3.创建表 1.    #region access数据库操作 之 创建数据库         private void creatMDB(string dbNam ...