Özet - Memory model
- Java kursu
- Uzman
- Ders 12/46
- 5 dk
happens-before ve volatile'ı birleştirerek bir yayın aracı yazarsın.
Özet - Memory model
Bu grupta Java Bellek Modeli'nin temellerini gördük: yığın ve öbek ayrımı, happens-before sıralaması, volatile ile görünürlük, final alanların güvenli yayınlaması ve Metaspace. Bunlar iş parçacıkları arası tutarlılığı sağlar.
İş parçacığı güvenliği için üç anahtar sözcük hatırla: synchronized sıralama ve karşılıklı dışlama, volatile görünürlük, final değişmezlik ve güvenli yayınlama. Şimdi iki küçük görevle bunları tekrar edeceğiz.
Birlikte kullanım
Gerçek sistemlerde bu anahtar sözcükler birlikte kullanılır. Değişmez durum için final, basit bir bayrak için volatile, karmaşık oku-yaz işlemleri için synchronized tercih edilir.
Örnek: bir Config sınıfında ad değişmez olduğu için final String name, aktiflik bayrağı değişebildiği için volatile boolean active tutulur. Bu kombinasyon hem güvenli yayınlama hem de güncel görünürlük sağlar. Doğru anahtar sözcüğü seçmek, gereksiz kilitlemeden kaçınarak performansı korur.
Uygulama Config sınıfında final ve volatile
Bir Config sınıfı yaz: final String name ve volatile boolean active alanları, Config(String name) kurucusu name atayıp active = true yapsın. main içinde new Config("uygulama") ile oluştur ve c.name değerini System.out.println ile yazdır.
Başlangıç kodu
// Config sınıfını tanımla
// final name ve volatile active ekle
// main içinde adı yazdırÖrnek çözüm
class Config {
final String name;
volatile boolean active;
public Config(String name) { this.name = name; this.active = true; }
}
public class ConfigDemo {
public static void main(String[] args) {
Config c = new Config("uygulama");
System.out.println(c.name);
}
}Beklenen çıktı
uygulama
Uygulama Değişmez Triangle sınıfı
Bir Triangle sınıfı tanımla: final int a, final int b, final int c alanları ve bu alanları atayan kurucu. main içinde new Triangle(2, 3, 4) ile oluştur ve t.a + t.b + t.c sonucunu System.out.println ile yazdır.
Başlangıç kodu
// Triangle sınıfını tanımla
// final a, b, c alanları ekle
// main içinde toplamı yazdırÖrnek çözüm
class Triangle {
final int a;
final int b;
final int c;
public Triangle(int a, int b, int c) { this.a = a; this.b = b; this.c = c; }
}
public class TriangleDemo {
public static void main(String[] args) {
Triangle t = new Triangle(2, 3, 4);
System.out.println(t.a + t.b + t.c);
}
}Beklenen çıktı
9
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangi anahtar sözcük bellek görünürlüğü sağlar?
- volatile Doğru cevap
- new
- getClass
- int
Açıklama: volatile, alanın görünürlüğünü garanti eder.
2 volatile bayrağı tanımla
private ____ boolean active;
private volatile boolean active;
Açıklama: volatile bayrak görünürlüğü garanti eder.