ThreadLocal的练习代码
场景:
有三个小孩儿,买了一个变形金刚玩具(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的练习代码相关推荐
- ThreadLocal内存溢出代码演示和原因分析!
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 前言 ThreadLocal 翻译成中文是线程本地变量的意思,也就是说它是线程中的 ...
- 【java】ThreadLocal 内存泄漏 代码演示 实例演示
1.概述 转载:ThreadLocal 内存泄漏 代码演示 实例演示 首先看文章:ThreadLocal内存泄露原因分析 相关文章: [高并发]ThreadLocal.InheritableThrea ...
- 【Java】ThreadLocal SimpleDateFormat 静态代码块 空指针异常
1.概述 背景写了一段这样的代码 package com.java.thread.demo.threadlocal;import java.text.DateFormat; import java.t ...
- ThreadLocal的使用[代码片段]
1.ThreadLocal定义,在一个类中定义: 在类A中: private static ThreadLocal<String> kcsHtmlPath = new ThreadLoca ...
- ThreadLocal源码分析
ThreadLocal的作用 Java对象是线程间共享的,但有时我们需要一些线程间隔离的对象,该对象只能由同一个线程读写,对其他线程不可见.ThreadLocal正式提供了这样的机制,详细使用方式请参 ...
- ThreadLocal的使用及原理分析
文章简介 ThreadLocal应该都比较熟悉,这篇文章会基于ThreadLocal的应用以及实现原理做一个全面的分析 内容导航 什么是ThreadLocal ThreadLocal的使用 分析Thr ...
- Java 并发编程:ThreadLocal 的使用及其源码实现
1.ThreadLocal的使用 防止任务在共享资源上产生冲突的一种方式是根除对变量的共享,使用线程的本地存储为使用相同变量的不同线程创建不同的存储. 下面是一个 ThreadLocal 的实例.这里 ...
- ThreadLocal 和 InheritableThreadLocal
在学习ThreadLocal之前,建议先了解Java中的4种引用 一.先看一下Thread,ThreadMap,ThreadLocal的关系 Thread中持有一个ThreadLocalMap ,这里 ...
- Python技术分享:深入理解ThreadLocal变量的功能和使用
我们在进行Python多线程开发的时候经常会使用到变量,但全局变量的变化影响到每一个线程,而局部变量使用起来又非常麻烦,所以我们需要使用到ThreadLocal变量,下面小千就来给大家介绍这个Thre ...
最新文章
- 代码实践|通过简单代码来回顾卷积块的历史
- 【问题收录】svn: E155010: 提交失败(Ubuntu14.04环境)
- 深度学习综述:Hinton、Yann LeCun和Bengio经典重读
- 第三次组队赛 (DFSBFS)
- golang中的优雅中止
- Leetcode 101. 对称二叉树 解题思路及C++实现
- 系统架构设计师考试大纲
- c语言中规定,程序中各函数之间,C语言题库-函数_(参考).doc
- for else语句小tips : RUNOOB python练习题36
- 第二章 传送与交换作业
- hdoj1465错排公式的应用(递推)
- Android studio xpose的使用
- 数据结构与算法笔记 二叉树、二叉搜索树、二叉平衡树的区分与关系
- 微信小程序---快速上手云开发
- 数独-- 一个高效率生成数独的算法
- 用友畅捷通T+,现金流量相关档案从一个帐套复制到另个帐套
- 高并发点赞系统 梳理
- python短信验证码_Python如何实现手机验证码
- Oracle表数据的更新
- 记一次神奇的CVPR 2021 Rebuttal 经历
热门文章
- 【HRBUST - 1996】数学等式 (HASH 或 二分)
- 【HDU - 3951】Coin Game (博弈,猜规律,对称博弈)
- sdut 2074 区间覆盖问题(贪心)
- html手机网站font-size:16em,px、em、rem
- java null转换jason_常见java问题及解决办法汇总(干货可收藏)
- python一个月能掌握吗_Python 从入门到精通:一个月足够了!
- 俄罗斯方块(C++)
- UNIX(多线程):25---当前进程的线程哪些数据共享哪些是私有的
- 一个简单的游戏服务器框架 .
- STL源码剖析 hashtable