Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >并发编程讲解(二)

并发编程讲解(二)

作者头像
用户7386338
发布于 2020-05-29 03:27:11
发布于 2020-05-29 03:27:11
23400
代码可运行
举报
文章被收录于专栏:Java患者Java患者
运行总次数:0
代码可运行

● ThreadLocal介绍

ThreadLocal叫做线程本地变量,也有些地方叫做线程本地存储,ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。

● Thread与ThreadLocal源码的解析
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ThreadLocalMap getMap(Thread t) {
    return t.threadLocals;
}void createMap(Thread t, T firstValue) {
    t.threadLocals = new ThreadLocalMap(this, firstValue);
}

我们以set方法为例子,当线程第一次调用ThreadLocal的set方法时候会创建Thread对象里面的threadLocals成员。也就是说ThreadLocal的每次set和get操作,都是对Thread的threadLocals进行操作,ThreadLocals类似于threadLocals变量的管理者

threadLocals类似一个特殊的Map,它的key就是threadLocal的实例,而value就是我们设置的value值。

● ThreadLocal使用注意事项

在一个操作系统中,线程和进程是有数量上限的。在操作系统中,确定线程和进程唯一性的唯一条件就是线程进程 ID。操作系统在回收线程或进程的时候,不是一定杀死线程或进程,在繁忙的时候对线程或进程栈数据的操作,可能重复使用线程或进程。

使用ThreadLocal的时候,一定注意回收资源问题,每个线程结束之前,将当前线程保存的线程变量一定要删除 ,调用ThreadLocal.remove(),要不会发生泄露。run方法的finally代码块。

在并发量高的时候,可能有内存溢出

● ThreadLocal使用实例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test_ThreadLocal {

    volatile static String name = "zhangsan";
    static ThreadLocal<String> tl = new ThreadLocal<>();

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                name = "lisi";
                tl.set("wangwu");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 等待前一条线程运行结束
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(name);
                System.out.println(tl.get());
            }
        }).start();

    }

}

运行结果是:lisi 和 null。

就是说虽然第二条线程的打印在第一条线程set之后,当时它在ThreadLocad容器中取不到相关的值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java患者 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java并发编程(7)---ThreadLocal的运用
JDK对ThreadLocal的定义如下: TheadLocal提供了线程内部的局部变量:每个线程都有自己的独立的副本;ThreadLocal实例通常是类中的private static字段,该类一般与线程状态相关(或线程上下文)中使用。只要线程处于活动状态且ThreadLocal实例时可访问的状态下,每个线程都持有对其线程局部变量的副本的隐式引用,在线程消亡后,ThreadLocal实例的所有副本都将进行垃圾回收。
码农飞哥
2021/08/18
3300
ThreadLocal浅析
深入了解ThreadLocal的话,可以看下 深入细节ThreadLocalMap
笔头
2022/02/09
4270
ThreadLocal全解析——你想要的这里都有
ThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以通过ThreadLocal对象查询到绑定在这个线程上的一个值。
用户5325874
2021/12/07
5460
ThreadLocal全解析——你想要的这里都有
《ThreadLocal总结篇:应用+底层代码介绍》
在Spring中@transactional注解,开启事务的时候,在使用方法调用的时候形成方法依次向下调用,
2021/09/07
3140
Java并发——ThreadLocal(十二)
ThreadLocal 用于解决多线程环境下的线程安全问题。ThreadLocal为每个线程访问的变量提供了一个独立的副本,线程在访问这个变量时,访问的都是自己的副本数据,从而线程安全,即ThreadLocal为变量提供了线程隔离。
翰墨飘香
2024/08/14
1720
Java并发编程:线程封闭和ThreadLocal详解
该文章介绍了Java并发编程的基础知识,包括线程、锁、条件变量、线程池和线程封闭等概念。同时,文章还介绍了如何使用ThreadLocal类来保证线程封闭性,以及如何使用线程池来提高线程的性能。最后,文章还介绍了一些常见的Java并发编程问题和解决方案,包括死锁、饥饿、活锁和竞态条件等。通过掌握这些概念和方法,可以有效地提高应用程序的性能和稳定性,并避免一些常见的问题。
方志朋
2017/12/29
7740
Java并发编程:线程封闭和ThreadLocal详解
深入理解Threadlocal的实现原理
文章开头我想说,这是一篇面向不怎么懂  Threadlocal 的朋友的博客,所以有的人会觉得有点啰嗦,但不论您水平高低,相信耐着性子看完也一定会有收获。
矿泉水
2018/05/11
8863
(82) 理解ThreadLocal / 计算机程序的思维逻辑
本节,我们来探讨一个特殊的概念,线程本地变量,在Java中的实现是类ThreadLocal,它是什么?有什么用?实现原理是什么?让我们接下来逐步探讨。 基本概念和用法 线程本地变量是说,每个线程都有同一个变量的独有拷贝,这个概念听上去比较难以理解,我们先直接来看类TheadLocal的用法。 ThreadLocal是一个泛型类,接受一个类型参数T,它只有一个空的构造方法,有两个主要的public方法: public T get() public void set(T value) set就是设置值,
swiftma
2018/01/31
6340
并发编程系列之ThreadLocal实现原理
ThreadLocal看词义,线程本地变量?线程的变量,要怎么定义?怎么使用?ThreadLocal是线程安全的?下面给出一个简单例子,引出本文
SmileNicky
2022/05/07
2620
并发编程系列之ThreadLocal实现原理
ThreadLocal原理探究
多线程访问同一个共享变量特别容易出现并发问题,特别是多个线程需要对一个共享变量进行写入时候,为了保证线程安全,一般需要使用者在访问共享变量的时候进行适当的同步,如下图:
加多
2018/09/06
4280
ThreadLocal原理探究
ThreadLocal (中) 原理具体实现详解
由该图可知,Thread类中有一个threadLocals和一个inheritableThreadLocals,它们都是ThreadLocalMap类型的变量,而ThreadLocalMap是一个定制化的HashMap。在默认情况下,每个线程中的这两个变量都为null,只有当线程第一次调用ThreadLocal的set()或get()方法时才华创建它们。其实每个线程的本地变量不是存放在ThreadLocal实例里面,而是存放在具体线程内存空间中。ThreadLocal就是一个工具壳,它通过set方法把value值放入调用线程的threadLocals里面并存放起来,当调用线程调用它的get方法时,再从当前线程的threadLocals变量里面将其拿出来使用。如果调用线程一直不重质,那么这个本地变量会一直存放在调用线程的threadLocals变量里面,所以当不需要使用本地变量的时候可以通过调用ThreadLocal变量的remove()方法,从当前线程的threadLocals里面删除该本地变量。另外,Thread里面的threadLocals为何被设计为map结构?很明显是因为每个线程可以惯量多个ThreadLocal变量。
YanL
2020/04/26
7120
ThreadLocal (中) 原理具体实现详解
面试|再次讲解Threadlocal使用及其内存溢出
浪尖整理本文主要是想帮助大家完全消化面试中常见的ThreadLocal问题。希望读懂此文以后大家可以掌握(没耐心的可以直接阅读底部总结):
Spark学习技巧
2019/07/09
9460
面试|再次讲解Threadlocal使用及其内存溢出
java并发编程(3):ThreadLocal
转载:http://www.cnblogs.com/dolphin0520/p/3920407.html 一. 对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。 这句话从字面上看起来看容易理解,但真正理解并不是那么容易。 /** * 学习ThreadLocal * Created by mrf on 2016/3/
Ryan-Miao
2018/03/13
7130
java并发编程(3):ThreadLocal
ThreadLocal和InheritableThreadLocal深入分析
  通过ThreadLocal和InheritableThreadLocal,我们能够很方便的设计出线程安全的类。JDK底层是如何做到的呢?ThreadLocal和InheritableThreadLocal有什么区别呢与联系呢?为什么有了ThreadLocal类还需要InheritableThreadLocal类,他们与Thread类是什么关系?带着这些问题我们来分析他们的源码。
