一個static和麵試官扯了一個小時,舌戰加強版

来源:https://www.cnblogs.com/huangxincheng/archive/2020/06/07/13058992.html
-Advertisement-
Play Games

一:背景 1. 講故事 最近也是奇怪,在社區里看到好幾篇文章聊static的玩法以及怎麼拿這個和麵試官扯半個小時,有點意思,點進去看都是java版的,這就沒意思了,怎麼也得有一篇和麵試官扯C#中的 static用法撒,既然沒有人開這個頭,那我就獻醜了。。。,下麵以QA的方式記述,大家可以代入一下能回 ...


一:背景

1. 講故事

最近也是奇怪,在社區里看到好幾篇文章聊static的玩法以及怎麼拿這個和麵試官扯半個小時,有點意思,點進去看都是java版的,這就沒意思了,怎麼也得有一篇和麵試官扯C#中的 static用法撒,既然沒有人開這個頭,那我就獻醜了。。。,下麵以QA的方式記述,大家可以代入一下能回答幾個問題。

二:QA環節

1. 第一個問題

  • 面試官: 請問您都是在什麼場景下用static的?

  解析: 可能面試官潛意識的想問問你會不會使用本地緩存。

  • 碼農: 先不說我的場景,縱觀C#的底層FCL源碼,你會發現很多的 static修飾的集合,如ThreadPool:

	[SecurityCritical]
	private static bool QueueUserWorkItemHelper(WaitCallback callBack, object state, ref StackCrawlMark stackMark, bool compressStack)
	{
		QueueUserWorkItemCallback callback = new QueueUserWorkItemCallback(callBack, state, compressStack, ref stackMark);
		ThreadPoolGlobals.workQueue.Enqueue(callback, forceGlobal: true);
		result = true;
	}

其中的 workQueue 就是一個靜態隊列,不僅如此還有Quartz底層自研的線程池,還有web中的Session,Application,無非就是想用static做一個池化技術和AppDomain級的本地緩存,所以我的應用場景也無非是這些了。

2. 第二個問題

  • 面試官: 您會幾種實現單例的方式?

  解析:既然面試官想和你扯static,就是想看看你會不會用 static cctor靜態構造器構建單例!

  • 碼農: 實不相瞞,不管是用懶漢式還是餓漢式,大體上也就這幾種 雙檢鎖, static cctor, Lazy, 不知道您想讓我細說哪一種?

3. 第三個問題

  • 面試官: 那就說一下靜態構造函數為什麼可以實現單例?

  解析: 可能覺得碼農回答的有點拽,問深一點看看是不是唬人的。

  • 碼農:說到單例,每一個人都會提到在多線程場景下的併發問題導致多個單例的尷尬,所以有了給代碼加上各種花哨的鎖,比如剛纔我提到的雙檢索,所以說沒有鎖。。。這個問題是搞不定的,換句話說 靜態構造函數 也是用了鎖機制。

4. 第四個問題

  • 面試官: 你確定用到了鎖? 有證據嗎?

   解析: 有戲了,對你產生感興趣了,願聽其詳。

  • 碼農: 既然要證據,那我先構思一段如下代碼:

    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            Console.ReadLine();
        }
    }

    class Person
    {
        static Person()
        {
            Console.WriteLine("正在處理靜態函數");
            Console.ReadLine();
        }
    }

然後抓一個dump文件,用windbg看一下主線程的托管和非托管堆棧。


