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
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:
- 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: - 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.
Hiç Java geçici anahtar kelime kullanı...
Java mı anahtar kelime iddia, ne yapar...
Ne zaman "strictfp" java ana...
Ne zaman Java varargs kullanıyor musun...
Zaman git yerine git rebase birleştirm...