首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果我只是读而不是写,我应该在多线程中使用全局变量吗?

在多线程中,如果你只是读而不是写全局变量,通常情况下是可以使用全局变量的。因为在多线程环境下,多个线程可以同时读取全局变量的值而不会产生冲突。

然而,需要注意的是,如果全局变量在读取的同时可能会被其他线程修改,那么就需要采取一些措施来保证数据的一致性。这可以通过使用同步机制来实现,例如使用互斥锁(mutex)或读写锁(read-write lock)来保护全局变量的读取操作。

另外,如果全局变量的值在多个线程之间需要共享,并且可能会被写操作修改,那么就需要特别小心。在这种情况下,应该使用线程安全的数据结构或同步机制来保证数据的一致性,以避免数据竞争和不确定的结果。

总结起来,如果你只是读取全局变量而不会被其他线程修改,并且能够保证数据的一致性,那么在多线程中使用全局变量是可以的。但如果存在写操作或需要共享数据,就需要采取适当的同步机制来保证线程安全。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【RTOS训练营】继续程序框架、tick中断补充、预习、课后作业和晚课提问

问: 中断里的事情要快点干完,所以不应该在中断里delay?应该怎么消抖? 答: 我们可以使用定时器来消除抖动。 这个方法好像我以前介绍过,现在再简单的讲一下原理,以前没有写过代码。...问: 多个中断处理程序都缓冲区,会不会搞乱数据呢? 答: 会的,所有的环形缓冲区要考虑互斥。 要保证,同一时间,只能够有一个人来操作它,或者它。 假设有两个人,可以一个去,一个去。...但是,不能够两个人同时去、同时去。 我们可以加上一些保护的手段,比如说关中断,然后这样操作: 关中断 / 开中断 13. 问: 老师想问一下,设备链表的链表头一般在哪里?...是不是.h中生明一个全局变量?规范做法是什么? 答: 有的链表头,都是定义一个全局变量,加上static。 14....问: SysTick是不是也是中断?是不是也不能做太多事情? 答: 是的,只是说建议不要做太多的事情,非要做一些很耗时的事情,那也没办法。 16. 问: 老师,缓冲区能抽象为一个通用的

44140

2019年Java面试题基础系列228道(4),快看看哪些你还不会?

本次更新Java 面试题(二)的1~20题答案 1、Java 能创建 volatile 数组? 能,Java 可以创建 volatile 类型数组,不过只是一个指向数组的引用,不是整个数组。...double 和 long 都是 64 位宽,因此对这两种类型的是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java volatile 型的 long...简单的说,就是当你一个 volatile 变量之前,Java 内存模型会插入一个屏障(writebarrier),一个 volatile 变量之前,会插入一个屏障(read barrier)。...13、用 Java 一个线程安全的单例模式(Singleton)? 一步一步创建一个线程安全的 Java 单例类。当我们说线程安全时,意思是即使初始化是在多线程环境,仍然能保证单个实例。...数据类型和 Java 基础面试问题 17、Java 应该使用什么数据类型来代表价格? 如果不是特别关心内存和性能的话,使用 BigDecimal,否则使用预定义精度的double 类型。

65500

C++ STL容器如何解决线程安全的问题?

众所周知,STL容器不是线程安全的。对于vector,即使方(生产者)是单线程写入,但是并发的时候,由于潜在的内存重新申请和对象复制问题,会导致方(消费者)的迭代器失效。...更多锁的种类可以阅读之前的这篇文章: 如何理解互斥锁、条件变量、读写锁以及自旋锁? 当然本文的目的自然不是自我重复再次介绍一次锁的使用,请继续阅读解法二!...但是在多线程的场景下,用resize再合适不过。 你可以resize好N个对象,多线程不管是还是,都是通过容器的下标访问operator[]来访问元素,不要push_back()新元素。...对此,在某些场景下也可以避免加锁:如果全量的key有办法在并发之前就能拿到的,那么就对这个map,提前做一下insert。并发环境如果只是修改value,不是插入新key就不会core dump!...另外对于unordered_map,在单多线程场景下,会不会有问题呢?也可能有。gcc 4.7.2的unordered_map实现曾被爆出有这个问题。

