前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【并发编程】您知道threadLocal吗

【并发编程】您知道threadLocal吗

作者头像
周杰伦本人
发布2022-10-25 15:15:10
2370
发布2022-10-25 15:15:10
举报
文章被收录于专栏:同步文章

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

下面给出一个demo

代码语言:javascript
复制
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
复制
	//当前线程共享同样的数据
    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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么时候使用:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档