ThreadLocal的使用

来源:互联网 发布:怎么改淘宝的支付宝 编辑:程序博客网 时间:2024/06/14 00:07

ThreadLocal的作用就是让每个线程绑定自己的变量值,用于存储每个线程的私有数据。

一  ThreadLocal类的get方法和null值

package com.lanhuigu.JavaBase.thread.threadlocal;public class RunTest {public static ThreadLocal tl = new ThreadLocal();public static void main(String[] args) {if (tl.get() == null) {System.out.println("未放入过值");tl.set("放入值");// 放入值}System.out.println(tl.get());// 获取值}}

当第一次调用get方法时,由于没有放入过值,返回null,

通过set方法放入值,之后通过get方法可以获取当前线程的私有数据。


二 ThreadLocal隔离线实验

创建一个数据工具类:

package com.lanhuigu.JavaBase.thread.threadlocal;public class DataTools {public static ThreadLocal<String> tl = new ThreadLocal<String>();}

创建线程A:

package com.lanhuigu.JavaBase.thread.threadlocal;public class ThreadA extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubtry {for (int i = 0; i < 100; i++) {DataTools.tl.set("A_Thread_" + System.currentTimeMillis());System.out.println("线程A获取的值:" + DataTools.tl.get());// 获取当前线程私有数据Thread.sleep(200);}} catch (InterruptedException ex) {// TODO: handle exceptionex.printStackTrace();}}}

创建线程B:

package com.lanhuigu.JavaBase.thread.threadlocal;public class ThreadB extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubtry {for (int i = 0; i < 100 ; i++) {DataTools.tl.set("B_Thread_" + System.currentTimeMillis());System.out.println("线程B获取的值:" + DataTools.tl.get());// 获取当前线程私有数据Thread.sleep(200);}} catch (InterruptedException ex) {// TODO: handle exceptionex.printStackTrace();}}}

测试类:

package com.lanhuigu.JavaBase.thread.threadlocal;public class RunTest {public static void main(String[] args) {try {ThreadA threadA = new ThreadA();threadA.start();Thread.sleep(3000);ThreadB threadB = new ThreadB();threadB.start();} catch (InterruptedException ex) {// TODO: handle exceptionex.printStackTrace();}}}

运行结果:


从程序运行结果,线程获取属于自己的私有数据,证明了ThreadLocal实现线程私有数据保证

数据的隔离性。

三 如何让get方法第一次获取的值不为null

写一个类继承与ThreadLocal,重写initialValue()方法,设置get的默认值。

eg:

package com.lanhuigu.JavaBase.thread.threadlocal;public class ThreadLocalExt extends ThreadLocal{@Overrideprotected Object initialValue() {// TODO Auto-generated method stub//return super.initialValue();return "设置默认值,第一次获取不在为null";}}

原创粉丝点击