并发问题引出ThreadLocal
ThreadLocal
Thread-->人类
Runnable-->任务类
多线程并发问题引出ThreadLocal
多线程并发问题的原因:
操作同一个对象,对对象具有读写权限(只读如拍照,不会改变什么),几乎或者同时操作
解决这个问题的常规方式:
同步锁,synchronized代码块。
我们知道,使用同步锁的时候,程序运行到这个地方就需要等待,成为一个串。十分影响效率。专业人士测试过,效率慢了100多倍
那么如何解决并发问题呢?
我们将并发问题的原因分离出来。有些操作是必须并发的,有些操作是因为资源的位置等原因出现并发问题的。只要不会修改原来数据的内容,我们为什么不可以给它一个映像呢?
当然,绝对的并发就必须牺牲效率。
ThreadLocal是什么?
ThreadLocal是一个容器。它有三个方法:
void set(T value):保存值
T get():获取值
void remove():移除值
ThreadLocal内部其实是一个Map集合。虽然在使用ThreadLocal的时候只使用了值没有给出键,其实它内部使用了当前线程作为键
Map map=new HashMap<Thread,T>
package cn.itcast.thread; import java.util.HashMap;
import java.util.Map; import org.junit.Test; public class Demo1 { @Test
public void fun1(){
final ThreadLocal<String> t1=new ThreadLocal<String>();
t1.set("hello");
System.out.println(t1.get());
t1.remove();
System.out.println(t1.get());
}
@Test
public void fun2(){
final ThreadLocal<String> t1=new ThreadLocal<String>(); new Thread(){
public void run(){
t1.set("内部类");
System.out.println(t1.get());
}
}.start(); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(t1.get());
}
@Test
public void fun3(){
final Map<Thread,String> map=new HashMap<Thread,String>();
map.put(Thread.currentThread(), "hello");
System.out.println(map.get(Thread.currentThread())); new Thread(){
public void run(){
System.out.println(Thread.currentThread().getName());
System.out.println(map.get(Thread.currentThread()));
}
}.start();
}
} /**
* 它内部是一个Map
*/
class TL<T>{
private Map<Thread,T> map=new HashMap<Thread,T>(); public void set(T data){
map.put(Thread.currentThread(),data);
} public T get(){
return map.get(Thread.currentThread());
} public void remove(){
map.remove(Thread.currentThread());
}
}
/**
* ThreadLocal通常用在一个类的成员上
* 多个线程访问它时,每个线程都有自己的副本,互不干扰
* Hibernate中把Session放到了ThreadLocal中!
*/
class User{
private ThreadLocal<String> usernameT1=new ThreadLocal<String>();
}
并发问题引出ThreadLocal的更多相关文章
- 并发编程 01—— ThreadLocal
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程之五--ThreadLocal
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
- 并发编程之ThreadLocal
并发编程之ThreadLocal 前言 当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了. 数据都被封闭在各自的线程之中,就不需要同步,这 ...
- Java并发编程:ThreadLocal
Java并发编程:深入剖析ThreadLocal Java并发编程:深入剖析ThreadLocal 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用 ...
- Java并发编程--理解ThreadLocal
另一篇博文:Hibernet中的ThreadLocal使用 http://www.cnblogs.com/gnivor/p/4440776.html 本文参考:http://blog.csdn.net ...
- 并发编程之ThreadLocal、Volatile、synchronized、Atomic关键字扫盲
前言 对于ThreadLocal.Volatile.synchronized.Atomic这四个关键字,我想一提及到大家肯定都想到的是解决在多线程并发环境下资源的共享问题,但是要细说每一个的特点.区别 ...
- 并发编程之ThreadLocal源码分析
当访问共享的可变数据时,通常需要使用同步.一种避免同步的方式就是不共享数据,仅在单线程内部访问数据,就不需要同步.该技术称之为线程封闭. 当数据封装到线程内部,即使该数据不是线程安全的,也会实现自动线 ...
- 17.并发容器之ThreadLocal
1. ThreadLocal的简介 在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对临界区资源的同步顺序从而解决线程安全的问题,但是这种加锁的方式会让未获取到 ...
- Java并发编程之ThreadLocal解析
本文讨论的是JDK 1.8中的ThreadLocal ThreadLocal概念 ThreadLocal多线程间并发访问变量的解决方案,为每个线程提供变量的副本,用空间换时间. ThreadLocal ...
随机推荐
- Pycharm context menu disable RUN option
这个问题很坑.正常来说一个文件右键出来的是 Run 选项, 可是近期几个文件都是 Unititest 的測试选项,每次要执行的时候都要手工去配置Run Option,在尝试了: 0. 重置IDE配置 ...
- wireshark:Couldn't run /usr/bin/dumpcap in child process: Permission denied
When start wireshark, I met an error like: 引用 Couldn't run /usr/bin/dumpcap in child process: Permis ...
- 利用asset存储mesh
做mesh导出的时候遇到了这个问题. 最后解决: 存储mesh数据:AssetDatabase.CreateAsset(meshfilter.mesh, "Assets/" + & ...
- iOS表格制作
由于项目上的需求,需要做一个表格出来,来显示流程状态.刚开始脑子一头雾水,没有一点思路,但是靠着自己的座右铭--“世上无难事,只怕有心人”,克服了所有困难.好,不说了,讲正事. 制作表格,还是需要ta ...
- 解决iOS11 UIScrollView下移问题
iOS11 系统为UIScrollView增加一个contentInsetAdjustmentBehavior属性,默认为UIScrollViewContentInsetAdjustmentAutom ...
- fedora25 安装sublime text3
fedora 25安装使用 sublime text 3 安装 sublime text 3 fedora 需要选择 tarball 版本.下载后将 sublime text 3 解压后放到 opt ...
- Lattice绘图
lattice包提供了用于可视化单变量和多变量数据的一整套图形系统.许多用户转向使用lattice包是因为它能很容易地生成网格图形.网格图形能够展示变量的分布或变量之间的关系. 例:data(mtca ...
- ADO.NET概述
xml这类文件它是.net变成环境中优先使用的数据访问借口. ADO.NET传输的数据都是XML格式的 ADO.NET是一组用于和数据源惊醒交互的面向对象类库 数据源:通常是各种数据库,但文本.exc ...
- IOS NSDate 调整当前时间戳为明天
这个可以根据需要调整 在day month hour minute second 等都行 以下是以当前时间戳为基础,调整时间为明天的零点零时零分零秒 可以根据需要 写成毫秒的 +(NSStri ...
- OpenStack Neutron 之 Load Balance
OpenStack Neutron 之 Load Balance 负载均衡(Load Balance)是 OpenStack Neutron 支持的功能之一.负载均衡能够将网络请求分发到多个实际处理请 ...