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