SORU
19 AĞUSTOS 2010, PERŞEMBE


Arasındaki fark uçucu ve JAVA ile senkronize

volatile olarak bir değişkeni bildirmek ve her zaman JAVA synchronized(this) bloğu (özellikle) J2ME değişken erişim arasındaki farkı merak ediyorum?

Bu maddeye göre http://www.javamex.com/tutorials/synchronization_volatile.shtml söylenecek çok şey var ve birçok farklılıklar değil, aynı zamanda bazı benzerlikler var.

Bilgi bu parça özellikle ilgi duyuyorum

...

  • sadece basit bir okuma yapıyoruz ya da yazmak, senkronize bir blok aksine hiç kilitlemek için beklemede olacağız.. geçici bir değişken için erişim asla bloke etme potansiyeline sahiptir:
  • geçici bir değişken erişmek asla bir kilit tutan çünkü, istediğimiz durumlar için uygun değildirokuma-güncelleme-yazatomik işlem için hazır olana kadar ("güncelleme") Bayan;

Onlar derken neyi kastediyorsunuzokuma-güncelleme-yaz? Bir de yaz bir güncelleme ya da sadece anlamına mı gelmezgüncellemebir okuma bilgi yazdığınız bağlıdır.

En önemlisi, ne zaman daha uygun değişkenler erişim onları synchronized volatile ilan etmek mi? İyi bir fikir giriş bağımlı değişkenler için volatile kullanımı kolay mı? Örneğin, işleme döngü ile bu tuşa basarak bir olay tarafından belirlenen bir değişken render adı var mı?

CEVAP
19 AĞUSTOS 2010, PERŞEMBE


Önemli olduğunu anlamak içinikiiş parçacığı güvenliği için yönleri: (1) yürütme kontrol ve (2) bellek görünürlük. İlk ile kontrol ederken kod çalıştırır (dahil olmak üzere sırada olan talimatlar idam) olup olmadığını yürütmek aynı anda ikinci bir ilgisi zaman etkileri anısına yapılan herşeyin görünür için başka bir iş parçacığı. Çünkü her CPU farklı düzeyleri arasında önbellek ve ana bellek, iş parçacığı çalışan farklı İşlemci veya çekirdek görmek "hafıza" farklı bir açıdan herhangi bir anı çünkü ipliklerden izin almak ve işe özel kopya ana bellek.

synchronized kullanarak monitörü (veya kilitlemek) almaktan başka bir iş parçacığı engelleraynı nesne içinböylece herhangi bir kod hiç aynı anda çalıştırma aynı nesneden eşitleme tarafından korunan engelliyor. Önemlisi, eşitlemeayrıca"olur-önce" bellek engelleyici, memory görüş kısıtlaması neden bazı iş parçacığı bir kilidi alır sonra . yapılan bir şey gibi oluşturur ^em>görünürbaşka bir iş parçacığı daha sonra eldeaynı kilitbu başka bir iş parçacığı daha önce de oldu kilidi satın aldı. Pratik açısından, güncel donanım, bu genellikle neden kızarma CPU önbellek bir monitör satın aldı ve yazar ana bellekten ne zaman yayınlandı, hem de hangi pahalı (göreceli olarak).