2.9K20

疯转|最近5年133个Java面试问题列表

确定你在自己的面试见过很多这些问题,很多问题你也能正确回答。 多线程、并发及线程的基础问题 1)Java 能创建 volatile 数组?...能,Java 可以创建 volatile 类型数组,不过只是一个指向数组的引用,不是整个数组。...(答案) 这是Java 并发程序的时候遵循的一些最佳实践: a)给线程命名,这样可以帮助调试。 b)最小化同步的范围,不是将整个方法同步,只对关键部分做同步。...c)如果可以,更偏向于使用 volatile 不是 synchronized。...(答案) 不是,非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat

2K50

2 万多字,183 道 Java 面试题分析及答案

确定你在自己的面试见过很多这些问题,很多问题你也能正确回答。 多线程、并发及线程的基础问题 1)Java 能创建 volatile 数组?...能,Java 可以创建 volatile 类型数组,不过只是一个指向数组的引用,不是整个数组。...59)我们能自己一个容器类,然后使用 for-each 循环? 可以,你可以一个自己的容器类。如果你想使用 Java 增强的循环来遍历,你只需要实现 Iterable 接口。...如果你认为这里有任何应该在这份列表被我遗漏了的 Java 流行的问题,你可以自由的给我建议。的目的是从最近的面试创建一份最新的、最优的 Java 面试问题列表。 1) 什么是线程?...在没有线程的情况下一个锁可能会同时被多个线程持有。锁是独占的,你可以使用JDK的ReentrantReadWriteLock来实现这个规则,它最多支持65535个锁和65535个锁。

1K20

Java 面试问题大全

能,Java 可以创建 volatile 类型数组,不过只是一个指向数组的引用,不是整个数组。...59)我们能自己一个容器类,然后使用 for-each 循环? 可以,你可以一个自己的容器类。如果你想使用 Java 增强的循环来遍历,你只需要实现 Iterable 接口。...(答案) 这是Java 并发程序的时候遵循的一些最佳实践:a)给线程命名,这样可以帮助调试。b)最小化同步的范围,不是将整个方法同步,只对关键部分做同步。...c)如果可以,更偏向于使用 volatile 不是 synchronized。...不是,非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat

88740

java多线程高级教程,这些你都懂了吗?

有个属性是共享属性,这个关键字会在每个线程内开一块内存,每次子线程都会从主线程拿最新的属性放到内存。但是有个问题,他只是拿最新的,比如:计数器,每个线程都执行+1操作。...这是hibernate的源码,如果当前线程没有session就openSession放到ThreadLocalMap,每个线程的session都是独立的不会相互受影响。...ConCurrentHashMap(底层分成16个hashtable来保证并发)支持高并发和删除时候只支持16个线程,所以一般也要上锁; copyandwrite支持高并发的话要加锁(原理是...这个demo就不写了,用法和我们平时用的集合都一样,只是他们不会造成线程不安全。...lock和unlock是两次不相关的请求,因此肯定不是同一线程,因此导致无法使用ReentrantLock。

60440

2022 最新 Java 基础 面试题(二)

确定你 在自己的面试见过很多这些问题, 很多问题你也能正确回答。 多线程、并发及线程的基础问题 1、Java 能创建 volatile 数组?...76、Java ,编写多线程程序的时候你会遵循哪些最佳实践? 这是 Java 并发程序的时候遵循的一些最佳实践: a) 给线程命名, 这样可以帮助调试。...b) 最小化同步的范围, 不是将整个方法同步, 只对关键部分做同步。 c) 如果可以, 更偏向于使用 volatile 不是 synchronized。...不是, 非常不幸, DateFormat 的所有实现, 包括 SimpleDateFormat 都不是 线程安全的, 因此你不应该在多线程序中使用, 除非是在对外线程安全的环境 使用, 如 将 SimpleDateFormat...如 果你认为这里有任何应该在这份列表被我遗漏了 的 Java 流行的问题, 你可以自由的给我建议。 的目的是从最近的面试创建 一份最新的、 最优的 Java 面试问题列表。

