1.概述
变量值的共享可以使用public 是static 变量的形式,所有的线程都使用同一个public static 变量。 如实现线程内的共享变量,jdk提供了ThreadLocal来解决这个问题。
ThreadLocal主要解决就是每个线程绑定自己的值,可以将ThreadLocal类看成全局存放数据的盒子。
2.基本使用
基本demo演示(存取值)
/** * @author 上海尚学堂 shsxt.com * 了解更多 加V:java8733 */ public class ThreadLocalDemo01 { public static ThreadLocal t1 = new ThreadLocal(); public static void main(String[] args) { if (t1.get() == null) { System.out.println("从未放过值"); t1.set("存放的值"); } System.out.println(t1.get()); System.out.println(t1.get()); } }
结果示例:
从未放过值
存放的值
存放的值
结果分析:
从第一次调用t1.get()方法时候,返会的null.然后通过set() 方法赋值后顺利取出值。
类ThreadLocal解决的是变量在不同线程间的隔离性。也就是不同线程拥有自己的值。不同线程中的值是可以放入ThreadLocal类中进行保存。
3.隔离性
验证线程变量的隔离性:
package com.threadlocal; /** * 验证隔离性 * @author 上海尚学堂 shsxt.com * */ public class ThreadLocalDemo02 { public static ThreadLocal demo = new ThreadLocal(); public static void main(String[] args) { ThreadA a = new ThreadA(); a.start(); ThreadB b = new ThreadB(); b.start(); try { for (int i = 0; i < 100; i++) { demo.set("Main .." + (i + 1)); System.out.println("Main getValue ..." + demo.get()); Thread.sleep(200); } } catch (InterruptedException e) { e.printStackTrace(); } } } class ThreadA extends Thread { @Override public void run() { try { for (int i = 0; i < 100; i++) { ThreadLocalDemo02.demo.set("ThreadA" + (i + 1)); System.out.println("ThreadA getValue " + ThreadLocalDemo02.demo.get()); Thread.sleep(200); } } catch (InterruptedException e) { e.printStackTrace(); } super.run(); } } class ThreadB extends Thread { @Override public void run() { try { for (int i = 0; i < 100; i++) { ThreadLocalDemo02.demo.set("ThreadA" + (i + 1)); System.out.println("ThreadA getValue " + ThreadLocalDemo02.demo.get()); Thread.sleep(200); } } catch (InterruptedException e) { e.printStackTrace(); } super.run(); } }
执行结果
小结:
从上面执行的结果可以看的出来,每一个线程向ThreadLocal 中存值时,但是每个线程取出的都是自己线程的值。这也就验证的线程变量的隔离性。
上海尚学堂Java教研组原创,转载请注明出处!感谢阅读上海尚学堂Java技术文章。请多关注收藏!