Diğer yandan volatile kullanarak tüm erişir (okuma veya yazma) ana bellek gerçekleşmesi için geçici değişken için, etkili bir şekilde önbelleğe CPU dışında değişken değişken tutmak zorlar. Bu sadece değişken görüş doğru olmasını gerekli olduğu bazı eylemler için yararlı olabilir ve erişir sırası önemli değildir. Kullanarak volatile da değişir tedavi long double gerektirir eriştiği için onlara atom; bazı (eski) bu donanım gerektirebilir kilitleri, olmasa da modern 64 bit donanım. Altında yeni (Genel Amaçlı-133) bellek modeli için Java 5 , mantığı uçucu olmuştur güçlendirilmesi için neredeyse kadar güçlü senkronize ile ilgili bellek görünürlük ve öğretim sıralama (bkz: http://www.cs.umd.edu/users/pugh/java/memoryModel/jsr-133-faq.html#volatile). Uçucu bir alan için görünürlük sağlamak amacıyla, her erişim yarım eşitleme gibi davranıyor.

Yeni bir bellek modeli altında, uçucu değişkenleri birbirleri ile yeniden sıralanmaz hala doğrudur. Fark artık çok kolay etrafında normal alanı erişir yeniden düzenlemek için. Uçucu bir alana yazma aynı bellek monitör sürümü etkiye sahiptir ve uçucu bir alandan okuma monitör satın alma olarak aynı bellek etkisi vardır. Etkisi, çünkü yeni bir bellek modeli yerler daha sıkı kısıtlamaları yeniden, uçucu alanı erişir ile diğer alan erişir, geçici ya da değil, bir şey olduğunu görünür iplik A zaman yazar için geçici saha f olur görünür iplik B okur f.

-- JSR 133 (Java Memory Model) FAQ

Şimdi hafıza bariyerin her iki form (geçerli POS destek altında) derleyici engeller veya çalışma zamanı Yeniden Sipariş karşısındaki engel talimatları gelen bir talimat Yeniden Sipariş bariyer neden. Eski BAĞLAR bal, uçucu Yeniden Sipariş engel olmadı. Bu bellek engelleri dışında tek sınırlama koydu, çünkü önemli olabilirherhangi bir belirli bir iş içinkod net etkisi ise talimatları hangi kaynak tam olarak göründükleri sırayla idam olsaydı olurdu aynıdır.

Ben sadece dün bazı kodlar nereye paylaşılan ama değişmez bir nesne yeniden anında, pek çok diğer konuları alarak bir referans nesnenin belirli bir noktada kendi yürütme döngüsü (başlangıç işleme mesaj) uçucu için mükemmel olan durum. Diğer konuları yayınlandı, ama tam senkronizasyon ek yükü gerek yoktu en kısa sürede yeniden nesne kullanmaya başlamak için gerekli ve görevli çekişme ve önbellek kızarma.

Senin için konuşma-update okuma-yazma, özellikle soru. Güvensiz aşağıdaki kodu göz önünde bulundurun:

public void updateCounter() {
    if(counter==1000) { counter=0; }
    else              { counter  ; }
    }

Şimdi, updateCounter() yöntemi uyumsuz, iki iş parçacığı aynı anda girebilirsiniz. Ne olabileceğine birçok permütasyon arasında, bir sayaç için test==1000 yapar thread1 ve doğru bulur ve sonra da askıya alınmış. Sonra thread2 aynı testi yapar ve de doğru görür ve askıya alınır. Sonra thread1 devam eder ve ayarlar 0 sayaç. Sonra yine çalmaya devam eder thread2 ve tekrar thread1 gelen güncelleme gelmedi diye 0 sayacı ayarlar. Bu da oldu bile iş parçacığı geçişi oluşmaz olarak tarif, ama sadece çünkü iki farklı önbelleğe alınan kopya sayacı yoktu iki farklı CPU çekirdek ve iş parçacığı her ran ile ilgili ayrı bir çekirdek. Bu konuda, bir iş parçacığı bir değeri sayaç alabilir ve diğeri sadece önbelleğe alma nedeniyle tamamen farklı bir değer tezgahında olabilir.

Bu örnekte önemli olan şey, değişkensayaçönbellek ana bellek okundu, önbellek güncelleştirildi ve sadece bazı belirsiz noktada ana belleğe geri önbelleği başka bir şey için ihtiyaç duyulduğu bir bellek bir engel meydana geldiğinde ya da daha sonra yazılmış. Yapma sayacı volatile yetersiz dişli-güvenlik kodunu, çünkü test için maksimum ve atamaları ayrı operasyon da dahil olmak üzere artış olan bir non-atomik read, increment, write, hangi makine seviyesi gibi bir şey

MOV EAX,counter
INC EAX
MOV counter,EAX

Geçici değişkenleri yararlı sadece zamantümoperasyon onları "atom", gibi benim örnek bir başvuru için eksiksiz bir nesne salt okunur veya yazılı (ve, aslında, genellikle sadece yazılı bir tek nokta). Başka bir örnek, uçucu bir dizi referans copy-on-write destekliyor liste, dizinin sadece ilk başvuru yerel bir kopyasını alarak okundu sağlanacak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DJAndrewRyan

    DJAndrewRyan

    22 Ocak 2007
  • girleffect

    girleffect

    20 Mayıs 2008
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008