你管这叫线程安全?

来来来,面试八股文?今天我们从什么叫"线程安全"聊起?文末"边吃边聊"。

今日份的干粮:

1.什么叫线程安全?2.线程安全与变量的关系?•变量又与堆/栈/静态存储区有密切关系


什么叫线程安全?

我们以常见的一行代码i++ ,i-- 为例, 计算机的操作姿势可能与你想象的不一样。

在大多数计算机中, 给变量自增自减并不是原子操作, 需要下面三步:
① 将变量值加载进寄存器
② 寄存器自增/自减值
③ 将寄存器值加载回原变量

多线程环境下,如果你不使用一些原子锁操作:
线程A ( i++ )可能只执行了前面两步后,之后CPU轮询切换到其他线程或者线程A被抢占CPU;线程B ( i-- )欻欻执行完所有的三步;

当线程A重新获得CPU,执行第三步, 一下子影响了线程B的执行预期。

上图栩栩如生、动静相宜地描述了 啥叫线程安全,这就是线程不安全! ☹️

你能遇到的问题,在平台这里都不叫问题。
上面的问题可以使用原子锁Interlocked, https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked?view=net-5.0。

更多的关于线程安全的八股文 (请看这个,这个我面试腾讯考过,这个题目O了)

线程安全?#变量#

线程安全的着力点,或者说问题的出发点是变量

------
栈区(stack)由编译器自动分配释放 ,存放函数的参数、局部变量
堆区(heap)一般由程序员分配释放, 若程序员不释放,程序可能不定时回收
全局区(静态区)(static)全局变量和静态变量的存储是放在一块的,程序结束后系统释放
文字常量区常量字符串就是放在这里的。程序结束后由系统释放
程序代码区存放函数体的二进制代码

using System;
public class StaticTest
{static int count;int number;public StaticTest(){count = count + 1;number = count;}public void display(){Console.WriteLine("object={0}:count={1}", number, count); }
}
class MainTest
{public static void Main(){StaticTest a = new StaticTest();a.display();}
}

•不要认为[number是值类型,就存储在栈区]•引用类型的值指向堆区, 引用本身的值通常是32位或64位整形•局部变量的值存储在栈区

1. 静态成员:线程非安全

类的静态成员即类变量,位于全局区(静态区),为所有对象共享,一旦静态变量被修改,其他对象对修改均可见,故线程非安全。

2.实例成员:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全

类的实例成员(非静态成员)为实例所有,在堆中分配,若在系统中只存在一个此类实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;

如果每个线程执行都是使用不同对象,那实例成员的修改将互不影响,故线程安全。

3. 局部变量:线程安全

每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。

#面试八股文#  .Net线程同步技术解读

https://stackoverflow.com/questions/2565331/fields-of-class-are-they-stored-in-the-stack-or-heap

--------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经济学家告诉你,胸越大的女生越会花钱!

全世界有3.14 % 的人已经关注了数据与算法之美大概两周前回加拿大的航班上,我在机舱尾部跟一位空姐聊了很久。当空姐小妹双眼向下一瞥,略微停顿之后问我“班组要在这里呆四天,不知道该干什么去”的时候,我认认真真的为自己叹了口气…

讲100个科学道理,不如做这些有趣的理科实验!

玩具和学习看似是两个对立的东西,孩子天性爱玩,家长却希望孩子能多学习。不一定非要啃课本才能汲取知识,有时候,在轻松有趣的游戏中也能学到课堂上学不到的知识。让学习变得有趣、高效——给孩子讲100个科学道理,不如带…

《权力》读书笔记

1 为什么权力只为某些人所拥有我们生活在一个充满等级制度的世界里,等级的存在就意味着竞争,而且越往上,职位就越少,竞争也就越激烈。只有了解权力的原则,并愿意运用它们的人,才可以参与这样的竞争&#xf…

$_GET,$_post与$_REQUEST

PHP $_GET $_GET 变量是一个数组,内容是由 HTTP GET 方法发送的变量名称和值。 PHP $_POST $_POST 变量用于收集来自 method"post" 的表单中的值。 $_POST 变量 $_POST 变量是一个数组,内容是由 HTTP POST 方法发送的变量名称和值。 $_POST 变…

嘘!偷偷教你们一个在双十一省钱的办法!

各位小可爱,大可爱,大家晚上好~一年一度的双11即将到来!!!小木冒着被砍头的风险为大家争取了好多好多福利绝对比平时更优惠更省钱哦!!!活动时间:10月27日-11月11日&#…

ML.NET 示例:图像分类模型训练-首选API(基于原生TensorFlow迁移学习)

ML.NET 版本API 类型状态应用程序类型数据类型场景机器学习任务算法Microsoft.ML 1.5.0动态API最新控制台应用程序和Web应用程序图片文件图像分类基于迁移学习的TensorFlow模型再训练进行图像分类DNN架构:ResNet、InceptionV3、MobileNet等问题图像分类是深度学习学…

php gd库 函数 建立gif,PHP_PHP GD库生成图像的几个函数总结,使用GD库中提供的函数动态绘 - phpStudy...

PHP GD库生成图像的几个函数总结使用GD库中提供的函数动态绘制完成图像以后,就需要输出到浏览器或者将图像保存起来。在PHP中,可以将动态绘制完成的画布,直接生成GIF、JPEG、PNG和WBMP四种图像格式。可以通过调用下面四个函数生成这些格式的图…

