2016-03-22 27 views
2

Şu anda "Java 4. Baskısında Düşünme" konusunu okudum ve bir paragrafla ilgili bir sorum var. (Eşzamanlılık bölümünde Sayfa 832)Java'da volatile anahtar kelime

bir alanın değeri (örneğin bir sayıcı gibi) önceki değerine bağlıdır, ne de kimin değerlerdir alanlarda çalışır zaman çalışmaz uçucu

kısıtına uyması gereken bir Range sınıfının alt ve üst sınırı gibi gibi diğer alanların değerleri ile sınırlanmıştır < = üst.

Ben "çalışmıyor uçucu" ve neden uçucu kelime nedir anlamıyorum diğer alanları dikkate sahiptir. Beni aydınlatabilir misin yoksa bana bir örnek verebilir misin? Çok teşekkür ederim! Uçucu

+0

Bunun uçucu ve atomik konuyla ilgili olduğunu düşünüyorum. Daha fazla bilgi için bu gönderiye bakın: http://stackoverflow.com/questions/9749746/what-is-the-difference-between-atomic-volatile-synchronized – pczeus

+1

Kitabım yok, ancak içeriği var gibi görünüyor. "Uçucu işe yaramıyor". İçeriğe bağlı olarak, eksik kısım şunun gibi bir şeydir: _ ** "Uçucu, bazı durumlar için eşzamanlılıkta yardımcı olabilir, ancak" ... ** _ bir alanın değeri önceki değerine bağlı olduğunda işe yaramaz ....._ Bu bağlamda, alıntılanan paragrafınız mantıklı olacaktır. –

cevap

2

bölme (uzanan iki evre varsa bir alanın bir değer, yukarıda örnek göz önüne alındığında önceki değerine

volatile int i; 

public void bar() { 
    if (i == 0) 
    i = 1; 
    else 
    i = 2; 
} 

bağlıdır çalışmıyor) ve i kontrol etmez 0, her iki iş parçacığı sonra i 1'e ayarlanmış. Ancak, i 2'ye artırılması bekleniyor. Uçucu, burada atomizmi garanti edemez.


ne de kısıtlama alt < = Üst

uymak zorundadır, değerleri, örneğin bir aralık sınıfın alt ve üst sınır gibi başka alanlarda değerleri ile kısıtlanır alanlarda çalışır
public class Range { 
    private int lower, upper; 

    public void setLower(int value) { 
     if (value <= upper) 
      lower = value; 
    } 

    public void setUpper(int value) { 
     if (value >= lower)     
      upper = value; 
    } 
} 

Bu durumda, alt ve üst alanları uçucu hale getirmek, iplik güvenliğini garanti edemez. Örneğin, alt ve üst başlangıç ​​değerlerinin sırasıyla 1 ve 10 olduğunu varsayalım. Eğer setLower (6) ve setUpper (4) 'ü aynı anda çalıştıran iki iplik varsa, ikisi de 6 ile 4 arasındaki geçersiz bir aralığa neden olan durum kontrollerini geçebilir. Böylece iplik güvenliğini garanti etmek için burada senkronizasyon gereklidir.

İlgili konular