7710

新人怎样学习嵌入式Linux?

如果你的目的是想学习底层系统,这是的专长,倒是可以说一点。 在回答这个问题之前,先回答:不少人问我,到底是学驱动还是学应用?  只能说凭兴趣,并且驱动和应用并不是截然分开的  1....你能回答这几个问题? 1. 一上电,CPU从哪里取指令执行?    答:一般从Flash上指令。 2. 但是Flash一般是只能读不能直接的,如果用到全局变量,这些全局变量在哪里?    ...答:全局变量应该在内存里 3. 那么谁把全局变量放到内存里去?    答:长期用ADS、KEIL的朋友,你能回答?这需要"重定位"。...LDD3,即,老外的那本,里面介绍了不少概念,值得一。但是,它的作用也就限于介绍概念了。基本上是入门之前用它来熟悉一下概念,入门后就扔掉了。...说一下的学习经历吧。 1. 在学校时的是物理电子专业,其实课程里没有教怎么设计电路,只是教了些电子电路方面的知识。PCB的设计是在实验室里自学的,只设计过2层板,现在忘记得差不多了。

5K10

Golang 面试题

大家好,又见面了,是你们的朋友全栈君。 本文章收录于:后端工程师面试题目总结(提供参考答案) 目录 1. make与new的区别 2. 简要描述go的main和init函数的区别 3....11、这段代码可以编译过如果会错是在哪一行? 12、ABCD哪一行会报错? 13、下面的代码会怎样输出?每次输出结果一样?...答案:先打印出111111111,然后报错(死锁) 说明:两个协程都是读取c2的元素,然后塞入c1, 然而c2又是无缓冲且没有任何协程在往c2数据,所以第一个协程c2的时候就导致死锁,因为c2永远不出数据...使用场景: 每次调用函数A时都要改变全局变量B,且B只与A相关,以往没有闭包时只能将B定义为全局变量现在可以将B定义为A的内部变量,将真正的执行函数作为闭包放在A内部去执行。...11、这段代码可以编译过如果会错是在哪一行?

48920

快速学好一门编程语言

关于如何学习一门编程语言的问题,新人总是会问,能学会适合学编程的智商够通常会反问你觉得学英语难想说的是,其实学一门编程语言和学一门外语并不存在智商门槛的差别。...怎么学 首先,一本关于java的书(任何java的书都可以),通读,就像你小说一样,一周内完成。不用每个章节都,尽可能快的过一遍。你有没有在一周内读完过一本小说?...你应该在入门算法课程中学这些不是在学习新语言时。如果你没有入门编程语言和基本的数学技能,请先学习语言。并且不要把注意力集中在细节问题上,当你实际做项目时,你有的是时间抠细节。...A:使用现成的API,它能让你的更轻松,让你在放弃之前保持高效。为什么重新发明轮子?使用apache commons I / O和网络库。JDK本身带有很好的数据结构,没事儿别总造轮子。...开始更大的项目。或者只是改善你的小项目,把它做大。想想您可以在小项目中实现的新功能并执行此操作。通过相同的网站下载程序,尝试实现过滤器。基于超链接的过滤器将教您使用正则表达式。

60240

多线程和多进程之间的区别(总结)