HDU 1964 Pipes

HDU_1964 这个题目只需要把求回路数量的dp方程改写成取最优解的dp方程即可。 更多和插头dp相关的题目可以参考胡浩的博客&#xff1a;http://www.notonlysuccess.com/index.php/plug-dp-complete/。 #include<stdio.h> #include<string.h> #define MAXD 15 #define…

算法证明:女生遇到心动的男人一定要追!

全世界有3.14 % 的人已经关注了数据与算法之美我来讲恋爱中的博弈&#xff0c;不&#xff0c;我来讲恋爱中的算法&#xff0c;不&#xff0c;我来讲算法&#xff01;&#xff01;有个著名的问题&#xff0c;叫做 stable matching。早年是一个可爱的俄罗斯老头在图论课上教我的&…

php文字左右滚动代码,JavaScript

js文字横向滚动特效本文为大家分享了js文字横向滚动特效代码&#xff0c;具体实现内容如下&#xff1a;页面布局恭喜793765***获得 50元巨人点卡奖励恭喜793765***获得 50元巨人点卡奖励恭喜793765***获得 50元巨人点卡奖励恭喜793765***获得 50元巨人点卡奖励恭喜793765***获得…

记一次 .NET 某教育系统 异常崩溃分析

一&#xff1a;背景 1. 讲故事这篇文章起源于 搬砖队大佬 的精彩文章 WinDBg定位asp.net mvc项目异常崩溃源码位置 &#xff0c;写的非常好&#xff0c;不过美中不足的是通览全文之后&#xff0c;总觉得有那么一点不过瘾&#xff0c;就是没有把当时抛异常前的参数给找出来。。。…

Json.Net系列教程 3.Json.Net序列化和反序列化设置

上节补充首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一个DataTable对象,如下: DataTable dt new DataTable();DataColumn dcName new DataColumn("Name");DataColu…

5道谷歌面试题:即使是天才也要怀疑自己能力了(附答案)

全世界只有3.14 % 的人关注了数据与算法之美谷歌&#xff0c;美国的跨国科技企业&#xff0c;致力于互联网搜索、云计算、广告技术等领域&#xff0c;开发并提供大量基于互联网的产品与服务。这样一家实力雄厚前景无量的公司是众多求职者梦寐以求的地方&#xff0c;然而&#x…

红玫瑰数java的意思,红玫瑰的含义,玫瑰花个数的含义

导航&#xff1a;网站首页 >红玫瑰的含义,玫瑰花个数的含义时间&#xff1a;2018-2-27相关问题:匿名网友:1朵玫瑰代表——我的心中只有你ONLY YOU&#xff01;2朵玫瑰代表——这世界只有我俩&#xff01;3朵玫瑰代表——我爱你I LOVE YOU&#xff01;4朵玫瑰代表——至死不渝…

(装载)C#中AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的区别

// 获取程序的基目录。System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径。System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName // 获取和设置当前目录(该进程从中启动的目录)的完全限定目录。System.Environment.CurrentDirectory // 获…

[Abp vNext 源码分析] - 18. 单元测试

简介ABP vNext 框架使用 xUnit 作为单元测试组件&#xff0c;官方的所有模块都编写了大量的 单元/集成测试 确保功能正常。由于 ABP vNext 模块化系统的原因&#xff0c;开发人员在建立单元测试项目的时候需要集成 Volo.Abp.UnitTest 项目&#xff0c;这样在执行单元测试的时候…

php表格单元格怎么实现排序,javascript实现对表格元素进行排序操作

我们在上网中都能看到很多能够排序的&#xff0c;如大小、时间、价格等现在我们也试一下排序功能&#xff1a;排序的函数代码&#xff1a;里面含有点击之后排序--还原&#xff0c;和排升序和降序。function sortAge(){//对年龄进行排序&#xff0c;要先进行获得每一行对象&…

【10.29周一电商,已好】中国日历的至高境界,377张震撼级插画,美到爆!

每段时光都有属于每段时光的回忆它们是童年的纸飞机是校园时代的试卷与课本是第一次离开家乡时的兴奋与忐忑是跟某个人眼神交汇时的慌乱...回忆如此珍贵&#xff0c;以致于令我们频频回想&#xff0c;渴望着回到过去&#xff0c;与美好再度相逢。还记得文先生给大家推荐过的新一…

设置润乾报表鼠标移到格子上就显示提示内容

为了达到一定的交互性和易用性,我们一般喜欢将鼠标移动到格子上就能显示出一定的提示信息,比方说这个格子大小固定了但是里面内容超出格子了,这样我们希望鼠标移动过去后能自动提示所有的内容。用润乾报表可以这样设计&#xff1a; 比方说一个格子里面有如下内容 “这是一个很长…

ASP.NET Core 单元测试:如何Mock Url.Page()

点击上方蓝字关注“汪宇杰博客”导语在 ASP.NET Core 中&#xff0c;当你在 UrlHelperExtensions 类上使用扩展方法时&#xff0c;很难在单元测试中编写Mock。因为Moq框架不支持模拟扩展方法。问题例如&#xff0c;我的博客代码中使用了 Url.Page() 方法&#xff1a;var callba…