2014-04-15 11 views
5

Ç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?

+0

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

cevap

2

MSDN'dan itibaren: "Uçucu anahtar kelime, bir alanın aynı anda yürütülen birden fazla iş parçacığı tarafından değiştirilebileceğini belirtir. Uçuculuğa dönüştürülen alanlar, tek bir iş parçacığı tarafından erişmeyi kabul eden derleyici optimizasyonlarına tabi değildir. En güncel değerin alandaki her zaman mevcut olduğunu. "

Dolayısıyla, değişken, yalnızca değişkenin değerini birden fazla iş parçacığından değiştiriyorsanız faydalıdır. Paylaşılan kaynakları aynı kilitleme nesnesine aktaran kod alanlarını kilitlerseniz(), yalnızca bir iş parçacığının aynı anda bu kod alanlarına erişebildiğini garanti ederseniz, kilitleme nesnesini değiştirmediğiniz sürece uçucu hale gelmez (gerçekten kötü bir fikirdir). .

İlgili konular