面試官:你管這叫"線(xiàn)程安全"?
來(lái)來(lái)來(lái),面試八股文?今天我們從什么叫"線(xiàn)程安全"聊起?文末"邊吃邊聊"。
今日份的干糧:
1.什么叫線(xiàn)程安全?2.線(xiàn)程安全與變量的關(guān)系??變量又與堆/棧/靜態(tài)存儲(chǔ)區(qū)有密切關(guān)系
什么叫線(xiàn)程安全?
我們以常見(jiàn)的一行代碼i++ ,i-- 為例, 計(jì)算機(jī)的操作姿勢(shì)可能與你想象的不一樣。
在大多數(shù)計(jì)算機(jī)中, 給變量自增自減并不是原子操作, 需要下面三步:
① 將變量值加載進(jìn)寄存器
② 寄存器自增/自減值
③ 將寄存器值加載回原變量
多線(xiàn)程環(huán)境下,如果你不使用一些原子鎖操作:
線(xiàn)程A ( i++ )可能只執(zhí)行了前面兩步后,之后CPU輪詢(xún)切換到其他線(xiàn)程或者線(xiàn)程A被搶占CPU;線(xiàn)程B ( i-- )欻欻執(zhí)行完所有的三步;
當(dāng)線(xiàn)程A重新獲得CPU,執(zhí)行第三步, 一下子影響了線(xiàn)程B的執(zhí)行預(yù)期。

上圖栩栩如生、動(dòng)靜相宜地描述了 啥叫線(xiàn)程安全,這就是線(xiàn)程不安全! ??
你能遇到的問(wèn)題,在平臺(tái)這里都不叫問(wèn)題。
上面的問(wèn)題可以使用原子鎖Interlocked, https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked?view=net-5.0。
更多的關(guān)于線(xiàn)程安全的八股文 (請(qǐng)看這個(gè),這個(gè)我面試騰訊考過(guò),這個(gè)題目O了)
線(xiàn)程安全?#變量#
線(xiàn)程安全的著力點(diǎn),或者說(shuō)問(wèn)題的出發(fā)點(diǎn)是變量
| --- | --- |
| 棧區(qū)(stack) | 由編譯器自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)、局部變量 |
| 堆區(qū)(heap) | 一般由程序員分配釋放, 若程序員不釋放,程序可能不定時(shí)回收 |
| 全局區(qū)(靜態(tài)區(qū))(static) | 全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,程序結(jié)束后系統(tǒng)釋放 |
| 文字常量區(qū) | 常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放 |
| 程序代碼區(qū) | 存放函數(shù)體的二進(jìn)制代碼 |
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();}}

?不要認(rèn)為[number是值類(lèi)型,就存儲(chǔ)在棧區(qū)]?引用類(lèi)型的值指向堆區(qū), 引用本身的值通常是32位或64位整形?局部變量的值存儲(chǔ)在棧區(qū)
1. 靜態(tài)成員:線(xiàn)程非安全
類(lèi)的靜態(tài)成員即類(lèi)變量,位于全局區(qū)(靜態(tài)區(qū)),為所有對(duì)象共享,一旦靜態(tài)變量被修改,其他對(duì)象對(duì)修改均可見(jiàn),故線(xiàn)程非安全。
2.實(shí)例成員:?jiǎn)卫J剑ㄖ挥幸粋€(gè)對(duì)象實(shí)例存在)線(xiàn)程非安全,非單例線(xiàn)程安全
類(lèi)的實(shí)例成員(非靜態(tài)成員)為實(shí)例所有,在堆中分配,若在系統(tǒng)中只存在一個(gè)此類(lèi)實(shí)例,在多線(xiàn)程環(huán)境下,“猶如”靜態(tài)變量那樣,被某個(gè)線(xiàn)程修改后,其他線(xiàn)程對(duì)修改均可見(jiàn),故線(xiàn)程非安全;
如果每個(gè)線(xiàn)程執(zhí)行都是使用不同對(duì)象,那實(shí)例成員的修改將互不影響,故線(xiàn)程安全。
3. 局部變量:線(xiàn)程安全
每個(gè)線(xiàn)程執(zhí)行時(shí)將會(huì)把局部變量放在各自棧幀的工作內(nèi)存中,線(xiàn)程間不共享,故不存在線(xiàn)程安全問(wèn)題。
#面試八股文# .Net線(xiàn)程同步技術(shù)解讀
https://stackoverflow.com/questions/2565331/fields-of-class-are-they-stored-in-the-stack-or-heap


又來(lái)一個(gè)神奇的網(wǎng)站!

谷歌靈魂插件,98%的程序員都好評(píng)!
