场景:

有三个小孩儿,买了一个变形金刚玩具(Transformer)....

三个小孩都争着玩这个玩具....没有一个人可以玩...

第一种方式:每个人各玩一会....

第二种方式:再买两个玩具,一个人玩一个.

每个小孩都当成一个线程.三个小孩就有三个线程.

Child.java

 2
 3 import java.util.Random;
 4 import java.util.concurrent.TimeUnit;
 5
 6 public class Child implements Runnable{
 7     private Transformer2 transformer;
 8
 9     private String name ;
10
11
12     public Child(Transformer2 transformer) {
13         this.transformer = transformer;
14     }
15
16     public Child() {
17     }
18
19     public Transformer2 getTransformer() {
20         return transformer;
21     }
22
23     public void setTransformer(Transformer2 transformer) {
24         this.transformer = transformer;
25     }
26
27     public String getName() {
28         return name;
29     }
30
31     public void setName(String name) {
32         this.name = name;
33     }
34
35
36     public void play(){
37
38
39         while (true) {
40             try {
41                 //transformer = new Transformer();//每次调用该方法,该对象都是新的。
42
43                 //想要的效果是每个小孩儿都有一个玩具,但是不管他玩多少次,这个玩具永远都是唯一的.
44                 transformer = Transformer2.getInstance();
45                 System.out.println(Thread.currentThread().getName() +" :"+transformer );
46                 String str = "擎天柱" + new Random().nextInt(10);
47                 System.out.println(Thread.currentThread().getName()
48                         + ": 将变形金刚设置成 :" + str);
49                 transformer.setType(str);
50                 TimeUnit.SECONDS.sleep(2);
51
52                 String type = transformer.getType();
53
54                 System.out.println(Thread.currentThread().getName()
55                         + ": 获取到的变形金刚是:" + type);
56
57             } catch (InterruptedException e) {
58                 e.printStackTrace();
59             }
60         }
61
62     }
63
64     @Override
65     public void run() {
66         play();
67     }
68
69 }

Transformer.java

 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6
 7 /*
 8  * 每个线程都有且仅有一个 该类对象的引用。
 9  * 不应该在外部类中随便的去new 所以构造方法私有
10  *
11  */
12 public class Transformer {
13
14     private static Map<Thread, Transformer> maps = new HashMap<Thread, Transformer>();
15
16     private String type;
17
18     private Transformer(){}
19
20     public static Transformer getInstance() {
21         Transformer instance = maps.get(Thread.currentThread());
22         if(instance == null) {
23             instance = new Transformer();
24             maps.put(Thread.currentThread(),instance);
25         }
26         return instance;
27     }
28     public String getType() {
29         return type;
30     }
31
32     public void setType(String type) {
33         this.type = type;
34     }
35
36
37 }

Transformer2.java(使用ThreadLocal类)

 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6
 7 /*
 8  * 每个线程都有且仅有一个 该类对象的引用。
 9  *
10  */
11 public class Transformer2 {
12
13     //private static Map<Thread, Transformer2> maps = new HashMap<Thread, Transformer2>();
14     private static ThreadLocal<Transformer2> maps = new ThreadLocal<Transformer2>();
15
16     private String type;
17
18
19     private Transformer2(){}
20
21     public static Transformer2 getInstance() {
22         Transformer2 instance = maps.get();
23         if(instance == null) {
24             instance = new Transformer2();
25             maps.set(instance);
26         }
27         return instance;
28     }
29     public String getType() {
30         return type;
31     }
32
33     public void setType(String type) {
34         this.type = type;
35     }
36 }

测试类:

 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6
 7         //Transformer transformer = new Transformer();
 8
 9         for (int i = 0; i < 3; i++) {
10             new Thread(new Child()).start();
11         }
12     }
13 }

转载于:https://www.cnblogs.com/DreamDrive/p/6189267.html

ThreadLocal的练习代码相关推荐

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

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 前言 ThreadLocal 翻译成中文是线程本地变量的意思,也就是说它是线程中的 ...

  2. 【java】ThreadLocal 内存泄漏 代码演示 实例演示

    1.概述 转载:ThreadLocal 内存泄漏 代码演示 实例演示 首先看文章:ThreadLocal内存泄露原因分析 相关文章: [高并发]ThreadLocal.InheritableThrea ...

  3. 【Java】ThreadLocal SimpleDateFormat 静态代码块 空指针异常

    1.概述 背景写了一段这样的代码 package com.java.thread.demo.threadlocal;import java.text.DateFormat; import java.t ...

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

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

  5. ThreadLocal源码分析

    ThreadLocal的作用 Java对象是线程间共享的,但有时我们需要一些线程间隔离的对象,该对象只能由同一个线程读写,对其他线程不可见.ThreadLocal正式提供了这样的机制,详细使用方式请参 ...

  6. ThreadLocal的使用及原理分析

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

  7. Java 并发编程:ThreadLocal 的使用及其源码实现

    1.ThreadLocal的使用 防止任务在共享资源上产生冲突的一种方式是根除对变量的共享,使用线程的本地存储为使用相同变量的不同线程创建不同的存储. 下面是一个 ThreadLocal 的实例.这里 ...

  8. ThreadLocal 和 InheritableThreadLocal

    在学习ThreadLocal之前,建议先了解Java中的4种引用 一.先看一下Thread,ThreadMap,ThreadLocal的关系 Thread中持有一个ThreadLocalMap ,这里 ...

  9. Python技术分享:深入理解ThreadLocal变量的功能和使用

    我们在进行Python多线程开发的时候经常会使用到变量,但全局变量的变化影响到每一个线程,而局部变量使用起来又非常麻烦,所以我们需要使用到ThreadLocal变量,下面小千就来给大家介绍这个Thre ...

最新文章

  1. 代码实践|通过简单代码来回顾卷积块的历史
  2. 【问题收录】svn: E155010: 提交失败(Ubuntu14.04环境)
  3. 深度学习综述:Hinton、Yann LeCun和Bengio经典重读
  4. 第三次组队赛 (DFSBFS)
  5. golang中的优雅中止
  6. Leetcode 101. 对称二叉树 解题思路及C++实现
  7. 系统架构设计师考试大纲
  8. c语言中规定,程序中各函数之间,C语言题库-函数_(参考).doc
  9. for else语句小tips : RUNOOB python练习题36
  10. 第二章 传送与交换作业
  11. hdoj1465错排公式的应用(递推)
  12. Android studio xpose的使用
  13. 数据结构与算法笔记 二叉树、二叉搜索树、二叉平衡树的区分与关系
  14. 微信小程序---快速上手云开发
  15. 数独-- 一个高效率生成数独的算法
  16. 用友畅捷通T+,现金流量相关档案从一个帐套复制到另个帐套
  17. 高并发点赞系统 梳理
  18. python短信验证码_Python如何实现手机验证码
  19. Oracle表数据的更新
  20. 记一次神奇的CVPR 2021 Rebuttal 经历

热门文章

  1. 【HRBUST - 1996】数学等式 (HASH 或 二分)
  2. 【HDU - 3951】Coin Game (博弈,猜规律,对称博弈)
  3. sdut 2074 区间覆盖问题(贪心)
  4. html手机网站font-size:16em,px、em、rem
  5. java null转换jason_常见java问题及解决办法汇总(干货可收藏)
  6. python一个月能掌握吗_Python 从入门到精通:一个月足够了!
  7. 俄罗斯方块(C++)
  8. UNIX(多线程):25---当前进程的线程哪些数据共享哪些是私有的
  9. 一个简单的游戏服务器框架 .
  10. STL源码剖析 hashtable