`

Java threadLocal类 笔记

    博客分类:
  • JAVA
阅读更多

ThreadLocal 类是JDK .lang包下的一个类,该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
简单来说,比如说一个非线程安全的对象HashMap。并且碰巧你并不需要在不同的线程中共享这个属性,也就是说这个属性不存在 跨线程的意义。那么你不要sychronize这么复杂的东西,ThreadLocal不错。

 

ThreadLocal类存在一个内部类ThreadLocalMap,该map用于维护每个线程所对应的参数,它以Thread.currentThread()为key,来存储当前线程所有需要的变量参数;

    /**
     * Sets the current thread's copy of this thread-local variable
     * to the specified value.  Most subclasses will have no need to 
     * override this method, relying solely on the {@link #initialValue}
     * method to set the values of thread-locals.
     *
     * @param value the value to be stored in the current thread's copy of
     *        this thread-local.
     */
    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

 

看一个简单的demo:起3个线程,都去调用一个公共的ThreadLocal中的HashMap,并打印。

package demo;

import java.util.HashMap;

public class ThreadLocalTest {

	public static ThreadLocal map0 = new ThreadLocal() {

		@Override
		protected HashMap initialValue() {
			System.out
					.println(Thread.currentThread().getName()
							+ " ThreadLocalTest - initialValue() - do initial with hashMap");
			return new HashMap();
		}
	};

	public void run() {
		Thread[] runItem = new Thread[3];

		for (int i = 0; i < runItem.length; i++) {
			runItem[i] = new Thread(new T1(i));
		}

		for (int i = 0; i < runItem.length; i++) {
			runItem[i].start();
		}
	}

	class T1 implements Runnable {

		int id;

		public T1(int id) {
			this.id = id;
		}

		@Override
		public void run() {
			System.out.println(Thread.currentThread().getName()
					+ " T1 - run() - start to work");
			HashMap map = map0.get();
			for (int i = 0; i < 10; i++) {
				map.put(i, i + id * 100);
				try {
					Thread.sleep(100);
				} catch (Exception ex) {
				}
			}
			System.out.println(Thread.currentThread().getName()
					+ " T1 - run() - println hashMap >> " + map);
		}

	}

	public static void main(String[] args) {
		ThreadLocalTest threadts = new ThreadLocalTest();
		threadts.run();
	}
}

 


------------------------------------------------------------------------------------
输出结果如下:
Thread-0 T1 - run() - start to work
Thread-0 ThreadLocalTest - initialValue() - do initial with hashMap
Thread-2 T1 - run() - start to work
Thread-2 ThreadLocalTest - initialValue() - do initial with hashMap
Thread-1 T1 - run() - start to work
Thread-1 ThreadLocalTest - initialValue() - do initial with hashMap
Thread-0 T1 - run() - println hashMap >> {0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
Thread-1 T1 - run() - println hashMap >> {0=100, 1=101, 2=102, 3=103, 4=104, 5=105, 6=106, 7=107, 8=108, 9=109}
Thread-2 T1 - run() - println hashMap >> {0=200, 1=201, 2=202, 3=203, 4=204, 5=205, 6=206, 7=207, 8=208, 9=209}

很明显可以看出,虽然Thread-0、Thread-1、Thread-2 都是共享一个ThreadLocal,但是每个线程都在操作自己的HashMap.

分享到:
评论

相关推荐

    Java并发编程学习笔记

    7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile底层实现原理 11、AQS源码分析 12、CAS原理分析和使用场景 13、...

    java线程学习笔记

    2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...

    免费分享 Java面试笔记 面试八股文 计算机网络基础

    Java并发编程:ThreadLocal、Java内存模型、锁、并发工具类、线程池等;JVM(Java虚拟机):Java内存管理详解、垃圾回收机制、垃圾回收器等;MySQL:基础知识、存储引擎、日志、SQL优化、数据索引、锁、事务、高可用...

    优雅的使用 ThreadLocal

    Java的 Web项目大部分都是基于 Tomcat,每次访问都是一个新的线程,这样让我们联想到了 ThreadLocal,每一个线程都独享一个 ThreadLocal,在接收请求的时候 set特定内容,在需要的时候 get这个值。下面我们就进入...

    Java并发编程(学习笔记).xmind

    ThreadLocal类 只读共享:不变对象一定是线程安全的 尽量将域声明为final类型,除非它们必须是可变的 分类 不可变对象 事实不可变对象 线程安全共享 封装有助于管理复杂度 线程...

    Java多线程源码笔记.pdf

    1.什么是多线程 2.Thread类解析 3.使用多线程需要注意的问题 4.synchronized锁和lock锁 5.AQS 6.ReentrantLock和ReentrantReadWriteLock 7.线程池 8.死锁 9.线程常用的工具栏 10.Atomic 11.ThreadLocal

    Java学习笔记-个人整理的

    {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{subsection.1.3.1} {1.4}数据类型}{23}{section.1.4} {...

    java并发学习笔记

    文章目录1 线程基础、线程之间的共享与协作1.1 cpu时间片轮询机制1.2 ...ThreadLocal1.11 wait()、notify()和notifyAll()方法1.11.1 锁池和等待池1.11.2 wait()方法1.11.3 notify()和notifyAll()方法1.11.4 wait()和...

    java8源码-note:笔记

    笔记 1.Java基础 1.1 关于随机数的生成 1.2 ArrayList clear() 与 removeAll 的实现 1.3 包装类型 1.4 关于JVM 1.5 泛型 1.6 锁 1.7 浮点数 1.8 ArrayList.toArray() 1.9 String 1.10 HTTP 1.11 HashMap 2.进阶 2.1 ...

    java8源码-ac_babel:一些后端学习笔记整理

    java8 源码 设计模式 java 并发 public class Foo { // SimpleDateFormat is not thread-safe, so give one to each thread private static final ThreadLocal formatter = new ThreadLocal(){ @Override protected ...

    day020-继承加强和设计模式代码和笔记.rar

    1. 单元测试:(掌握) 1. 写一个单元测试类,命名方式:XxxTest(测试类没有...6. ThreadLocal类 (掌握简单使用): 解决了线程安全问题,通过线程隔离有安全问题的数据实现的,底层是通过map保存线程id和值的。

    百度地图开发java源码-MD-Notes:计组、操作系统、数据结构、网络IO、Redis、MySQL、JVM等笔记

    百度地图开发java源码 MD-Notes:后端笔记总结 关于 MD-Notes: 业余时间学习技术的同时,做一些记录和总结并乐于分享。...:线程状态,ThreadLocal,强软弱虚引用,自定义线程池 :类加载过程,双亲委派机制 :syncro

    并发编程笔记20190526.docx

    2. ThreadLocal辨析 11 3. 线程间的协作 19 4. 面试题 21 第二章 线程的并发工具类 21 一、 Fork/Join框架的介绍 21 1、实现步骤: 22 2、工作窃取算法 22 3、分而治之 23 4、Fork/Join使用的标准范式 24 5、Fork/...

    javajdk源码学习-JavaSourceLearn:JDK源码学习

    逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 AbstractStringBuilder 1 StringBuffer 1 StringBuilder 1 Boolean 2 Byte...

    HongsCORE:洪的通用对象请求引擎

    HongsCORE framework for Java文档版本: 19.01.12软件版本: 1.0.2-20201212设计作者: 黄弘(Hongs)技术支持:HongsCORE 即 Hong's Common Object Requesting ... 具体到这个 Java 版本中, 利用 ThreadLocal 以及 Tom

Global site tag (gtag.js) - Google Analytics