并发编程讲解(二)

Java并发编程之美 一、前言 并发编程相比 Java 中其他知识点学习门槛较高,从而导致很多人望而却步。但无论是职场面试,还是高并发/高流量的系统的实现,却都离不开并发编程,于是能够真正掌握并发编程的人成为了市场迫切需求的人才。本书将通过图文结合、通俗易懂的方式帮助大家完成多线程并发编程从入门到实践的飞跃! 本书分为三部分: - 第一部分Java并发编程基础篇主要讲解Java并发编程的基础知识,主要讲解线程有关... 阅读详情

微信公众号:Java患者
专注Java领域技术分享    

● ThreadLocal介绍

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

● Thread与ThreadLocal源码的解析
public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}
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使用实例
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容器中取不到相关的值。

C#语言的并发编程 随着计算机技术的迅速发展,软件系统中对性能的要求不断提高,尤其是在处理大量并发请求的情况下。并发编程作为一种高效利用计算机资源的编程方式,越来越受到重视。C#语言作为一门现代化的编程语言,在并发编程领域提供了丰富的支持和工具,使得开发者可以方便地实现高效的并发应用程序。本文将深入探讨C#中的并发编程,包括基本概念、常用工具、最佳实践以及性能优化等方面。 阅读详情

相关推荐

用Java玩转并发编程—— 讲解并发编程中常用的一些技术点

并发编程(concurrency programming)是指利用多核或多CPU、微内核等技术实现多个任务在同一个时刻运行的编程范式,它可以有效提升计算机系统资源利用率、缩短执行时间。Java平台提供了对多线程及其相关机制的支持,包括Thread和Runnable接口,以及锁同步机制,通过良好的编程习惯和技巧,我们可以很容易地开发出具有高并发性的并发应用。本文将围绕并发编程中的常用技术进行讲解,如线程创建、线程间通信、同步机制、原子变量类等,力争全面准确地讲解这些技术。

AI天才研究院 984

java并发编程第六课 并发锁讲解二

第25讲:读写锁 ReadWriteLock 获取锁有哪些规则? 在本课时我们主要讲解读写锁 ReadWriteLock 获取锁有哪些规则呢? 在没有读写锁之前,我们假设使用普通的 ReentrantLock,那么虽然我们保证了线程安全,但是也浪费了一定的资源,因为如果多个读操作同时进行,其实并没有线程安全问题,我们可以允许让多个读操作并行,以便提高程序效率。 但是写操作不是线程安全的,如果多个线程同时写,或者在写的同时进行读操作,便会造成线程安全问题。 我们的读写锁就解决了这样的问题,它设定了一套规则,既

fegus的博客 372

ur3手眼标定+realsenseL515

知乎 csdn

AI_future的博客 976

并发编程(二):Synchronized关键字(面试最全讲解)

Synchronized 的基本概念? Synchronized 在项目中怎么使用? Synchronized 的底层实现? Synchronized JDK1.6版本有哪些优化? Synchronized 与ReentrantLock的区别? 一:基本概念 Synchronized:是JVM层次上的锁(监视器锁),可重入,非公平锁。 synchronized...

F道人 296

AHRS互补滤波(Mahony)算法及开源代码

