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?
cevap
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ı:@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
@WizardOfOdds: Anlaşıldı. Orada uçucu olmayan değişken demek. – gubby
@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
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.
Doğru yazılmış bir Java programında tam olarak ne olur, işlemciye özgü değildir. – gubby
@jgubby Soru, özel talimatlar verilip verilmediğini soruyor. –
- 1. random() aslında nasıl çalışır?
- 2. .NET ExecutionContext aslında nasıl çalışır?
- 3. `if (Test-Path ...)` aslında nasıl çalışır? PowerShell'de
- 4. Rake db :: migrate aslında nasıl çalışır
- 5. Kotlin'in uçucu özellikleri?
- 6. Java uçucu dizisi?
- 7. Tam olarak nasıl çalışır?() {}() Çalışır?
- 8. XQUERY aslında nasıl kullanılır?
- 9. Uçucu Yapı Anlamları
- 10. C++ uçucu nesne, kalıcı üye söz konusu
- 11. Dosyanın aslında bir EPPlus
- 12. Yeni operatör nasıl çalışır?
- 13. nohup nasıl çalışır?
- 14. Ben aynı tip uçucu nesneye bir nesne atamak istediğiniz bir uçucu nesneye
- 15. Semboller nasıl çalışır?
- 16. ImageSwitcher aslında ne yapar?
- 17. Vert.x'te Gelecek Nasıl Çalışır?
- 18. `[<-` işlevi R'de nasıl çalışır?
- 19. Scala içinde uçucu olmayan üst sınır
- 20. bwmorph branchpoints nasıl çalışır?
- 21. Aslında Rails ActionController :: Metal
- 22. Aslında ne anlama geliyor?
- 23. "bildirilmemiş tanımlayıcı" aslında bildirildi
- 24. Neden DelegeateCommand.Execute() aslında çalışmıyor?
- 25. OverflowError aslında yükseltildi mi?
- 26. Aslında bir seçim nedir?
- 27. PCA'nın özellik boyutunu aslında nasıl azaltabilirim?
- 28. Jinja2 "özyinelemeli" etiketi aslında nasıl çalışıyor?
- 29. Aslında kullandığım düzine simgeleri nasıl "çekerim"?
- 30. Uçucu değişken, javada statik olarak tanımlanabilir mi?
İlgili soru (aslında listedeki ilk ..) http://stackoverflow.com/questions/1787450/how-do- I-anlamak-bellek-bariyerler-ve-uçucu – BalusC
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