一.为何须要多进程(或者多线程),为何须要并发? 这个问题也许本身都不是个问题。可是对于没有接触过多进程编程的朋友来说,他们确实无法感受到并发的魅力以及必要性。 想。...私有的线程空间则主要包含栈和寄存器。 因此。对于同一进程的不同线程来说。每一个线程的局部变量都是私有的。全局变量、局部静态变量、分配于堆的变量都是共享的。...有足够权限的进程能够向队列中加入消息,被赋予权限的进程则能够走队列的消息。消息队列克服了信号承载信息量少。管道仅仅能承载无格式字节流以及缓冲区大小受限等缺点。...也许你会有疑问,那多线程间要通信。应该怎么做?前面已经说了。多数的多线程都是在同一个进程下的,它们共享该进程的全局变量。我们能够通过全局变量来实现线程间通信。...只是,在同一时候调用多进程(子进程里也调用线程函数)和多线程的情况下,函数体内非常有可能死锁。 详细的样例能够看看这篇文章。

52310

多线程和多进程的差别(小结)

想,仅仅要你不是整天都那种int main()究竟的代码的人,那么或多或少你会遇到代码响应不够用的情况,也应该有尝过并发编程的甜头。...关于时复制:因为一般 fork后面都接着exec,所以,如今的 fork都在用时复制的技术,顾名思意,就是,数据段,堆,栈,一開始并不复制,由父,子进程共享,并将这些内存设置为仅仅。...有足够权限的进程能够向队列中加入�消息,被赋予权限的进程则能够走队列的消息。消息队列克服了信号承载信息量少,管道仅仅能承载无格式字节流以及缓冲区大小受限等缺点。...也许你会有疑问,那多线程间要通信,应该怎么做?前面已经说了,多数的多线程都是在同一个进程下的,它们共享该进程的全局变量,我们能够通过全局变量来实现线程间通信。...只是,在同一时候调用多进程(子进程里也调用线程函数)和多线程的情况下,函数体内非常有可能死锁。 详细的样例能够看看这篇文章。

42630

socket是并发安全的

那么,socket是并发安全的?能让这多个线程同时并发? 并发读写socket TCP Socket是线程安全的? 对于TCP,我们一般使用下面的方式创建socket。...那么问题就来了,那是不是整个完整消息之前加个锁,整个消息都写完之后再解锁,这样就好了? 类似下面这样。...TCP Socket是线程安全的? 在前面有了socket是线程安全的结论,我们稍微翻一下源码就能发现,socket其实也是加锁了的,所以并发多线程socket这件事是线程安全的。...我们平时代码的时候如果使用udp发送消息,一般会像下面这样操作。...但就算可以,依然不建议大家这么做。 为什么不建议使用多线程同时读写同一个UDP socket udp本身是不可靠的协议,多线程高并发执行发送时,会对系统造成较大压力,这时候丢包是常见的事情。

1.7K10

使用C# (.NET Core) 实现单体设计模式 (Singleton Pattern)

