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 }
复制代码

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6189267.html,如需转载请自行联系原作者

相关文章
|
6月前
|
存储 Java Spring
ThreadLocal用法
ThreadLocal用法
51 0
|
6月前
|
存储 安全 Java
面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
字节面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
78 0
|
3月前
|
存储 设计模式 安全
深入理解ThreadLocal原理
本文深入探讨了Java中的ThreadLocal及其内部数据结构ThreadLocalMap的工作原理和特性,帮助读者理解如何利用ThreadLocal实现线程局部变量的隔离和线程安全。
深入理解ThreadLocal原理
|
4月前
|
存储 Java
ThreadLocal应用及理解
ThreadLocal应用及理解
45 10
|
4月前
|
存储 算法 Java
ThreadLocal 源码浅析
【7月更文挑战第5天】`ThreadLocal` 是Java中用于创建线程局部变量的工具类,确保每个线程拥有独立的变量副本。源码中,每个`ThreadLocal`实例都有一个唯一的哈希码用于映射到`ThreadLocalMap`,这个内部静态类使用弱引用存储键(`ThreadLocal`实例)以防止内存泄漏。`ThreadLocalMap`使用 Entry 数组,Entry 是一个扩展了 WeakReference 的类,持有线程变量值。`ThreadLocal`的`get()`和`set()`方法通过哈希计算定位并访问或设置线程局部变量。
|
Java
ThreadLocal全面解析
ThreadLocal全面解析
112 0
|
6月前
|
存储 安全 Java
ThreadLocal原理讲解
ThreadLocal原理讲解
54 0
|
6月前
|
存储 Java
ThreadLocal 有什么用
ThreadLocal 有什么用
52 0
|
存储 安全 Java
ThreadLocal介绍和应用
ThreadLocal介绍和应用
62 0
|
存储 算法 安全
ThreadLocal原理剖析
ThreadLocal原理剖析
220 0