【概述】

线程局部变量,是一种多线程间并发访问变量的解决方案。与synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。

从性能上讲,ThreadLocal不具有绝对的优势,在并发不是很高的时候,加锁的性能会更好,但作为一套与锁完全无关的线程安全解决方案,在并发量很高或者竞争激烈的场景,使用ThreadLocal可以在一定程度上减少锁竞争。

【实例】

public class Test{
public static void main(String[] args) throws Exception{ ThreadLocalDemo.setLong(666L);
ThreadLocalDemo.setString("666sss");
ThreadLocalDemo.getAll(); //新线程t1
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
ThreadLocalDemo.setLong(100L);
ThreadLocalDemo.setString("100sss");
ThreadLocalDemo.getAll();
}
}); //启动新线程t1
t1.start(); Thread.sleep(1000);
ThreadLocalDemo.getAll();
}
} class ThreadLocalDemo{ public static ThreadLocal<String> localString = new ThreadLocal<>(); public static ThreadLocal<Long> localLong = new ThreadLocal<>(); public static void setLong(Long l){
localLong.set(l);
}
public static void setString(String s){
localString.set(s);
}
public static void getAll(){
System.out.println("localString.get()=" + localString.get() + ",localLong.get()=" + localLong.get());
} }

【运行结果】

19_ThreadLocal的更多相关文章

随机推荐

  1. Ubuntu16.04安装视觉SLAM环境(ceres-solver)

    1.先在github上下载ceres-solver git clone https://github.com/ceres-solver/ceres-solver.git 2.安装ceres-solve ...

  2. yield return 的使用方法

    以下代码,返回List,list内容为大于60的项 public Form1() { InitializeComponent(); } private void Form1_Load(object s ...

  3. ios模拟器安装测试包方法

    1. 使用ios-sim ios-sim是一个可以用命令空着ios模拟器的工具.利用这个命令,我们可以启动模拟器.安装app.启动app.查询ios sdk,它可以使我们像自动化测试一样打开xcode ...

  4. Python+Selenium之cannot focus element 解决方法

    有时候刚进入页面输入第一个值时脚本会报错:cannot focus element 贴下我的脚本和解决办法供大家参考 我原本的脚本是: WebDriverWait(driver,15,0.5).unt ...

  5. python pandas使用一些协程

    import pandas as pd def coroutine(func): """装饰器:向前执行到第一个`yield`表达式,预激`func`"&quo ...

  6. oracle--等待事件

    1. Buffer busy waits 从本质上讲,这个等待事件的产生仅说明了一个会话在等待一个Buffer(数据块),但是导致这个现象的原因却有很多种,常见的两种是:当一个会话试图修改一个数据块, ...

  7. Vim改装成一个IDE编程环境

      1 写在前面   Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个 ...

  8. 【ExtJS】 布局Layout

    布局用于定义容器如何组织内部子元素和控制子元素的大小. ExtJS中有两种类型的布局:Container容器类布局与Component组件类布局. Containter容器类布局:负责容器内容Extj ...

  9. 从外网GitHub clone开源项目的时候,.git文件过大,导致克隆慢

    以clone impala为例,主要是加入-depth=1参数: git clone -b cdh4-2.0 --depth=1 https://github.com/cloudera/Impala. ...

  10. Notepad++如何删除空行和空白字符

    Notepad++如何删除空行和空白字符 1.Notepad++编辑器在编辑选项里面包括很多功能,编辑->行操作->移除空行(包括空白字符). 2.Notepad++查找替换支持正则替换. ...