SORU
15 AĞUSTOS 2010, Pazar


Tam olarak ne zaman Java geçici anahtar kelime kullanıyor musunuz?

Okudum "When to use 'volatile' in Java?" ama hala kafam karışık. Nasıl bir değişken değişken işareti ben ne zaman bileceğim? Ne yanılırsam, ya da ihtiyacı olan bir şey üzerinde bir uçucu atlama falan uçucu koyarak bu değil mi? Uçucu ne olması gerektiğini bulmaya ne başparmak kuralları çok iş parçacıklı kod?

CEVAP
15 AĞUSTOS 2010, Pazar


Temelde bir üye değişkeni birden çok iş parçacığı tarafından erişilmesine izin vermek istediğiniz zaman kullanabilirsiniz ama bileşik atom oranı değil emin eğer bu doğru terminoloji (varsa) gerekmez.

class BadExample {
    private volatile int counter;

    public void hit(){
        /* This operation is in fact two operations:
         * 1) int tmp = this.counter;
         * 2) this.counter = tmp   1;
         * and is thus broken (counter becomes fewer
         * than the accurate amount).
         */
        counter  ;
    }
}

yukarıda senin yüzünden kötü bir örnektirgerekatom oranı bileşik.

 class BadExampleFixed {
    private int counter;

    public synchronized void hit(){
        /*
         * Only one thread performs action (1), (2) at a time
         * "atomically", in the sense that other threads can not 
         * observe the intermediate state between (1) and (2).
         * Therefore, the counter will be accurate.
         */
        counter  ;
    }
}

Geçerli bir örnek için:

 class GoodExample {
    private static volatile int temperature;

    //Called by some other thread than main
    public static void todaysTemperature(int temp){
        // This operation is a single operation, so you 
        // do not need compound atomicity
        temperature = temp;
    }

    public static void main(String[] args) throws Exception{
        while(true){
           Thread.sleep(2000);
           System.out.println("Today's temperature is " temperature);
        }
    }
}

Şimdi, neden sadece private static int temperature kullanabilir mi? Aslında (öyle ki programınızı olmaz darbe falan), ama değiştirmek için temperature başka bir iş olabilir veya olmayabilir "görünür" ana iş parçacığı.

Temelde bu uygulama bu mümkün olduğu anlamına gelir. Today's temperature is 0 yazma eğer sonsuza kadar tutaryokvolatile (pratikte değeri sonunda görünür olma eğilimindedir. kullanın Ancak, pis böcek (içi tamamen yapılmış nesneler vb. nedeniyle) yol açabileceğinden, gerektiğinde kullanmıyor uçucu riski olmamalıdır.

Eğer volatile, ihtiyacı olmayan bir şey üzerinde volatile anahtar kelime koyarsanız, kodun doğruluğu (değişmez davranış gibi) etkilemez. Performans açısından, JVM uygulanmasına bağlı olacaktır. Teoride derleyici yeniden optimizasyon yapamaz çünkü küçük bir performans düşüşü olabilir, CPU önbellek geçersiz olması vb., ama yine derleyici alanı değildir ve asla birden çok iş parçacığı tarafından erişilen kanıtlamak ve volatile etkisi tamamen anahtar kelime ve aynı talimatları derleme kaldırmak olabilir.

DÜZENLEME:
Bu yorum yanıt:

Tamam, ama neden todaysTemperature senkronize ve sıcaklık için senkronize bir alıcı oluşturun?

Ve bunu doğru şekilde davranacaktır. Sana bir şey volatile synchronized, ama tersi ile yapılabilir. Eğer yapabilirsen volatile tercih edebilirsiniz iki nedeni vardır:

  1. Bu bağlamda bağlıdır, ancak birçok durumda volatile kullanarak eşzamanlılık hataları daha az eğilimli, kilidi tutarak engelleme gibi, kilitlenme vb. daha az hata eğilimli:
  2. Daha fazla ölçülebilir: JVM uygulamalarında önemli ölçüde daha yüksek verim ve daha iyi gecikme. en Ancak çoğu uygulamada fark önemsemek için fazla küçük.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fuse

    Fuse

    21 Kasım 2005
  • ICON

    ICON

    19 EKİM 2011
  • Pepsi

    Pepsi

    1 Kasım 2005