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如果单纯从名字上来看像是“本地 ...
随机推荐
- Mysql表名区分大小写
mysql数据库在windows服务器上表名和字段名均不区分大小写, 但在linux服务器上表名默认是区分大小写的,可在/etc/my.cnf文件中的[mysqld]下面加上一条配置 lower_ca ...
- bug记录_document.defaultview.getcomputedstyle()
页面中使用document.defaultview.getcomputedstyle()在火狐下取不到值. 原本方法现在$(document).ready()中,换到window.onload里就可以 ...
- Arch最小化安装X
Xorg xorg-server 安装xorg-server pacman -S xorg-server 可选:xorg-server-utils pacman -S xorg-server-util ...
- 在 iOS 应用中直接跳转到 AppStore 的方法
找到应用程序的描述链接,在itunes中找到相应的应用,(如下图),点击免费右边的下方向键,选择复制链接,就拿到了对应的app的描述链接 比如:https://itunes.apple.com/c ...
- 在textarea的内容后面增加内容
document.getElementById("result").value+=data+"\n>"; 本文为本人用来记录自己做的一些东西,如有不对的地 ...
- android Handler vs Timer
Handler vs Timer 在我们Android开发过程中,经常需要执行一些短周期的定时任务,这时候有两个选择Timer或者Handler.然而个人认为: Handler 在多个方面比Timer ...
- oracle11g 卸载和安装(win7,32位)
完全卸载oracle11g步骤:1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.2. 开始->程序->Oracle - OraDb11 ...
- kindle使用参考
转载链接:http://blog.sina.com.cn/nuanfengjia 今天买的kindle499刚刚到货了,体验略差,还有一个就是无按键,完全不会玩,只能自己慢慢摸索了. [新Kindle ...
- hdu 1020
//自信满满地交上去~~but...超时了 #include <iostream> #include <string.h> #include <stdio.h> u ...
- Cake
Cake Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...