场景:

有三个小孩儿,买了一个变形金刚玩具(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. Oracle 导出错误 EXP-00000~EXP-00107

    EXP-00000: Export terminated unsuccessfully Cause: Export encountered an Oracle error. Action: Look ...

  2. 诡异的 ERROR 1045 (28000): Access denied for user 错误

    问题描述: 用户已建,权限已赋予.long long ago这个用户是可以正常访问的,但是今天它就不能访问了.报错如下: ERROR 1045 (28000): Access denied for u ...

  3. winSockets编程(三)最简单的C/S形式

    功能:向服务器端发送一个字符串,属于最简易的形式,一共需要4个主要步骤,初始化-建立套接字-连接服务器-发送数据 /****************************************** ...

  4. 1.8.3suspend与resume方法的缺点--不同步

    package com.cky.bean; /** * Created by edison on 2017/12/3. */ public class MyObject { private Strin ...

  5. Matlab用mpeaks函数求峰值点坐标

    clear;clc;close all % 初始化 m = [-6,-2,0,2,4,6]; sigma = [1,1,0.5,0.25,0.6,2]; h = [1,2,3,2,2.13,3.14] ...

  6. switch()语句

    语法: switch(expression){ case value:statement break; case value:statement break; case value:statement ...

  7. 差值的再议-Hermite差值

    1. 插值法 插值法又称“内插法”,是利用函数f (x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方法称为插值法. 如果这特定 ...

  8. 关于建立MySQL数据库,中文出现乱码问题

    MySQL的ini文件中的默认编码设置utf-8不用改 loose-default-character-set = utf-8 注意:需要改动部分 1.如图所示 建立schema时改变字符编码 改变为 ...

  9. Anroid 手机助手 详细解析 概述(二)

    这篇主要说一下手机插入之后的一些动作. 1)  捕获窗口消息 插入拔出一个USB设备windows 会给所有的窗口发送特定的消息,只要我们捕获这些消息就可以处理设备插入和拔出.需要注意的是插入或者拔出 ...

  10. FastReport二维码打印存在的问题

    FastReport二维码打印存在的问题 (2018-05-21 09:28:38) 转载▼ 标签: delphi 分类: Delphi10.2 FastReport本身支持二维码,实际应用中遇到这样 ...