วิธีการทำงานของการล็อคเธรดเมื่อแก้ไขรายการอ็อบเจ็กต์ในคอลเลกชันอ็อบเจ็กต์เธรดที่ปลอดภัยผ่านการอ้างอิง

ฉันมีคอลเลกชันอ็อบเจ็กต์เธรดที่ปลอดภัย เช่น c# MemoryCache ดังที่เราทราบ การดำเนินการต่างๆ เช่น การเพิ่ม การอัปเดต และการลบรายการในคอลเลกชันนี้ปลอดภัย แต่หากฉันอัปเดตคุณสมบัติของรายการอ็อบเจ็กต์ในคอลเลกชันผ่าน Reference ประการแรก มันจะปลอดภัยสำหรับเธรดหรือไม่ การซิงโครไนซ์ทำงานอย่างไร? มันจะล็อคการอัพเดตคุณสมบัติแต่ละบรรทัดหรือไม่?

class MyClass
{
     public int Val1 { get; set; }
     public int Val2 { get; set; }
}

class Program
{

    public static MemoryCache MyCache = new MemoryCache("test");

    static void Main(string[] args)
    {


        MyCache.Add("1", new MyClass() {Val1 = 0, Val2 = 0}, new CacheItemPolicy());

        new Thread(() => {

            MyClass item = (MyClass)MyCache["1"];                
            for (int i = 0; i < 100000; i++)
            {
                item.Val1 =  item.Val1 + i;
            }

        }).Start();

        new Thread(() =>
        {
            MyClass item = (MyClass)MyCache["1"];
            for (int i = 100000; i < 200000; i++)
            {
                item.Val1 =  item.Val1 + i;
            }
        }).Start();

คำแนะนำใด ๆ ที่ชื่นชมจริงๆ


person Justin Mathew    schedule 19.05.2015    source แหล่งที่มา
comment
คุณมีรหัสที่จะทดสอบแล้ว เกิดอะไรขึ้นเมื่อคุณวิ่ง?   -  person Servy    schedule 19.05.2015
comment
ผลลัพธ์ดูปลอดภัยสำหรับเธรดทั้งหมด แต่ฉันอ่านในบล็อกไม่กี่แห่งว่ามันไม่ใช่ ดังนั้นแค่อยากตรวจสอบความคิดเห็นเพิ่มเติม   -  person Justin Mathew    schedule 19.05.2015
comment
คุณรู้คำตอบสำหรับคำถามของคุณก่อนที่คุณจะถามหรือไม่? แล้วทำไมคุณถึงถามคำถามนี้ในเมื่อคุณรู้คำตอบอยู่แล้ว?   -  person Servy    schedule 19.05.2015
comment
@SriramSakthivel เขาบอกว่าเขาค้นคว้าแล้วพบว่ามันไม่ปลอดภัย ถือว่าปลอดภัยทั้งๆ ที่ถูกบอกว่าไม่ปลอดภัย จึงถามอีกครั้ง และบอกว่าสิ่งที่เคยเจอมาแล้วบอกว่ามันไม่ปลอดภัย   -  person Servy    schedule 19.05.2015


คำตอบ (1)


แต่หากฉันอัปเดตคุณสมบัติของรายการอ็อบเจ็กต์ในคอลเลกชันผ่าน Reference ประการแรก มันจะปลอดภัยสำหรับเธรดหรือไม่

No.

การซิงโครไนซ์ทำงานอย่างไร?

จะไม่มีการซิงโครไนซ์การอ่าน/การเขียนคุณสมบัติ

มันจะล็อคการอัพเดตคุณสมบัติแต่ละบรรทัดหรือไม่?

No.

person dugas    schedule 19.05.2015
comment
ขอบคุณ dugas แต่เมื่อฉันรันโค้ดทดสอบ (ด้านบน) มันให้ผลลัพธ์ที่ปลอดภัยสำหรับเธรด จะเป็นอย่างไร? - person Justin Mathew; 19.05.2015
comment
@JustinMathew คุณตรวจสอบผลลัพธ์อย่างไร - person Servy; 19.05.2015
comment
มีสาเหตุหลายประการที่คุณอาจได้รับผลลัพธ์ที่ถูกต้อง (เช่น CPU คอร์เดี่ยว สถาปัตยกรรม CPU รุ่นหน่วยความจำ ฯลฯ...) ตัวอย่างของคุณไม่ปลอดภัยสำหรับเธรดอย่างแน่นอน - person dugas; 19.05.2015
comment
@Servy - ฉันไม่แน่ใจว่าการทดสอบของฉันเหมาะสมหรือไม่ สิ่งที่ฉันทำ ฉันได้สร้างสามเธรดเพื่อรวมหนึ่งคุณสมบัติ (Val1) และรับผลรวมที่ถูกต้องหลังจากดำเนินการ คุณช่วยบอกฉันหน่อยได้ไหม? ฉันจะพิสูจน์ได้อย่างไรว่ามันไม่ปลอดภัยสำหรับเธรด - person Justin Mathew; 20.05.2015