|
早在Java 1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择。使用这个工具类可以很简洁地编写出优美的多线程程序,虽然ThreadLocal非常有用,但是似乎现在了解它、使用它的朋友还不多。 1 public class ThreadLocal
2 {
3 private Map values = Collections.synchronizedMap(new HashMap());
4 public Object get()
5 {
6 Thread curThread = Thread.currentThread();
7 Object o = values.get(curThread);
8 if (o == null && !values.containsKey(curThread))
9 {
10 o = initialValue();
11 values.put(curThread, o);
12 }
13 return o;
14 }
15
16 public void set(Object newValue)
17 {
18 values.put(Thread.currentThread(), newValue);
19 }
20
21 public Object initialValue()
22 {
23 return null;
24 }
25 }
当然,这并不是一个工业强度的实现,但JDK中的ThreadLocal的实现总体思路也类似于此。 1 public class SerialNum
2 {
3 // The next serial number to be assigned
4
5 private static int nextSerialNum = 0;
6 private static ThreadLocal serialNum = new ThreadLocal()
7 {
8 protected synchronized Object initialValue()
9 {
10 return new Integer(nextSerialNum++);
11 }
12 };
13
14 public static int get()
15 {
16 return ((Integer) (serialNum.get())).intValue();
17 }
18 }
另外我补充一个带有get、set方法的例子,当前类MsgListener是一个线程,这样可以保证其它类在取coreMessage的时候,都取到自己当前线程的coreMessage,不会因为其定义成private static型而被其它的线程把值给改掉,: //当前类:MsgListener //定义 private static String coreMessage; //设值: threadLocal.set(message); //下面为设值与取值的 private static ThreadLocal threadLocal=new ThreadLocal(){ public synchronized Object get() { return coreMessage; } public synchronized void set(Object coreMessage) { MsgListener.coreMessage=(String)coreMessage; } }; //该方法提供给其它的类调用 public static String getCoreMessage() { return (String)threadLocal.get(); } 其它类中调用就简单了: MsgListener.getCoreMessage(); |
ThreadLocal类讲解及实例
Java ThreadLocal详解
最新推荐文章于 2024-10-14 20:00:00 发布
本文深入介绍了Java中的ThreadLocal类,探讨了其设计原理与实现机制,并通过实例展示了如何使用ThreadLocal来避免多线程间的变量共享冲突。
1737

被折叠的 条评论
为什么被折叠?



