日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
你管這叫“線程安全”?

本文轉(zhuǎn)載自微信公眾號「全棧碼農(nóng)畫像」,作者全棧碼農(nóng)畫像。轉(zhuǎn)載本文請聯(lián)系全棧碼農(nóng)畫像公眾號。

創(chuàng)新互聯(lián)是一家專業(yè)提供吳忠企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、html5、小程序制作等業(yè)務(wù)。10年已為吳忠眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

今日份的干糧:

1.什么叫線程安全?

2.線程安全與變量的關(guān)系?

  • 變量又與堆/棧/靜態(tài)存儲區(qū)有密切關(guān)系

什么叫線程安全?

我們以常見的一行代碼i++ ,i-- 為例, 計(jì)算機(jī)的操作姿勢可能與你想象的不一樣。

在大多數(shù)計(jì)算機(jī)中, 給變量自增自減并不是原子操作, 需要下面三步:

① 將變量值加載進(jìn)寄存器

② 寄存器自增/自減值

③ 將寄存器值加載回原變量

多線程環(huán)境下,如果你不使用一些原子鎖操作:

線程A ( i++ )可能只執(zhí)行了前面兩步后,之后CPU輪詢切換到其他線程或者線程A被搶占CPU;線程B ( i-- )欻欻執(zhí)行完所有的三步;

當(dāng)線程A重新獲得CPU,執(zhí)行第三步, 一下子影響了線程B的執(zhí)行預(yù)期。

上圖栩栩如生、動靜相宜地描述了 啥叫線程安全,這就是線程不安全! ??

你能遇到的問題,在平臺這里都不叫問題。

上面的問題可以使用原子鎖InterLock, https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked?view=net-5.0。

更多的關(guān)于線程安全的八股文 (請看這個,這個我面試騰訊考過,這個題目O了)

線程安全?#變量#

線程安全的著力點(diǎn),或者說問題的出發(fā)點(diǎn)是變量

--- ---
棧區(qū)(stack) 由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)、局部變量
堆區(qū)(heap) 一般由程序員分配釋放, 若程序員不釋放,程序可能不定時回收
全局區(qū)(靜態(tài)區(qū))(static) 全局變量和靜態(tài)變量的存儲是放在一塊的,程序結(jié)束后系統(tǒng)釋放
文字常量區(qū) 常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放
程序代碼區(qū) 存放函數(shù)體的二進(jìn)制代碼
 
 
 
  1. using System;
  2. public class StaticTest
  3. {
  4.     static int count;
  5.     int number;
  6.     public StaticTest()
  7.     {
  8.         count = count + 1;
  9.         number = count;
  10.     }
  11.     public void display()
  12.     {
  13.        Console.WriteLine("object={0}:count={1}", number, count); 
  14.     }
  15. }
  16. class MainTest
  17. {
  18.     public static void Main()
  19.     {
  20.         StaticTest a = new StaticTest();
  21.         a.display();
  22.     }
  23. }
  • 不要認(rèn)為[number是值類型,就存儲在棧區(qū)]
  • 引用類型的值指向堆區(qū), 引用本身的值通常是32位或64位整形
  • 局部變量的值存儲在棧區(qū)

1. 靜態(tài)成員:線程非安全

類的靜態(tài)成員即類變量,位于全局區(qū)(靜態(tài)區(qū)),為所有對象共享,一旦靜態(tài)變量被修改,其他對象對修改均可見,故線程非安全。

2.實(shí)例成員:單例模式(只有一個對象實(shí)例存在)線程非安全,非單例線程安全

類的實(shí)例成員(非靜態(tài)成員)為實(shí)例所有,在堆中分配,若在系統(tǒng)中只存在一個此類實(shí)例,在多線程環(huán)境下,“猶如”靜態(tài)變量那樣,被某個線程修改后,其他線程對修改均可見,故線程非安全;

如果每個線程執(zhí)行都是使用不同對象,那實(shí)例成員的修改將互不影響,故線程安全。

3. 局部變量:線程安全

每個線程執(zhí)行時將會把局部變量放在各自棧幀的工作內(nèi)存中,線程間不共享,故不存在線程安全問題。


分享標(biāo)題:你管這叫“線程安全”?
URL鏈接:http://m.5511xx.com/article/djhjhgd.html