2010-04-22 26 views
8

Java'da volatile olarak bir değişkeni işaretlemek, her iş parçacığının, eski bir değer yerine, en son yazılan değeri görmesini sağlar. Bunun gerçekten nasıl başarıldığını merak ediyordum. JVM, CPU paralarını ya da bir şeyi temizleyen özel talimatlar yayar mı?Uçucu aslında nasıl çalışır?

+0

İlgili soru (aslında listedeki ilk ..) http://stackoverflow.com/questions/1787450/how-do- I-anlamak-bellek-bariyerler-ve-uçucu – BalusC

+0

Ve ben sırasız yürütme ile ilgili "upvotes" ve "sık" bir sürü ile uçucu başladı bir konu: http://stackoverflow.com/questions/2441279/java-volatile-warranty -es-of-of-order-yürütme – SyntaxT3rr0r

cevap

8

Anladığım kadarıyla, her zaman önbellek yazma işleminden sonra yıkanmış gibi görünür ve her zaman okunan değerler okunduğunda okunmuş gibi görünür. Etki, bir iş parçacığının yazıların sonuçlarını her zaman başka bir iş parçacığından ve (Java bellek modeline göre) hiçbir zaman önbelleğe alınmış bir değer olarak göremeyeceğidir. Gerçek uygulama ve CPU talimatları, bir mimariden diğerine farklılık gösterecektir.

Eğer değişkeni birden fazla iş parçacığından geçirirseniz veya değerinizi kontrol edip, gerçek bir senkronizasyon olmadığından, bazı eylemler gerçekleştirirseniz, doğruluğu garanti etmez. Genelde sadece sadece değişken yazma işlemine ve diğerlerinin okuduğuna dair bir yazı yazılırsa, doğru yürütmeyi garanti edebilirsiniz. Ayrıca, 64 bit'lik bir değişken olmayan değişkenin iki 32 bit değişken olarak okunabileceğini/yazılabildiğini ve 32 bit değişkenlerinin yazmada atomik olduğunu, ancak 64 bit olanların da olmadığını unutmayın. Bir yarısı diğerinden önce yazılabilir - böylece okunan değer eski veya yeni değerden daha net olabilir.

Bu

benim imleri oldukça faydalı bir sayfası:

http://www.cs.umd.edu/~pugh/java/memoryModel/

+2

@jgubby: son paragrafınız doğru görünmüyor: bir yazmadan 32 bit, diğerinde ise 32 bitlik bir uçucu yazı okuyamazsınız. – SyntaxT3rr0r

+1

@WizardOfOdds: Anlaşıldı. Orada uçucu olmayan değişken demek. – gubby

+0

@jbuggy: ah ah, düşündüğüm buydu ama ne demek istediğimden emin olmadım çünkü yardım etmekten memnunum, çünkü aksi halde biraz kafa karıştırıcıydı :))) – SyntaxT3rr0r

1

Tam olarak ne olduğu, işlemciye özgüdür. Genellikle bir çeşit bellek bariyeri talimatları vardır. Tüm önbelleğin yıkanması açıkçası çok pahalı olurdu - donanımda önbellek tutarlılık protokolleri var.

Ayrıca önemli olan, saha erişiminde bazı optimizasyonların yapılmamasıdır. Derleyici multithreading düşünürken önemlidir, sadece donanımı düşünmeyin.

+1

Doğru yazılmış bir Java programında tam olarak ne olur, işlemciye özgü değildir. – gubby

+0

@jgubby Soru, özel talimatlar verilip verilmediğini soruyor. –