良辰美景TT
2018/09/11
8810
ThreadLocal和InheritableThreadLocal深入分析
<一>深入理解Threadlocal的实现原理
文章开头我想说,这是一篇面向不怎么懂  Threadlocal 的朋友的博客,所以有的人会觉得有点啰嗦,但不论您水平高低,相信耐着性子看完也一定会有收获。
用户2141593
2019/02/20
1.7K0
为什么 ThreadLocal 可以做到线程隔离?
对于 ThreadLocal 我们都不陌生,它的作用如同它的名字——用于存放「线程本地」变量。
刘水镜
2022/07/29
3100
java并发编程学习: ThreadLocal使用及原理
多线程应用中,如果希望一个变量隔离在某个线程内,即:该变量只能由某个线程本身可见,其它线程无法访问,那么ThreadLocal可以很方便的帮你做到这一点。  先来看一下示例: package yjmyzz.test; public class ThreadLocalTest1 { public static class MyRunnable implements Runnable { private ThreadLocal<Integer> threadLocal = new
菩提树下的杨过
2018/01/19
6310
Android多线程:手把手带你深入了解线程变量ThreadLocal
前言 在 Java多线程中,线程变量ThreadLocal非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘 今天,我将献上一份 ThreadLocal的介绍 & 实战攻略,希望你们会喜欢。 Carson带你学多线程系列 基础汇总 Android多线程:基础知识汇总 基础使用 Android多线程:继承Thread类使用(含实例教程) Android多线程:实现Runnable接口使用(含实例教程) 复合使用 Android多线程:AsyncTask使用教程(含实例讲解) A
Carson.Ho
2022/03/25
4760
Android多线程:手把手带你深入了解线程变量ThreadLocal
宇智波程序笔记8-【高并发】ThreadLocal学会了这些,你也能和面试官扯皮了!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
不会飞的小鸟
2020/08/26
3180
彻底理解Java并发:ThreadLocal详解
ThreadLocal 即线程变量,通常情况下,我们创建的成员变量都是线程不安全的。因为他可能被多个线程同时修改,此变量对于多个线程之间彼此并不独立,是共享变量。而 ThreadLocal 中填充的变量属于当前线程,该变量对其他线程而言是隔离的。
栗筝i
2022/12/01
8320
相关推荐
Java并发编程(7)---ThreadLocal的运用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档