java多线程——ThreadLocal
2017-03-18 20:30
288 查看
ThreadLocal介绍
ThreadLocal可以创建只能由同一线程读取和写入的变量。因此,即使两个线程正在执行相同的代码,并且代码具有对 ThreadLocal变量的引用,那么这两个线程不能看到对方的ThreadLocal变量。实际上ThreadLocal的值是放入了当前线程的一个ThreadLocalMap实例中,所以只能在本线程中访问,其他线程无法访问。可以创建一个指定泛型类型的ThreadLocal对象,这样我们就不需要每次使用get()方法返回的值做强制类型转换。
ThreadLocal优势
ThreadLocal并不是用来并发控制访问一个共同对象,而是为了给每个线程分配一个只属于该线程的对象,更准确的说是为了实现线程间的数据隔离。而ThreadLocal应用场景更多是想共享一个变量,但是该变量又不是线程安全的,那么可以用ThreadLocal维护一个线程一个实例。有时候ThreadLocal也可以用来避免一些参数传递,通过ThreadLocal来访问对象。threadlocal 常用方法
1、public void set(T value):将值放入线程局部变量中2、public T get():从线程局部变量中获取值
3、public void remove():从线程局部变量中移除值(有助于 JVM 垃圾回收)
4、protected T initialValue():返回线程局部变量中的初始值(默认为 null,可以在新建对象时重写initialValue方法)
应用场景
实现单个线程单例以及单个线程上下文信息存储实现线程安全,非线程安全的对象使用ThreadLocal之后就会变得线程安全,因为每个线程都会有一个对应的实例(比如SimpleDateFormat不能直接用作静态变量,线程不安全,但可以使用threadlocal将其改为线程安全的来使用)
承载一些线程相关的数据,避免在方法中来回传递参数
示例代码
public class ThreadLocalPractice { public static void main(String[] args){ new Thread(new MyThread()).start(); new Thread(new MyThread()).start(); } } class MyThread implements Runnable{ private ThreadLocal<Integer> threadLocal = new ThreadLocal<>(); public void run(){ threadLocal.set((int)(Math.random()*1000)); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get()); } }
参考资料
Java ThreadLocal理解Java中的ThreadLocal
相关文章推荐
- Java多线程之ThreadLocal
- java多线程并发控制之ThreadLocal
- Java 多线程之--ThreadLocal 简介
- java多线程详解(5)-Threadlocal用法
- java 多线程(threadlocal)
- Java多线程之ThreadLocal_1
- Java——多线程总结及ThreadLocal、Volatile、synchronized、Atomic四个关键字
- java多线程之ThreadLocal
- java多线程模式ThreadLocal原理简述及其使用详解
- Java多线程10:ThreadLocal的作用及使用
- Java 学习笔记16:用ThreadLocal解决多线程安全问题
- Java多线程——2 ThreadLocal
- java高级进阶关于java多线程的应用 ThreadLocal多线程实例详解
- Java中ThreadLocal类(解决多线程程序中并发问题的一种新思路,主要为参数的拷贝问题)
- Java多线程有哪几种实现方式? Java中的类如何保证线程安全? 请说明ThreadLocal的用法和适用场景(面试题)
- Java多线程――ThreadLocal
- JAVA多线程----ThreadLocal
- Java多线程下 ThreadLocal 的应用实例
- Java多线程中的ThreadLocal
- 【Android应用源码分析】Java多线程:线程本地变量ThreadLocal源码分析