Cara kerja kunci thread saat memodifikasi item objek dalam kumpulan objek aman thread melalui referensi

Saya memiliki koleksi objek yang aman untuk thread, misalnya c# MemoryCache. Seperti yang kita ketahui, operasi seperti menambah, memperbarui, dan menghapus item dalam koleksi ini aman. Tetapi jika saya memperbarui properti item objek dalam koleksi melalui referensi, pertama-tama, apakah itu aman untuk thread? bagaimana sinkronisasi bekerja? apakah setiap baris pembaruan properti akan dikunci?

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();

saran apa pun sangat dihargai.


person Justin Mathew    schedule 19.05.2015    source sumber
comment
Anda sudah memiliki kode untuk mengujinya. Apa yang terjadi saat Anda menjalankannya?   -  person Servy    schedule 19.05.2015
comment
Hasilnya terlihat semua thread aman. Tapi saya membaca di beberapa blog tidak demikian, jadi hanya ingin memeriksa lebih banyak komentar.   -  person Justin Mathew    schedule 19.05.2015
comment
Jadi, Anda sudah tahu jawaban atas pertanyaan Anda sebelum menanyakannya? Lalu kenapa Anda repot-repot bertanya padahal Anda sudah tahu jawabannya?   -  person Servy    schedule 19.05.2015
comment
@SriramSakthivel Dia menyatakan bahwa dia melakukan penelitian, menemukan bahwa itu tidak aman, menganggapnya aman meskipun diberitahu bahwa itu tidak aman, bertanya lagi, dan diberi tahu apa yang telah dia temukan sebelumnya, bahwa itu tidak aman.   -  person Servy    schedule 19.05.2015


Jawaban (1)


Tetapi jika saya memperbarui properti item objek dalam koleksi melalui referensi, pertama-tama, apakah itu aman untuk thread?

No.

bagaimana sinkronisasi bekerja?

Tidak akan ada sinkronisasi tulis membaca/menulis properti.

apakah setiap baris pembaruan properti akan dikunci?

No.

person dugas    schedule 19.05.2015
comment
Terima kasih dugaan, tetapi ketika saya menjalankan kode pengujian (di atas), hasilnya aman untuk thread. Bagaimana jadinya? - person Justin Mathew; 19.05.2015
comment
@JustinMathew Bagaimana Anda memvalidasi hasilnya? - person Servy; 19.05.2015
comment
Ada beberapa alasan mengapa Anda mungkin mendapatkan hasil yang benar (misalnya cpu inti tunggal, arsitektur cpu, model memori, dll...). Contoh Anda sama sekali tidak aman untuk thread. - person dugas; 19.05.2015
comment
@Servy - Saya tidak yakin pengujian saya benar atau tidak, yang saya lakukan, saya telah membuat tiga utas untuk melakukan penjumlahan satu properti (Val1) dan mendapatkan jumlah yang tepat setelah eksekusi. Bisa Anda ceritakan ? bagaimana saya bisa membuktikan itu tidak aman untuk thread. - person Justin Mathew; 20.05.2015