0:000> ~0s
ntdll!NtReadFile+0x14:
00007ff8`8d2eaa64 c3              ret
0:000> !dumpstack 
OS Thread Id: 0x4ac0 (0)
Current frame: ntdll!NtReadFile+0x14
Child-SP         RetAddr          Caller, Callee
000000c119bfdcd0 00007ff817090957 (MethodDesc 00007ff816f85aa8 +0x37 ConsoleApp6.Person..cctor()), calling (MethodDesc 00007ff8741140b8 +0 System.Console.ReadLine())
000000c119bfdd10 00007ff8765e6c93 clr!CallDescrWorkerInternal+0x83
000000c119bfdd18 00007ff87660a51c clr!ListLockEntry::FinishDeadlockAwareEnter+0x40, calling clr!GetThread
000000c119bfdd50 00007ff8765e6b79 clr!CallDescrWorkerWithHandler+0x4e, calling clr!CallDescrWorkerInternal
000000c119bfdd80 00007ff87390d663 clrjit+0x1d663, calling clrjit+0x1be60
000000c119bfdd90 00007ff87660c56b clr!DispatchCallDebuggerWrapper+0x1f, calling clr!CallDescrWorkerWithHandler
000000c119bfddf0 00007ff87660c535 clr!DispatchCallSimple+0x93, calling clr!DispatchCallDebuggerWrapper
000000c119bfde40 00007ff87660a5b9 clr!MethodTable::EnsureInstanceActive+0x110, calling clr!DomainFile::EnsureLoadLevel
000000c119bfde90 00007ff87660bf65 clr!MethodTable::RunClassInitEx+0x111, calling clr!DispatchCallSimple
000000c119bfdec0 00007ff88d350119 ntdll!RtlDebugFreeHeap+0x2a9, calling ntdll!RtlLeaveCriticalSection
000000c119bfdee0 00007ff88d2b77a2 ntdll!RtlInitializeCriticalSection+0xa2, calling ntdll!_security_check_cookie
000000c119bfdf80 00007ff87660a51c clr!ListLockEntry::FinishDeadlockAwareEnter+0x40, calling clr!GetThread
000000c119bfdfc0 00007ff87660c15c clr!MethodTable::DoRunClassInitThrowing+0x3b9, calling clr!MethodTable::RunClassInitEx
000000c119bfe810 00007ff8765f08b4 clr!ListLockEntry::`scalar deleting destructor'+0xd4, calling clr!operator delete
000000c119bfff10 00007ff88d044034 KERNEL32!BaseThreadInitThunk+0x14, calling KERNEL32!guard_dispatch_icall_nop
000000c119bfff40 00007ff88d2c3691 ntdll!RtlUserThreadStart+0x21, calling ntdll!guard_dispatch_icall_nop

仔細看上面的代碼,你會發現有很多處 ListLockEntry,這就和鎖扯上了關係哈,這算證據不?

5. 第五個問題

  • 面試官: 小伙子windbg玩的挺溜,那請回答一下靜態變數是存在哪的,有什麼證據嗎?

  解析:轉變思路,開始證據先行了

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Auto.js是什麼 安卓腳本框架 可以做的事情 數據監控:可以監視當前手機的數據。 圖片監控:截圖獲取當前頁面信息。 控制項操作:模擬操作手機控制項。 自動化工作流:編寫簡單的腳本,完成一系列自動化操作。如:微信自動點贊,快速搶單等。 定時功能:定時執行某個腳本,來完成定時任務。如:定時打卡簽到等。 ...
  • 前言 在JAVA虛擬機記憶體管理中,堆、棧、方法區、常量池等概念經常被提到,對理論知識的理解也常常停留在字面意思上,比如說堆記憶體中存放對象,棧記憶體中存放局部變數,常量池中存放字元串常量表等,本篇文章通過一個有趣的例子,儘量將這些理論概念通過程式樣例及圖解的方式表達清楚,讓我們更能深入底層知識。 例子 ...
  • 前言 在ASP.NET Core中最大的更改之一是對Http請求管道的更改,在ASP.NET中我們瞭解HttpHandler和HttpModule但是到現在這些已經被替換為中間件那麼下麵我們來看一下他們的不同處。 HttpHandler Handlers處理基於擴展的特定請求,HttpHandler ...
  • 0. 前言 在上一篇,我們搭建了一個項目框架,基本上是一個完整的項目。目前而言,大部分的應用基本都是這個結構。好的,不廢話了,進入今天的議題:完成並實現數據層的基礎實現。 1. 數據實體 通常情況下,一個項目的數據實體中欄位並不是完全沒有規律可尋。通常情況下,必須有一個主鍵。有些時候,會要求在數據表 ...
  • 前言 在本章中,主要是藉機這個C#基礎篇的系列整理過去的學習筆記、歸納總結並更加理解透徹。 在.Net開發中,我們經常會遇到並使用過委托,如果能靈活的掌握並加以使用會使你在編程中游刃有餘,然後對於很多接觸C#時間不長的開發者而言,較好的理解委托和事件並不容易。 本節主要是講述對委托的定義、委托的使用 ...
  • 在打開頁面時報錯:無法使用前導 .. 在頂級目錄上退出 原因:頂級目錄不能使用../ 經過查找,發現站點地圖裡出問題了 把../去掉後正常 或者在地址前加~/(表示應用程式的根目錄) ...
  • 一、WPF介紹 WPF全稱 Windows Presentation Foundation,幹啥用的? 主要是用來製作Windows桌面客戶端軟體的。 .Net平臺下製作Windows桌面客戶端軟體主要有兩個,一個Winform,還有一個就是WPF了。 事件驅動時代:開發客戶端便採用Winform, ...
  • 最近刷題倒是沒停,但是感覺大部分遇到的不是很適合拿來水博客,畢竟方法套路比較相似。年兄推薦下做了兩道首碼和的題,感覺這類題型的思路很棒,也可以歸納成一個方法,故再來水一篇。題目均來自力扣Leetcode,傳送門。 簡單來說,首碼和適合於解決 連續,求和 相關的問題。遇到的問題如果包含相關要求,可以考 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...