java 多线程-ThreadLocal
2019-08-18 22:34
1061 查看
ThreadLocal:每个线程自身的存储本地、局部区域,类似于容器,每个线程都会在其中有一定存储空间
常用的方法get/set/initialValue
官方建议为private static
每个线程存储自己的数据,更改不会影响其他线程
ThreadLocal 子类InheritableThreadLocal:
继承上下文环境的数据
public class my { //Integer 初始值为null //private static ThreadLocal<Integer> threadlocal=new ThreadLocal<>(); //更改初始值需要创建ThreadLocal的子类重写initialValue或者使用lambda(jdk8) private static ThreadLocal<Integer> threadlocal=new ThreadLocal <Integer>() {//父类匿名内部类重写方法 protected Integer initialValue() { return 200; } }; //private static ThreadLocal<Integer> threadlocal=new ThreadLocal.withInitial(()->200); public static void main(String[]args) throws InterruptedException { //获取值 System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); //设置值 threadlocal.set(99); System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); new Thread(new test()).start(); new Thread(new test()).start(); } public static class test implements Runnable { public void run() { threadlocal.set((int)(Math.random()*100)); System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); } } }
每个线程自身的数据更改不会影响其他线程
public class my { private static ThreadLocal<Integer> threadlocal=new ThreadLocal <Integer>() {//父类匿名内部类重写方法 protected Integer initialValue() { return 1; } }; public static void main(String[]args) throws InterruptedException { for(int i=0;i<5;i++) { new Thread(new test()).start(); } } public static class test implements Runnable { public void run() { //修改不会影响其他线程 Integer left=threadlocal.get(); System.out.println(Thread.currentThread().getName()+"-->"+left); threadlocal.set(left-1); System.out.println(Thread.currentThread().getName()+"还剩下"+threadlocal.get()); } } }
分析ThreadLocal运行环境:
public class my { private static ThreadLocal<Integer> threadlocal=new ThreadLocal <Integer>() {//父类匿名内部类重写方法 protected Integer initialValue() { return 1; } }; public static void main(String[]args) throws InterruptedException { new Thread(new test()).start();//两个打印的内容在不同的线程里 //当start()之后,线程才从main转换到其他线程,所以构造器里的是main线程的 } public static class test implements Runnable { public test() { threadlocal.set(100); //属于main线程,修改不会影响start内的线程 System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); } public void run() { System.out.println(Thread.currentThread().getName()+"还剩下"+threadlocal.get()); } } }
子类InheritableThreadLocal:
public class my { private static ThreadLocal<Integer> threadlocal=new InheritableThreadLocal<>(); public static void main(String[]args) throws InterruptedException { System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); threadlocal.set(2); //此线程由main线程开辟,拷贝一份main线程的数据给此线程 //即将main线程里的2给此线程 new Thread(()->{ System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); threadlocal.set(200); System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get()); }).start(); } }
相关文章推荐
- java多线程:5、线程范围内的数据共享_ThreadLocal
- Java多线程——线程范围内共享变量和ThreadLocal
- JAVA多线程----ThreadLocal
- Java多线程之详解ThreadLocal类(一)
- Java多线程下 ThreadLocal 的应用实例
- Java多线程之ThreadLocal
- Java多线程之详解ThreadLocal类(一)
- java多线程学习之通过ThreadLocal实现每个线程拥有自己的变量
- Java 多线程:ThreadLocal 多线程同步关键字
- JAVA多线程之ThreadLocal类
- Java多线程之 ThreadLocal
- Java多线程之 ThreadLocal
- Java基础:多线程之线程范围内的数据共享ThreadLocal
- 【Android应用源码分析】Java多线程:线程本地变量ThreadLocal源码分析
- Java——多线程总结及ThreadLocal、Volatile、synchronized、Atomic四个关键字
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景
- java多线程模式ThreadLocal原理简述及其使用详解
- Java多线程之详解ThreadLocal类(一)
- java多线程之ThreadLocal
- java多线程 ThreadLocal