ThreadLocal类及常用的线程安全类探究
1.ThreadLocal类
ThreadLocal是Thread Local Variable的简称,意思是线程局部变量。作用是为每一个使用该变量的线程都提供一个该变量的副本,使每一个线程都能独立操作这个副本而不会与其他线程的副本冲突。
ThreadLocal在java.lang包下,是从jdk1.2就有的类,在jdk5.0之后加入了泛型支持。常用的方法也就三个:
T get():返回此线程局部变量中当前线程副本的值
set(T value):设置此线程局部变量中当前线程副本的值
remove():删除此线程局部变量中当前线程副本
ThreadLocal和其他所有的同步机制一样,都是为了解决多个线程对同一变量的访问冲突。
在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的,该变量是多个线程共享的,系统并没有将这份资源复制多份,只是采用了安全机制来控制对这份资源的访问而已。
而ThreadLocal将需要并发访问的资源复制多份,每个线程拥有自己的资源副本,从而也就没有必要对该变量进行同步了。
2.线程安全的类
以Concurrent开头的集合类,都在java.util.concurrent包下,这种集合类采用更复杂的算法来保证永远不会锁住整个集合(并发写入时加锁,读取时不加锁),因此在并发写入时有较好的性能。最常用的是ConcurrentHashMap
ConcurrentHashMap在默认情况下最多支持16个线程并发写入,如果没有设置,则超过16个线程并发向该Map中写入数据时,可能会有一些线程需要等待,可以在创建ConcurrentHashMap实例时调用某个带参构造器显式指定。
以CopyOnWrite开头的集合类,也在java.util.concurrent包下,最常用的是CopyOnWriteArrayList、CopyOnWriteArraySet
ThreadLocal类及常用的线程安全类探究的更多相关文章
- ThreadLocal类使用说明
ThreadLocal类用于创建一个线程本地变量 在Thread中有一个成员变量ThreadLocals,该变量的类型是ThreadLocalMap,也就是一个Map,它的键是threadLo ...
- java中ThreadLocal类的详细介绍(详解)
ThreadLocal简介 变量值的共享可以使用public static的形式,所有线程都使用同一个变量,如果想实现每一个线程都有自己的共享变量该如何实现呢?JDK中的ThreadLocal类正是为 ...
- 线程变量---ThreadLocal类
用处:保存线程的独立变量.对一个线程类(继承自Thread) 思想:如果一个资源会引起线程竞争,那就为每一个线程配置一个资源.相比于synchronized是一种空间换时间的策略 当使用ThreadL ...
- 用ThreadLocal类实现线程安全的正确姿势
大家通常知道,ThreadLocal类可以帮助我们实现线程的安全性,这个类能使线程中的某个值与保存值的对象关联起来.ThreadLocal提供了get与set等访问接口或方法,这些方法为每个使用该变量 ...
- Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类
1.线程范围内共享变量 1.1 前奏: 使用一个Map来实现线程范围内共享变量 public class ThreadScopeShareData { static Map<Thread, In ...
- 线程系列5--java中的ThreadLocal类实现线程范围内的数据共享(二)
ThreadLocal类可以理解成一个类似与map集合使用,以当前线程当做key 来使用,将线程氛围内需要共享的数据当做value,形成键值对的形式使用.ThreadLocal和线程同步机制都是为了解 ...
- 深入理解java:2.4. 线程本地变量 java.lang.ThreadLocal类
ThreadLocal,很多人都叫它做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多. 可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那样每个线程可以访问自己内 ...
- ThreadLocal类详解:原理、源码、用法
以下是本文目录: 1.从数据库连接探究 ThreadLocal 2.剖析 ThreadLocal 源码 3. ThreadLocal 应用场景 4. 通过面试题理解 ThreadLocal 1.从数据 ...
- ThreadLocal类详解
学习一个东西首先要知道为什么要引入它,就是我们能用它来干什么.所以我们先来看看ThreadLocal对我们到底有什么用,然后再来看看它的实现原理. ThreadLocal如果单纯从名字上来看像是“本地 ...
随机推荐
- JQ N级导航
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Rational Rose 2003 逆向工程转换C++ / VC++ 6.0源代码成UML类图
目录 1.安装&破解Rational Rose 2003 1.1 安装Rose 2003 1.2 破解Rose 2003 1.3运行出错“没有找到suite objects.dl” 2. Ra ...
- tableviewcell 中使用autolayout自适应高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { [ce ...
- lepus监控OS配置
Lepus通过snmp协议进行对操作系统数据采集,因此需要在监控机和被监控机开启snmp服务 snmp协议:简单网络管理协议(SNMP,Simple Network Management Protoc ...
- PHP中require和include的区别
include()与require()的功能相同 include(include_once) 与 require(require_once)都是把把包含的文件代码读入到指定位置来,但是二者再用法上有区 ...
- 错误: symbol lookup error: /usr/local/lib/libreadline.so.6: undefined symbol: PC
su - root mkdir temp mv /local/ldconfig apt-get update
- Codeforces 691D Swaps in Permutation
Time Limit:5000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Status Prac ...
- Python 数据分析包:pandas 基础
pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包 类似于 Numpy 的核心是 ndarray,pandas 也是围绕着 Series 和 DataFrame 两个核心数据 ...
- Spring 框架理论基础
一. IOC 控制反转 概念解释:当我需要一个资源时,容器已经帮我准备好,我只需要接受就可以. // 加载 IOC 容器 ApplicationContext ac = new ClassPathXm ...
- LINUX修改IP地址
以前都是使用自动IP动态分配获取IP的,虽然每次获得的ip都是相同的,但我还是决定自己设置一个IP.输入命令:[root@localhost ~]# ifconfig eth0 219.246.177 ...