happens-before
- Java kursu
- Uzman
- Ders 8/46
- 5 dk
happens-before ile hafıza sıralamasını öğrenirsin.
happens-before ilişkisi
happens-before, Java Bellek Modeli'nin (JMM) sıralama garantisidir. Eğer A işlemi B'den önce gerçekleşirse, A'nın bellek değişiklikleri B tarafından görülür. Bu, iş parçacıkları arası tutarlılığı sağlar.
Bu ilişkiyi birkaç mekanizma kurar: synchronized bloğu kilidi bırakanın değişikliklerini kilidi alanın görmesini sağlar; volatile yazımı sonrasındaki okumalar yeni değeri görür; final alanlar kurucu bitiminde görünür hale gelir. happens-before olmadan bir iş parçacığı diğerinin yazımını hiç görmeyebilir.
synchronized ile sıralama
Bir synchronized bloğu ya da yöntemi, aynı kilide sahip tüm iş parçacıkları için tek tek girişi zorunlu kılar. Kilidi bırakan iş parçacığının yaptığı tüm değişiklikler, kilidi sonraki alan iş parçacığı tarafından görülür.
Örnek: bir Counter sınıfında synchronized void inc() ve synchronized int get() olsun. Bir iş parçacığı inc yapıp kilidi bıraktığında, sonra get çağıran iş parçacığı yeni değeri görür. Bu, happens-before ilişkisinin en somut yoludur.
Uygulama synchronized sayaç
Bir Counter sınıfı yaz: private int count alanı, synchronized void inc() ve synchronized int get() yöntemleri. inc count++ yapsın. main içinde inc iki kez çağır ve get sonucunu System.out.println ile yazdır.
Başlangıç kodu
// Counter sınıfını tanımla
// synchronized inc ve get ekle
// main içinde sonucu yazdırÖrnek çözüm
class Counter {
private int count;
public synchronized void inc() { count++; }
public synchronized int get() { return count; }
}
public class HappensBeforeDemo {
public static void main(String[] args) {
Counter c = new Counter();
c.inc();
c.inc();
System.out.println(c.get());
}
}Beklenen çıktı
2
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Garanti mekanizmalarını eşleştir
| Kavram | Anlamı |
|---|---|
synchronized |
Happens-before |
volatile |
Görünürlük |
final |
Güvenli yayınlama |
yerel değişken |
Tek iş parçacığı |
2 happens-before ilişkisini hangi mekanizma kurar?
- synchronized blok Doğru cevap
- yerel değişken
- final alan
- Metaspace
Açıklama: synchronized, kilitle happens-before kurar.
3 synchronized anahtar sözcüğünü ekle
public ____ void inc() { count++; }
public synchronized void inc() { count++; }
Açıklama: synchronized yöntemi kilitleyerek sıralar.