Dalam Aplikasi saya, saya memiliki metode statis yang dipanggil dari beberapa utas secara bersamaan. Apakah ada bahaya jika data saya tercampur?
Dalam upaya pertama saya, metode ini tidak statis dan saya membuat beberapa instance kelas. Dalam hal ini, data saya entah bagaimana tercampur. Saya tidak yakin bagaimana ini terjadi karena itu hanya terjadi kadang-kadang. Saya masih men-debug. Tetapi sekarang metode ini statis. Saya tidak memiliki masalah sejauh ini. Mungkin itu hanya keberuntungan. Saya tidak tahu pasti.
c#
multithreading
static
TalkingCode
sumber
sumber
Jawaban:
Variabel yang dideklarasikan di dalam metode (dengan kemungkinan pengecualian variabel " ditangkap ") diisolasi, jadi Anda tidak akan mendapatkan masalah bawaan; namun, jika metode statis Anda mengakses status bersama apa pun, semua taruhan dibatalkan.
Contoh keadaan bersama adalah:
Jika Anda telah berbagi status, Anda harus:
whatever.SomeData
berulang kali, Anda membacawhatever.SomeData
sekali ke dalam variabel lokal, dan kemudian cukup gunakan variabel - perhatikan bahwa ini hanya membantu untuk keadaan yang tidak dapat diubah!)sumber
Ya, itu hanya keberuntungan. ;)
Tidak masalah apakah metode tersebut statis atau tidak, yang penting adalah apakah datanya statis atau tidak.
Jika setiap utas memiliki instance kelasnya sendiri yang terpisah dengan kumpulan datanya sendiri, tidak ada risiko data tercampur. Jika datanya statis, hanya ada satu kumpulan data, dan semua utas berbagi data yang sama, jadi tidak ada cara untuk tidak mencampurnya.
Jika data Anda dalam instance terpisah masih tercampur, kemungkinan besar karena datanya tidak benar-benar terpisah.
sumber
It doesn't matter if the method is static or not, what matters is if the data is static or not
. Sebagai tambahan, variabel lokal yang dideklarasikan dalam lingkup metode statis tidak membentuk bagian data yang perlu kita khawatirkan dalam skenario yang diberikan.Metode statis seharusnya bagus untuk beberapa utas.
Di sisi lain, data statis dapat menyebabkan masalah karena upaya untuk mengakses data yang sama dari utas yang berbeda perlu dikontrol untuk memastikan bahwa hanya satu utas pada satu waktu yang membaca atau menulis data.
sumber
MSDN Selalu mengatakan:
Sunting: Seperti yang dikatakan orang-orang di sini, tidak selalu terjadi, dan jelas ini berlaku untuk kelas yang dirancang dengan cara ini di BCL, bukan untuk kelas yang dibuat pengguna di mana ini tidak berlaku.
sumber