当前位置: 首页 > 科技观察

你称之为“线程安全”吗?

时间:2023-03-14 22:11:24 科技观察

本文转载自微信公众号《FullStackCoderPortrait》,作者FullStackCoderPortrait。转载本文请联系全栈码农画像公众号。今日干货:1、什么是线程安全?2、线程安全和变量的关系?变量与堆/栈/静态存储区密切相关。什么是线程安全?我们使用普通的代码行i++,i--比如电脑的运行姿势可能和你想象的不一样。在大多数计算机中,递增和递减变量不是原子操作。需要以下三个步骤:①将变量值加载到寄存器中②注册自增自减值③将寄存器值加载回原来的变量多线程环境,如果不使用一些原子锁操作:线程A(i++)可能只执行前两步,然后CPU轮询切换到其他线程或者线程A被抢占CPU;线程B(i--)执行所有这三个步骤;当线程A夺回CPU后,执行第三步,一下子影响了线程B的执行预期。上图形象贴切的描述了什么是线程安全,这就是线程不安全!??你可能遇到的问题不叫平台问题。以上问题可以使用原子锁InterLock,https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked?view=net-5.0。更多关于线程安全的千篇一律的文章(请看这个,本次测试我采访了腾讯,本题O)线程安全?#变量#线程安全的出发点,或者说问题的出发点是变量------栈区(stack)由编译器自动分配和释放,堆区(heap)用于存放函数参数和局部变量一般由程序员分配和释放。如果程序员不释放,程序可能会时不时回收全局区(静态区)(static),全局变量和静态变量存放在一起。程序结束后,系统释放文本常量区中的常量字符串。程序结束后,系统释放程序代码区存放函数体的二进制代码WriteLine("object={0}:count={1}",number,count);}}classMainTest{publicstaticvoidMain(){StaticTesta=newStaticTest();a.display();}}不要认为[number是值类型,它存储在栈区]引用类型的值指向堆区,引用本身的值通常是32位或64位整数。局部变量的值存储在堆栈区中。Area),所有对象共享,一旦静态变量被修改,其他对象对修改可见,所以线程不安全。2、实例成员:单例模式(只存在一个对象实例)不是线程安全的,非单例线程安全类的实例成员(非静态成员)归实例所有,分配在堆中。如果系统中只有一个这样的实例一个类的实例,在多线程环境下,“就像”一个静态变量。被一个线程修改后,其他线程可以看到修改,所以该线程不安全;如果每个线程使用不同的对象执行,实例成员的修改不会互相影响,所以线程安全。3、局部变量:线程安全每个线程在执行时都会把局部变量放在自己栈帧的工作内存中,线程之间不共享,所以不存在线程安全问题。