请看下图: 处理多线程问题 为了解决这个多线程的问题问题, 可已使用synchronized方法: (synchronized是java里的关键字, C#的请参考下面的代码) 使用synchronized...还能改进多线程 1. 如果性能不是那么重要, 就继续使用synchronized吧. 但是要记住使用synchronized之后运行速度可能会差100倍(JVM). 2....所以如果性能是问题, 就可以使用这个方法. 其他问题 Q: 如果创建一个类, 里面都是静态方法和静态变量, 那么它的效果和单体模式不是一样的?...A: 是的, 如果你类没有其他依赖并且初始化并不复杂的话. Q: 可以继承单体模式? A: 简单的回答就是: No. Q: 为什么单体模式比全局变量好?...A: 全局变量会污染命名空间, 当然了单体模式不好也很烂.

92540

阿里一面面经C++

——拿破仑 面了一个半小时,感觉嗓子都要哑了……   Q:做个自我介绍吧   A:聊项目   ……(聊了挺久)   Q:看你这边github上有一个协程库,能介绍一下协程的概念?  ...A:协程,用户级,轻量,快,效率高,但是不结合多线程难以利用多核   Q:能说一下怎么实现的?   A:讲了一下基于ucontext怎么切换上下文   Q:协程和线程的区别?  ...Q:你的库的对于使用者有什么优势?   A:……你可以用的APIbalabala……   Q:给我一个用你的协程库的场景吧??   A:YY了一个轮询文件的场景。  ...栈的维护是你自己做的?   A:维护每个协程的上下文。就只需要管理这块内存就可以。不是很完善……   Q:上个文件的场景,什么时候才会阻塞?  ...Q:如果两个都阻塞了呢?   A:那就没辙了……举了一个很多fd用epoll轮询的场景。   Q:从你个人角度有没有遇到过比较困难的场景?

35720

别逗了,Redis6.0多线程重磅来袭!

多线程实现 目前对于单线程 Redis 来说,性能瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向: 提高网络 IO 性能,典型的实现像使用 DPDK 来替代内核网络栈的方式 使用多线程充分利用多核...因为读写网络的read/write系统调用在Redis执行期间占用了大部分CPU时间,如果把网络读写做成多线程的方式对性能会有很大提升。...多线程 IO 的(请求)和(响应)在实现流程是一样的,只是执行还是操作的差异。同时这些 IO 线程在同一时刻全部是或者,不会部分或部分的情况,所以下面以流程作为例子。...分析过程只会覆盖核心逻辑不是全部细节。如果想完全理解细节,建议看完之后再次看一次源码实现。...数据仅供验证参考不能作为线上指标,且只是目前的 unstble分支的性能,不排除后续发布的正式版本的性能会更好。

10.3K40

这个点,在面试答出来很加分!

那么,socket是并发安全的?能让这多个线程同时并发? 并发读写socket TCP Socket是线程安全的? 对于 TCP,我们一般使用下面的方式创建 socket。...那么问题就来了,那是不是整个完整消息之前加个锁,整个消息都写完之后再解锁,这样就好了? 类似下面这样。...TCP Socket是线程安全的? 在前面有了 socket 是线程安全的结论,我们稍微翻一下源码就能发现,socket其实也是加锁了的,所以并发多线程 socket 这件事是线程安全的。...我们平时代码的时候如果使用 UDP 发送消息,一般会像下面这样操作。...会有一样的问题? 我们跟TCP对比下,大家就知道了。 TCP不能用多线程同时和同时,是因为它是基于数据流的协议。 那UDP呢?它是基于数据报的协议。

42420

多进程单线程模型与单进程多线程模型之争

,只提供了同步。...原因很简单,因为服务器的发展大部分都是归功于Linux Unix,不是Windows。...这就好比是,多进程单线程是在4个函数中切换,各自拥有自己的变量;单进程多线程在1个函数的4个子函数切换,拥有相同的全局变量。 但是,没有你想象的“快几倍”。...副作用,副作用,单进程多线程肯定有其不利的一面 一直提过副作用。 如果你仔细看多进程单线程的图,就应该明白,这种模型提供了一种保护机制。 当其中一个进程内部读取错误,master可以让ta重启。...拜托,如果你真的想要密集处理,请使用C C++。(个人只会用C)你见过哪个数据库服务器是java c#的?

1.3K20

【Dev Club 分享】微信 iOS SQLite 源码优化实践

journal_mode=WAL 此时操作会先 append 到 wal 文件末尾,不是直接覆盖旧数据。...操作开始时,会记下当前的 WAL 文件状态,并且只访问在此之前的数据。这就确保了多线程之间可以并发地进行。 1.2 Busy Retry 方案 之间仍会互相阻塞。...在 Retry 过程,休眠时间的长短和重试次数,是决定性能和操作成功率的关键。 然而,它们的最优值,因不同操作不同场景不同。...被加载进内存的 page,使用完毕后不会立刻释放。而是在一定范围内通过 LRU 的算法更新 page cache。这就意味着,如果 cache 设置得当,大部分操作不会读取新的 page。...不同机型会做细化 Q13 :请问 sqlite 多线程机制,大概能应付多大量级的数据库操作(基本无卡顿),微信有这方面的测试体验,然后是使用了底层代码修改多线程机制后,有大概的提升量级

1.4K80
领券