Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【并发编程】您知道threadLocal吗

【并发编程】您知道threadLocal吗

作者头像
周杰伦本人
发布于 2022-10-25 07:15:10
发布于 2022-10-25 07:15:10
26000
代码可运行
举报
文章被收录于专栏:同步文章同步文章
运行总次数:0
代码可运行

ThreadLocal概念:线程局部变量 是一种多线程间并发访问变量的解决方案 与synchronized等加锁的方式不同 ThreadLocal完全不提供锁 而使用用空间换时间的手段 为每个线程提供变量的独立副本 以保障线程安全 从性能说 ThreadLocal不具有绝对的优势 在并发不是很高的时候 加锁的性能会更好 但作为一套与锁完全无关的线程安全解决方案 在高并发量或竞争激烈的场景 使用ThreadLocal可以在一定程度上减少锁竞争

下面给出一个demo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ConnThreadLocal {

	public static ThreadLocal<String> th = new ThreadLocal<String>();
	
	public void setTh(String value){
		th.set(value);
	}
	public void getTh(){
		System.out.println(Thread.currentThread().getName() + ":" + this.th.get());
	}
	
	public static void main(String[] args) throws InterruptedException {
		
		final ConnThreadLocal ct = new ConnThreadLocal();
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				ct.setTh("张三");
				ct.getTh();
			}
		}, "t1");
		
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
					ct.getTh();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}, "t2");
		
		t1.start();
		t2.start();
	}
	
}

线程1设置threadLocal的值 在线程2中是获取不到的

threadlocal 底层就是hashmap 用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	//当前线程共享同样的数据
    public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();

	productMapper.insert(product);
    //mybatis-plus能自动获取到刚才这个数据的自增id
    log.debug("刚才的商品的id:{}",product.getId());
    threadLocal.set(product.getId());
    
    .....		

	reduction.setProductId(threadLocal.get());
    productFullReductionMapper.insert(reduction);

什么时候使用:

