Çift programlı kilitlemenin doğru çalışması için, değişkenin volatile
bildirilmesi ve nesnenin başlatılmasını senkronize etmenin yeterli olmadığı Java programcıları arasında çok iyi bilinmektedir.Java'da çift kontrol edilen kilitleme için "volatile" gerekli ancak C# değil mi?
Farkındalık, büyük olasılıkla, çoğunlukla, volatile
anahtar sözcüğünün semantiklerinin, bir "önce gerçekleşir" ilişkisini içerecek şekilde, en azından kısmen, çift denetlenen kilitleme güvenliğini sağlamak için değiştirildiğinden; Anladığım kadarıyla, "önce-olur" ilişkisi, bir değişken değişkene yazmak, iş parçacığındaki tüm önbelleğe alınmış değişkenlerin ana belleğe yazılmasına neden olur ve değişken bir değişkenden okunduktan sonra, tüm önbelleğe alınan değişkenler bayat olarak kabul edilir ve Ana bellekten yeniden okunabilir, böylece bir yazmadan önce yazılan her şeyin değişken bir değişkene "daha önce gerçekleşmesi" garantilenir. Ayrıca inanmak ise C# için, volatile
, iki kez kontrol kilitleme için (bu Microsoft'un uygulama belirli CPU'lar ya özgü olabileceğini endişeleri belirterek rağmen) gereksizdir,
yığın taşması seems to believe Java'nın synchronized
beyanı semantik exactly the same olduklarını C# 'nin lock
deyimiyle, iki dil arasındaki çift denetimli kilitleme anlamında başka önemli bir fark olmadığı sürece, C# için aynı sorunların C# için de var olacağını öne sürmektedir.
Yani ... hangisi doğru? C# 'de çift kontrol kilitleme aslında Java' dan daha az tehlikeli midir? Eğer öyleyse, bu durumda hangi dil semantiği farklıdır?
Aksi takdirde, volatile
olmadan özellikle yanlış gidebilir? C# içinde volatile
semantiği, Java gibi bir "olur-önce" ilişkisi kurar mı, böylece çift denetimli kilitleme, volatile
ile Java'da olduğu gibi 1.5'den beri güvenli midir?
Bkz. [This] (http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part-three.aspx) ve [ Bu] (http://stackoverflow.com/a/5821201/116614). – mellamokb