一、用法

ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。

  1. ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。
  2. ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。
  3. ThreadLocal.remove: 移除ThreadLocal中当前线程共享变量的值。
  4. ThreadLocal.initialValue: ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法,返回此方法值。
package com.coshaho.reflect;public class MyThreadLocal{private static final ThreadLocal<Object> threadLocal = new ThreadLocal<Object>(){//ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法,返回此方法值@Overrideprotected Object initialValue(){System.out.println("调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!");return null;}};public static void main(String[] args){new Thread(new MyIntegerTask("IntegerTask1")).start();new Thread(new MyStringTask("StringTask1")).start();new Thread(new MyIntegerTask("IntegerTask2")).start();new Thread(new MyStringTask("StringTask2")).start();}public static class MyIntegerTask implements Runnable{private String name;MyIntegerTask(String name){this.name = name;}@Overridepublic void run(){for(int i = 0; i < 5; i++){// ThreadLocal.get方法获取线程变量if(null == MyThreadLocal.threadLocal.get()){// ThreadLocal.et方法设置线程变量MyThreadLocal.threadLocal.set(0);System.out.println("线程" + name + ": 0");}else{int num = (Integer)MyThreadLocal.threadLocal.get();MyThreadLocal.threadLocal.set(num + 1);System.out.println("线程" + name + ": " + MyThreadLocal.threadLocal.get());if(i == 3){MyThreadLocal.threadLocal.remove();}}try{Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}  } }public static class MyStringTask implements Runnable{private String name;MyStringTask(String name){this.name = name;}@Overridepublic void run(){for(int i = 0; i < 5; i++){if(null == MyThreadLocal.threadLocal.get()){MyThreadLocal.threadLocal.set("a");System.out.println("线程" + name + ": a");}else{String str = (String)MyThreadLocal.threadLocal.get();MyThreadLocal.threadLocal.set(str + "a");System.out.println("线程" + name + ": " + MyThreadLocal.threadLocal.get());}try{Thread.sleep(800);}catch (InterruptedException e){e.printStackTrace();}}}}
}

运行结果如下:

调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!

线程IntegerTask1: 0

调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!

线程IntegerTask2: 0

调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!

调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!

线程StringTask1: a

线程StringTask2: a

线程StringTask1: aa

线程StringTask2: aa

线程IntegerTask1: 1

线程IntegerTask2: 1

线程StringTask1: aaa

线程StringTask2: aaa

线程IntegerTask2: 2

线程IntegerTask1: 2

线程StringTask2: aaaa

线程StringTask1: aaaa

线程IntegerTask2: 3

线程IntegerTask1: 3

线程StringTask1: aaaaa

线程StringTask2: aaaaa

调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!

线程IntegerTask2: 0

调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!

线程IntegerTask1: 0

Java并发编程—ThreadLocal用法详解相关推荐

  1. Java并发编程最佳实例详解系列

    Java并发编程最佳实例详解系列: Java并发编程(一)线程定义.状态和属性 Java并发编程(一)线程定义.状态和属性 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中, ...

  2. java并发编程Future类详解

    作用和举例 future类的作用就是为了调用其他线程完成好后的结果,再返回到当前线程中,如上图举例: 小王自己是主线程,叫外卖等于使用future类,叫好外卖后小王就接着干自己的事去了,当外卖到了的时 ...

  3. java 可见性_Java并发编程-volatile可见性详解

    前言 要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸.最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍. 有什么 ...

  4. Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier ...

  5. eval 函数 java_[Java教程]eval()函数用法详解

    [Java教程]eval()函数用法详解 0 2015-12-14 11:00:26 eval()函数用法详解: 此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eval ...

  6. Java并发编程之AQS详解

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  7. Java语言Socket接口用法详解

    Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...

  8. Java并发编程之ConcurrentLinkedQueue详解

    简介 在并发编程中我们有时候需要使用线程安全的队列.如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法.使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两 ...

  9. java中String的用法详解

    在这里先分别对String.StringBuffer.StringBuilder进行解析,在比较三者异同 String String类:代表字符串.Java程序中所有的字符串字面值(如"fd ...

最新文章

  1. java预处理指令region_VS #region
  2. httpwatchv11.1.46.0免费版
  3. LeetCode OJ - Copy List with Random Pointer
  4. UA OPTI501 电磁波 Lorentz Oscillator Model 2 Clausius-Mossotti修正与极化系数
  5. 用matlab生成ASK FSK PSK,通信原理课程设计(matlab实现ASK FSK PSK).doc
  6. c语言实现线程相关操作,如何用C语言实现多线程
  7. 前景检测算法(八)--SACON算法
  8. Zookeeper配置项说明
  9. #《机器学习》_周志华(西瓜书)南瓜书_第4章 决策树
  10. 日语学习软件推荐——五十音图APP:AI纠正你的日语发音
  11. springboot微信登录
  12. 入门DP教程(超详细)
  13. Maya Python脚本入门
  14. Android开发获取连接的WIFI名称
  15. java 设置超时_java线程超时设置方法
  16. java求最大公约数
  17. 分享20个Javascript中的数组方法,收藏
  18. TIA博途中进行积分运算的具体方法
  19. IO流_递归、IO流总结
  20. has been loaded by xml or sqlprovider

热门文章

  1. 平衡二叉查找树 AVL 的实现
  2. xml.modify() 实例演示(二)
  3. 福克斯1.8MT驾驶心得
  4. Linux命令学习(三):文件操作命令(1)
  5. Java Web学习(五)session、cookie、token
  6. 解决@vue/cli 创建项目是安装chromedriver时失败的问题
  7. shell编程基础-简述
  8. 【例4-4】最小花费
  9. CSS 实现隐藏滚动条同时又可以滚动
  10. Window右键添加“用vim打开”