同一次调用,也就是同一个线程,只要上面方法的数据,下面要用。我们就可以用ThreadLocal共享数据 保证线程安全

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
并发编程
线程安全 线程安全概念 : 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. synchronized : 可以在任意对象及方法上加锁,而加锁的这段代码称为"互斥区"或"临界区". 总结 : 当多个 线程访问myThread的run方法时,以排队的方式进行处理(这里排队是按照CPU分配的先后顺序而定的),一个线程想要执行synchronized修饰的方法里的代码,首先 是尝试获得锁,如果拿到锁,执行synchronized方法体的内容;拿不到锁,这个线程就会不断的尝试获得这把锁,直到拿到为止,而且是多个线程同时去竞争这把锁.(也就是会有锁竞争的问题)
海仔
2019/08/06
5370
Java并发编程基础
在不同的 JVM 以及 操作系统 上,线程规划会存在差异,有些操作系统甚至会忽略对线程优先级的设定。 线程优先级不能作为程序正确性的依赖,因为操作系统可以完全不用理会 Java 线程对于优先级的设定。
103style
2022/12/19
2260
Java并发编程基础
java并发编程学习: ThreadLocal使用及原理
多线程应用中,如果希望一个变量隔离在某个线程内,即:该变量只能由某个线程本身可见,其它线程无法访问,那么ThreadLocal可以很方便的帮你做到这一点。  先来看一下示例: package yjmyzz.test; public class ThreadLocalTest1 { public static class MyRunnable implements Runnable { private ThreadLocal<Integer> threadLocal = new
菩提树下的杨过
2018/01/19
6220
ThreadLocal不好用?那是你没用对!
在 Java 中,如果要问哪个类使用简单,但用好最不简单?我想你的脑海中一定会浮现出一次词——“ThreadLocal”。 ​
磊哥
2021/05/17
5570
ThreadLocal不好用?那是你没用对!
线程安全问题演示
线程安全是指某个方法或某段代码,在多线程中能够正确的执行,不会出现数据不一致或数据污染的情况,我们把这样的程序称之为线程安全的,反之则为非线程安全的。在 Java 中,解决线程安全问题有以下 3 种手段:
磊哥
2022/05/10
4700
线程安全问题演示
ThreadLocal使用学习
ThreadLocal字面上的意思是局部线程变量,每个线程通过ThreadLocal的get和set方法来访问和修改线程自己独有的变量。简单地说,ThreadLocal的作用就是为每一个线程提供了一个独立的变量副本,每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
技术从心
2020/12/03
8230
ThreadLocal使用学习
宇智波程序笔记8-【高并发】ThreadLocal学会了这些,你也能和面试官扯皮了!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
不会飞的小鸟
2020/08/26
3100
Java 并发编程·Java 并发
可能正在运行,也可能正在等待 CPU 时间片。包含了操作系统线程状态中的 Running 和 Ready。
数媒派
2022/12/01
2.8K0
2025 年 Java 秋招面试必看的 Java 并发编程面试题汇总
我将从Java并发编程的基础概念、关键机制、工具类等方面入手,为你提供一篇涵盖技术方案与应用实例的文章,助你备战2025年Java秋招面试。
啦啦啦191
2025/06/19
650
2025 年 Java 秋招面试必看的 Java 并发编程面试题汇总
Java并发:ThreadLocal的简单介绍
前面在线程的安全性中介绍过全局变量(成员变量)和局部变量(方法或代码块内的变量),前者在多线程中是不安全的,需要加锁等机制来确保安全,后者是线程安全的,但是多个方法之间无法共享
汤圆学Java
2021/05/27
3100
一文说清楚ThreadLocal
当多个线程对同一变量进行写操作的时候,容易出现线程安全问题,所以就会用到对应的锁和其他一些方法,我们先不介绍锁,先介绍ThreadLocal, ThreadLocal字面意思本地线程,ThreadLocal使每个线程之间是隔离的,数据是独立的,我们使用过session都知道 session是一个会话,我们可以用它来存储一些用户的基本信息,这样每个用户在服务端都能取到,ThreadLocal也可以做到,ThreadLocal将相应的信息存储在当前的线程中,只有当前线程能够访问,其他线程不能访问,这样就能保证线程安全,其实ThreadLocal是一个定制化的Map。
小四的技术之旅
2022/07/26
3320
ThreadLocal及InheritableThreadLocal的原理剖析
我们知道,线程的不安全问题,主要是由于多线程并发读取一个变量而引起的,那么有没有一种办法可以让一个变量是线程独有的呢,这样不就可以解决线程安全问题了么。其实JDK已经为我们提供了ThreadLocal这个东西。
Java学习录
2019/04/18
5950
Java 并发核心机制
Java 的 java.util.concurrent 包(简称 J.U.C)中提供了大量并发工具类,是 Java 并发能力的主要体现(注意,不是全部,有部分并发能力的支持在其他包中)。从功能上,大致可以分为:
静默虚空
2020/01/02
5000
Java并发编程:深入剖析ThreadLocal
Java并发编程:深入剖析ThreadLocal   想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。   以下是本文目录大纲:   一.对ThreadLocal的理解   二.深入解析ThreadLocal类   三.ThreadLocal的应用场景   若有不正之处请多多谅解,并欢迎批评指正。
Ryan-Miao
2018/03/13
7400
Java并发编程:深入剖析ThreadLocal
使用 ThreadLocal 如何避免内存泄漏?
每个线程需要一个独享对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)
Java识堂
2020/02/18
2.4K0
使用 ThreadLocal 如何避免内存泄漏?
并发编程之多线程线程安全
当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。
蒋老湿
2019/07/31
1.1K0
Atomic 原子类
原子对象的单个方法具有原子性,通过 CAS 算法和自旋操作实现,并发效率高。使用时需导入 import java.util.concurrent.atomic.*。
Qwe7
2022/08/06
4610
Java并发编程系列-(1) 并发编程基础
一般来讲,CPU核心数和线程数的关系为核心数:线程数=1:1;但是如果使用了超线程技术,可以达到1:2甚至更多。
码老思
2023/10/17
3180
Java并发编程系列-(1) 并发编程基础
【并发编程】三大基础特性
JMM(Java Memory Model)。不同的硬件和不同的操作系统在内存上的操作有一定差异的。
程序员波特
2024/04/20
1080
【并发编程】三大基础特性
JAVA高并发处理------多线程
线程安全概念:当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。
HUC思梦
2020/09/03
1K0
JAVA高并发处理------多线程
相关推荐
并发编程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验