并发问题引出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 ...
随机推荐
- mysql 存储过程初探
使用存储过程好处在于: 1.隐藏敏感的算法,避免被正常的开发人员看到,把业务逻辑隐藏在数据库中,而非程序代码里 2.简化应用代码程序,放到数据库里肯定就对程序代码简化有好处了 3.不同的开发语言都可以 ...
- hdu 5285 wyh2000 and pupil(二染色)
第一次用vector解得题.值得纪念,这道题是二染色问题,我用bfs解得.就是染色,推断,计数问题,其 实挺简单的,就是得判一下特殊情况,当n<2的时候就不能有解,由于题目要求每一个组至少有一个 ...
- HTTP/HLS/RTMP超级负载测试工具(转)
这个负载测试工具是网游分享的工具,可以在http://blog.csdn.net/win_lin/article/details/11835011 或者https://github.com/winli ...
- Android hellocharts 柱形图详解
近日需要做图表结构的项目,目前最火的就是hellocharts 和MPAndroidChart 相对来说hellocharts集成比较简单: 官网地址 https://github.com/l ...
- 第一课 第一个nodejs程序
这就是我们的第一个程序了 在控制台会输出:hello 我们需要运行该文件 开始->运行 cmd 进入我们的程序目录 我的是D:/nodejs/hello.js 进入程序目录cd D:/nodej ...
- A vectorized example
http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf
- 监控httpd的shell脚本
#!/bin/bash # Apache httpd进程监控shell # 如果你在使用RHEL / CentOS / Fedora Linux,使用这个重启命令 RESTART="/sbi ...
- C# Interactive Shell
C# Pad 有点像VisualStudio中的ImmediateWindow,程序运行中的一些变量都保存着,可以直接从命令行访问,方便执行一些code来进行测试或debug. 上图中右边每一个小时钟 ...
- linux c编程:popen
我们在执行shell命令比如cat /etc/group | grep root的时候,通过管道的机制将cat /etc/group的结果传递给grep root,然后将结果显示出来 linux中提供 ...
- spring mvc 中Uploadify插件的使用
具体过程不写了,直接上代码 jsp代码 $("#uplodefile").uploadify({ 'swf': '/statics/uploadify/uploadify.swf' ...