AHRS(Attitude and heading ref AHRS(Attitude and heading reference system,也就是航姿参考系统。在互补滤波算法中传感器主要采用了IMU(陀螺仪、加速度计)和磁力计。 AHRS的基本思想是,在载体没有平移运动的情况下,通过加速度感知重力分量,可以计算出载体的俯仰(Pitch)和横滚(Pitch);磁力计可以感知磁北方向,因此可以计算载体的磁北航向;而陀螺仪测量输出载体的旋转角速度,通过积分可以计算得到横滚、俯仰、航向增量,但由于陀螺输出值含

weixin_42918498的博客 3万+

docker安装fastdfs+nginx配置

docker安装fastdfs+nginx,实现图片或文件的上传与下载

weixin_47325126的博客 2191

Java并发编程(二):关键字synchronized和volatile讲解

关键字概念 synchronized:synchronize叫同步锁,是Lock的简化版,性能肯定不如Lock,但是操作简单方便 volatile:是一个类型修饰符,用来修饰被不同线程访问和修改的变量,当一个值被线程修改后,该缓存会立即跟新,保持一致(一致性) 关键字作用 synchronized:同步代码块,先进先出的原则,由于这种先进先出的原则,很有可能导致线程阻塞,且性能不佳,作用确...

Aiden-Y 150

[官方培训]22-UE资产优化 Epic 肖月 笔记

Nanite+Lumen目标:面向TA,美术,不影响视觉的前提下,优化运行和编辑效率引擎:UE5.1延迟管线平台:主流PC,Windows 10 with DX12。

Tcohneyn的博客 1574

深入浅出讲解Python并发编程

python并发编程

wanger5354的博客 2021

液晶电视维修必看:TCON逻辑板故障排查全指南(附常见问题解决方案)

本文详细解析了液晶电视TCON逻辑板的工作原理与故障排查方法,涵盖LVDS信号处理、DC-DC电压系统等核心知识。提供从基础测量到高级维修的完整指南,帮助技术人员快速诊断黑屏、竖线等常见故障,并给出预防性维护建议,提升维修效率与成功率。

weixin_42535461的博客 614

出现Command ‘vim‘ is available in the following places,vim: command not found等解决方法

内置命令无法识别,说明系统变量有误,导致无法识别,既然系统变量有误,将其注释或者更改为正确的即可,但是现在打不开,又怎么注释掉。替换vim来打开编辑,打开之前错误的全局变量文件,发现变量有误,要么注释要么改为。系统变量有全局变量(通过命令行printenv或者echo)和局部变量。对应通过vim修改错误的变量文件,不然source也无法让配置文件生效。本身vim是系统内置的命令,连vim都出现问题。修改为正确的即可,之后还需要重启服务器,使用。之后即可成功,通过即可查看命令是否有写入。...

码农研究僧的博客 5883

《并发编程的艺术》第一章——并发编程的挑战

🔥本篇概览:详细讲解了《并发编程的艺术》第一章——并发编程的挑战。🌈⭕🔥

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1390

构建OneService:打造高效、安全、灵活的企业级数据服务平台

数据服务(OneService)作为统一的数据服务出口,实现了数据的统一市场化管理,有效地降低数据开放门槛的同时,保障了数据开放的安全。

数据与算法架构提升之路专栏 2106

(二)深入并发编程之Lock锁

并发编程之Lock锁

qq_44816669的博客 1603

Python爬虫教程:抓取电商网站评论(以淘宝和京东为例)

通过本文的介绍,我们学会了如何使用Python编写爬虫,抓取淘宝和京东等电商平台的商品评论数据。我们介绍了如何使用电商平台提供的开放API以及如何通过模拟浏览器来抓取动态加载的数据。此外,我们还讨论了如何应对反爬虫技术,如何存储抓取的数据等。爬取电商平台的数据是一个强大的工具,能够为市场分析、消费者行为研究、产品优化等领域提供有力的支持。然而,在使用爬虫技术时,我们必须遵循法律法规,尊重平台的隐私政策,避免滥用数据。

2201_76125261的博客 1737

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Go语言中的并发编程--详细讲解

本文章充分讲解Go语言中的并发编程思想、Goroutine和Channel的使用,适用于刚刚接触Go语言的初学者,在代码部分做了大量的注释,有利于快速了解和掌握并发编程思想,希望这篇文章能够帮助到你。

2401_83649605的博客 1734

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

# Java 并发编程的艺术(二)

操作系统调度的最小单元是线程,也叫轻量级进程(),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。

不积跬步,无以至千里;不积小流,无以成江海 1171

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

并发编程系列之并发编程的认识

前言 今天我们开始接触并发编程的讲解,首先我们要知道并发编程的目的是什么?一个目的,为了让程序员运行的更快,但是有一点我们要知道,并不是启动越多的线程就能让程序更大限度的并发执行,在并发编程的开发中,如果希望使用更多的线程来加快程序的运行,一般我们会面临下面几种挑战:上下文切换问题,死锁、以及受硬件和软件资源的限制问题,那么我们一个个来说下吧,让我们开始今天的并发编程之旅吧。 上下文切换 什么是上下文切换? 即使是单核处理器,也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机

吭哧吭哧快乐的小牛码 2万+

【转】深入讲解并发编程模型之概念篇

文章目录 并发编程模型的分类 Java内存模型的抽象 重排序 处理器重排序与内存屏障指令 happens-before 总结 所有文章也会同步更新在网站:深夜程猿 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题 线程之间如何通信 这里的线程是指并发执行的活动实体。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存、消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过..

229

【Java 并发编程】详解

在并发编程中,使用普通的集合类(如 ArrayList、HashMap 等)往往会出现线程安全问题,因为它们在设计时并没有考虑多线程并发访问的情况。Java 提供了一系列并发容器来解决这个问题,这些并发容器在保证高效性能的同时,能够支持多线程安全地进行读写等操作。

架构师之路 1123

深入讲解并发编程模型之概念篇

相关文章 深入讲解并发编程模型之重排序篇 深入讲解并发编程模型之顺序一致性篇 深入讲解并发编程模型之并发三大特性篇 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题 线程之间如何通信 这里的线程是指并发执行的活动实体。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存、消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,线...

187

【进阶】Java并发编程超详讲解!!!

java内存模型的缓存区,导致了不可见性编译器优化导致了乱序性线程的切换执行导致了指令执行的非原子性。

2301_78168249的博客 1292

聊聊并发编程,另送5本Golang并发编程新书

大家好,我是飞哥!并发编程并不是一个新话题,但是我觉得在近几年以及未来的时间里,并发编程将显得越来越重要。为什么这样讲,让我们先回到一个基本的问题上来,为什么我们要采用并发编程?关于这个问题可能会有多种答案,但是最根本的答案是受 CPU 硬件发展的影响。摩尔定律原意说的是每隔 18 个月处理器的速度会翻一翻。从 1970 年到 2002 年的这段时间里,硬件确实大致是按照这个规律发展的。但是进入到...

zhangyanfei01的专栏 1371

透彻讲解:并发编程的优缺点

一直以来并发编程对于刚入行的小白来说总是觉得高深莫测,于是乎,就诞生了想写点东西记录下,以提升理解和堆并发编程的认知。为什么需要用的并发?凡事总有好坏两面,之间的trade-off是什么,也就是说并发编程具有哪些缺点?以及在进行并发编程时应该了解和掌握的概念是什么?这篇文章主要以这三个问题来谈一谈。 1. 为什么要用到并发 一直以来,硬件的发展极其迅速,也有一个很著名的"摩尔定律",可能会奇怪...

不喝枸杞的程序员 217

147、java并发编程粗略讲解

最近博主学习了一下java并发编程的相关课程,在这里跟各位童鞋粗略地分享一下java并发编程的底层逻辑。 谈到并发,博主在刚刚毕业的时候,做过一个用spring executor service 结合java mail service异步发送邮件的一个需求, 一个邮件模板要发送给N个人。但是发邮件需要调用stmp服务器,就导致这中间的过程比较缓慢。为了用户体验友好, 就将这个操作做成了多线程异步去处理。 这里想说并发的场景是在多个线程去访问一个资源的时候,会出现并发的问题。 为了处理并发情况下,多

u012416045的博客 312
上一篇: 并发编程讲解(一)
下一篇: 并发编程讲解(三)
新时代Java农民工
博客等级 码龄7年 16粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值