我不清楚CLR在運行程序時執行的過程。我不清楚何時使用lock()或其他類型的線程安全對象。瞭解多線程和執行過程
請幫我瞭解以下內容:
有了這個代碼:
public class Person {
string Name {get;set;}
}
public class Calc {
public string DoStuff(Person p){
// perform some processing on person object
// maybe call external API and update person object
}
}
請糾正我,如果我錯了,但是這是我的例1的理解在單線程應用程序(假設它是一個mvc應用程序,我正在使用DI並且已經在容器中註冊了「服務」
我在我的應用程序的某個地方調用了Service.Work(),新的Calc()被創建(CLR在內存中分配這個對象)和Calc.DoStuff()在Person obj上進行計算等。由於在調用新的Calc()之前創建並從兩個瀏覽器中調用它們,它們位於不同的執行路徑中。它是否正確?
// Example 1
public class Service {
public void Work(person) {
var calc = new Calc();
string test = calc.DoStuff(person);
}
}
// Example 2
public class Service {
public Service() {
var calc = new Calc(); // this is different
}
public void Work(person) {
string test = calc.DoStuff(person);
}
}
現在什麼在內存分配計算器服務的時間相同的情況下發生的,但是這次是在服務的構造函數實例化。這會導致同時調用Work()的問題(因爲只有一個Calc對象的實例)
- 然後會發生什麼?字符串名稱是否填充了「最新」字符串?)。
- 這裏需要鎖定,所以首先它必須完成第一個呼叫請求然後第二個?
- 當兩個瀏覽器調用Work(Person)向該方法發送Person的兩個實例時會發生什麼。假設Person對象出現在Calc類的「內部」,然後調用一個外部API,並停頓一段時間。然後第二個請求被調用到Calc(Person)這個Person對象是否會獨立更新(即使Calc()只有一個實例?)。或者第一個請求(被停止的請求)被第二個被取消而被遺忘?
「所以,如果兩個瀏覽器執行Calc.DoStuff()...」 - 您提到了瀏覽器。這是一個ASP.NET應用程序嗎? – mbeckish
是和否 - 因爲它可能是瀏覽器,但它可能是應用程序的兩個不同組件同時調用Service.Work()。這有什麼區別嗎?如果它是Asp.net或不是? – BobSwanson