并发问题引出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 ...
随机推荐
- linux用一键安装包 禅道
----------------1.重启apache 和 mysql /opt/zbox/zbox restart -----------------2.问题1:发现端口被占用 apache启动报错( ...
- DM8168 自己主动登录root用户
①指定连接: <DM8168># ln -s /bin/busybox /sbin/getty ②改动/etc/inittab文件: <DM8168># vi /etc/ini ...
- VMWare虚拟机下为Ubuntu 12.04.2配置静态IP(NAT方式)
http://www.cnblogs.com/objectorl/archive/2012/09/27/vmware-ubuntu-nat-static-ip-settings.html 参考以上方式 ...
- centos7.0 安转mysql5.7
安装mysql5.7需要boost依赖包groupadd mysql useradd -r -g mysql -s /bin/false mysql cmake . -DCMAKE_INSTALL_P ...
- Sitemesh3的使用心得
项目中用到了sitemesh3,就把使用心得记下来,至于配置之类的,官方网站都有,这里只是写下自己对它的理解,方便再次理解, sitemesh是基于过滤器的原理,拦截到符合配置文件中配置的路径,然后会 ...
- http => https 升级
准备证书 阿里云安全(云盾)-> CA证书服务,购买证书,个人测试的话可以使用免费的,期限1年. 购买证书后,把域名与证书进行绑定,提交审核,大概10分钟左右,正常情况下审核就可以通过.证书准备 ...
- java.util包下面的类---------01---示意图
一直在使用util包下面的这些类,甚至有些没用过的,想要都去认识认识他们!也许在未来的一天可以用到! 图太大不好截图!部分没有截全!
- Struts中类型转换踩的坑
出现的异常: 当我输入的数据很大时候,转换后如上,这并不是我想要的, 出现问题的原因: Struts2对常用的数据类型如String.Integer.Double等都添加了转换器进行对应的转换操作. ...
- Future Promise 模式(netty源码9)
netty源码死磕9 Future Promise 模式详解 1. Future/Promise 模式 1.1. ChannelFuture的由来 由于Netty中的Handler 处理都是异步IO ...
- Webpack探索【7】--- sourceMap、自动构建刷新功能详解
本文主要讲sourceMap.自动构建刷新功能.