五、线程本地ThreadLocal
一、线程私有
在多线程情况下,对于一个共享的数据可能会产生线程安全问题。最简单的解决办法就是堆访问共享数据的时候加锁,但我们知道加锁是很影响效率的,尤其是像数据库连接这样耗费资源较多的情况下,加锁就意味着你的程序无法提供高效的服务。
那么我们会这样思考,是否每个线程能够自己独有一份数据呢?这样线程之间不会相互影响,也就不存在数据共享的线程安全问题了,ThreadLocal类便是对于这样的需求的具体实现类。
JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/lang/ThreadLocal.html
二、ThreadLocal类
ThreadLocal类直接继承与Object类,它存在于java.lang包下。
该类使得每个线程拥有自己的局部变量,该变量独立于变量的初始化副本,也就是说每个线程其实是持有着一份拷贝的副本,并不直接使用初始化数据。ThreadLocal的实例通常是private static 字段描述,线程私有的数据将在线程销毁以后随之清除。
构造方法:
ThreadLocal() // 创建一个线程本地变量。
方法摘要:
T get() // 返回此线程局部变量的当前线程副本中的值。 protected T initialValue() // 返回此线程局部变量的当前线程的“初始值”。 void remove() // 移除此线程局部变量当前线程的值。 void set(T value) // 将此线程局部变量的当前线程副本中的值设置为指定值
三、示例
public class ThreadLocalTest { private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() { @Override protected Integer initialValue() { // 初始化值为1 return 1; } }; public static void main(String[] args) { System.out.println("主线程获取初始值副本:" + threadLocal.get()); threadLocal.set(2); // 设置主线程副本值 System.out.println("主线程获取副本新的值:" + threadLocal.get()); new Thread(new Runnable() { @Override public void run() { System.out.println("另起一个线程获取副本值:" + threadLocal.get());; } }).start(); threadLocal.remove(); // 移除主线程的副本 System.out.println("主线程重新获取副本的值:" + threadLocal.get()); } }
控制台打印:
主线程获取初始值副本:1 主线程获取副本新的值:2 另起一个线程获取副本值:1 主线程重新获取副本的值:1
从示例中我们看到:
主线程拷贝了一份初始值1,然后设置了初始值2,另起一个线程又从初始值中拷贝了1,与主线程设置的值无关。
当主线程移除了副本以后,再次调用get()方法则将再次从初始值中拷贝。
注意:如果没有重写initialValue,那么get()方法将取到null值。
五、线程本地ThreadLocal的更多相关文章
- 深入理解线程本地变量ThreadLocal
ThreadLocal理解: 假设在多线程并发环境中.一个可变对象涉及到共享与竞争,那么该可变对象就一定会涉及到线程间同步操作,这是多线程并发问题. 否则该可变对象将作为线程私有对象,可通过Threa ...
- 线程本地变量ThreadLocal源码解读
一.ThreadLocal基础知识 原始线程现状: 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用synchronized进行线程同步.但是Spring中的各种模板 ...
- 线程本地变量ThreadLocal
一.本地线程变量使用场景 并发应用的一个关键地方就是共享数据.如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性.这意味 ...
- Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic
Atitit usrqbg1821 Tls 线程本地存储(ThreadLocal Storage 规范标准化草案解决方案ThreadStatic 1.1. ThreadLocal 设计模式1 1.2. ...
- 线程本地变量ThreadLocal (耗时工具)
线程本地变量类 package king; import java.util.ArrayList; import java.util.List; import java.util.Map; impor ...
- ThreadLocal 线程本地变量 及 源码分析
■ ThreadLocal 定义 ThreadLocal通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量 ...
- 线程本地变量ThreadLocal (耗时工具)【原】
线程本地变量类 package king; import java.util.ArrayList; import java.util.List; import java.util.Map; impor ...
- Java并发(二十):线程本地变量ThreadLocal
ThreadLocal是一个本地线程副本变量工具类. 主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的 ...
- ThreadLocal(线程本地存储)
1. ThreadLocal,即线程本地变量或线程本地存储. threadlocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的 ...
随机推荐
- 深入了解java虚拟机(JVM) 第十章 字节码指令
一.字节码指令的含义 Java字节码指令由一个字节长度的,代表某种特定操作含义的数字(操作码)以及其后的零至多个代表此操作所需参数(操作数).此外字节码指令是面向操作数栈的,这里操作数栈在功能上对应实 ...
- 【Quartz】一个小Demo
Quartz是一个优秀的框架,功能强大,用法简单,比如说下面这个例子. (1)引入Jar包 <!-- quartz 模块 --> <dependency> <groupI ...
- 第一站:CLion安装教程与环境配置
原文来自:http://www.sunmey.cn/thread-129-1-1.html 本人:找了很久才找到的CLion安装教程与环境配置,这里分享给大家~ 这里要说明的一点是CLion是要钱的, ...
- 无比迅速敏捷地开发iOS超精美控件
目录 前言 设计 编码 PaintCode 前言 自从人生第一篇博客<iOS中的预编译指令的初步探究>问世以来 浏览量竟然达到了360多,(路过的大神勿笑!)这些浏览量使我兴奋异常但又令我 ...
- npm install 报错:ERR! code EINTEGRITY 解决方案
npm升级后,npm install 报错了,报错信息:ERR! code EINTEGRITY到处百度搜索解决方案,终于找到了!“npm cache verify”这条命令帮助了不少人 npm ca ...
- hiho#1449 重复旋律6 求长度为k的串最大次数 后缀自动机
题目传送门 题目大意:求长度为k的串的最大次数,把k从1到length的所有答案全部输出. 思路: 这道题放在$SAM$里就是求长度$k$对应的所有$right$集中最大的大小. 我们以$aabab$ ...
- MongoDB学习笔记(二)
MongoDB的其他方法: 显示指定数目的数据: 1.在mongodb中查询指定数目的记录,可以使用: db.collectionname.find().limit(number); 2.在mongo ...
- Mac下Go2Shell打开配置界面
open -a Go2Shell --args config
- javascript中的抽象相等==与严格相等===
1.数据类型:String,Number,Boolean,Object,Null,Undefined 2.抽象相等:x==y A.两者数据类型相同:typeof x == typeof y a.Str ...
- 比特 字节 兆 GB转换
bit:比特byte:拜特(字节) 1字节=8比特k:千KB:千字节 1KB = 1024 byteMB:兆字节GB:千兆字节 //少用 Kb:千比特 Mb:兆比特 Gb:千兆比特