多线程6:线程封闭与ThreadLocal
来源:互联网 发布:多益网络 徐波 编辑:程序博客网 时间:2024/04/29 03:38
当访问共享可变数据时,通常需要使用同步,同步是需要消耗性能的
一种避免使用同步的方式就是不共享数据:如果数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的技术称为线程封闭
一,Ad-hoc线程封闭
维护线程封闭性的职责完全由程序实现来承担,是非常脆弱的,因为没有任何一种语言特性,如可见性修饰符或局部变量,能将对象封闭到目标线程上
二,栈封闭
局部变量的固有属性之一就是封闭在执行线程之中,他们位于执行线程的栈中,其它线程无法访问这个栈,比Ad-hoc线程封闭更易于维护,也更加健壮
特别要注意的是要防止引用逸出(引用逸出参见:http://blog.csdn.net/a19881029/article/details/8165188)
三,使用ThreadLocal类
ThreadLocal<T>在每一个线程上创建一个T的副本,副本之间彼此独立,互不影响
概念上ThreadLocal<T>相当于Map<Thread,T>(并非是这么实现的),这些特定于线程的T保存在各自的线程对象中,当线程终止时这些值会作为垃圾回收
public class Task implements Runnable {private static ThreadLocal<Double> value = new ThreadLocal<Double>(){@Overrideprotected Double initialValue() {return Math.random();}};public void run() {System.out.println(value.get());}public static void main(String[] args) {Task t = new Task();Thread td1 = new Thread(t);Thread td2 = new Thread(t);td1.start();td2.start();}}
运行结果:
0.53312581247542180.5878812452143902
每个线程的value值是相互独立的
ThreadLocal类的4个方法:
initialValueprotected T initialValue()返回此线程局部变量的当前线程的“初始值”。线程第一次使用 get() 方法访问变量时将调用此方法,但如果线程之前调用了 set(T) 方法,则不会对该线程再调用 initialValue 方法。通常,此方法对每个线程最多调用一次,但如果在调用 get() 后又调用了 remove(),则可能再次调用此方法。 该实现返回 null;如果程序员希望线程局部变量具有 null 以外的值,则必须为 ThreadLocal 创建子类,并重写此方法。通常将使用匿名内部类完成此操作。 返回:返回此线程局部变量的初始值--------------------------------------------------------------------------------getpublic T get()返回此线程局部变量的当前线程副本中的值。如果变量没有用于当前线程的值,则先将其初始化为调用 initialValue() 方法返回的值。 返回:此线程局部变量的当前线程的值--------------------------------------------------------------------------------setpublic void set(T value)将此线程局部变量的当前线程副本中的值设置为指定值。大部分子类不需要重写此方法,它们只依靠 initialValue() 方法来设置线程局部变量的值。 参数:value - 存储在此线程局部变量的当前线程副本中的值。--------------------------------------------------------------------------------removepublic void remove()移除此线程局部变量当前线程的值。如果此线程局部变量随后被当前线程读取,且这期间当前线程没有设置其值,则将调用其 initialValue() 方法重新初始化其值。这将导致在当前线程多次调用 initialValue 方法。
四,单线程
当某个对象封闭在一个线程中时,线程是安全的,即使被封闭的对象本身不是线程安全的
- 多线程6:线程封闭与ThreadLocal
- ThreadLocal<T> 与线程封闭
- Threadlocal实现线程封闭
- java ThreadLocal及线程封闭
- Java多线程-线程封闭
- Java中线程封闭之ThreadLocal
- ThreadLocal实现方式&使用介绍---无锁化线程封闭
- JAVA并发编程7_线程封闭:ThreadLocal类
- ThreadLocal实现方式&使用介绍---无锁化线程封闭
- ThreadLocal实现方式&使用介绍—无锁化线程封闭
- Java并发编程--线程封闭(Ad-hoc、栈、ThreadLocal)
- ThreadLocal实现方式&使用介绍---无锁化线程封闭 (r)
- Java并发编程:线程封闭和ThreadLocal详解
- Java并发编程:线程封闭和ThreadLocal详解
- java 多线程基础知识3----线程封闭
- Java多线程之线程封闭(三)
- ThreadLocal与多线程
- ThreadLocal 与线程池
- POJ 并查集 题目汇总 ——czyuan原创
- C++易忽略点学习递归函数的调用超清晰分析(二)
- hdu 1711 (Number Sequence)
- Ubuntu 下UFW防火墙简单设置攻略
- 6行代码抓取网页
- 多线程6:线程封闭与ThreadLocal
- The Logger in Java and Android
- JSP,servlet容器,Tomcat,servlet容器之间的关系
- 黑马程序员-分散的知识点
- 【昊昊带你学】算法概述
- 第四次实验任务
- 【12】Adds two numbers represented by a linked list and returns the sum as a linked list
- 【昊昊带你学】基本数据结构(上)
- Problem E