Memory model
- Kotlin kursu
- Uzman
- Ders 21/47
- 5 dk
Kotlin/Native memory model'ini öğrenirsin.
Yeni bellek modeli
Kotlin/Native, başlangıçta katı bir iş parçacığı yalıtımı (strict thread isolation) kullanıyordu: her iş parçacığının kendi yığını vardı ve paylaşım yoktu. Yeni bellek modeli bunu gevşetti.
Yeni modelde, sıkıştırılmış iş parçacıkları arası paylaşım ve global işlem (global STW) çöp toplayıcı vardır. Bu, Kotlin/Native ve JVM arasında davranış uyumu sağlar. Yeni model varsayılan olarak Kotlin 1.9+'da etkindir; binaryOption("memoryModel", "experimental") gibi eski ayarlar kalkmıştır. Bu sayede mutableSharedState daha doğal yazılır; donmalar (frozen) büyük ölçüde tarihe karışmıştır.
Counter örneği
Yeni bellek modelinde, bir Counter sınıfı farklı iş parçacıklarında paylaşılabilir. Eski model bu durumda döndürma (freeze) gerektirirdi; yeni model gerektirmez.
Örnek: class Counter(private var n: Int = 0) { fun inc() { n += 1 }; fun get(): Int = n }. Yeni modelde bu sınıfı bir coroutine içinde Counter() yapıp başka bir coroutine'de inc() çağrılabilir; freeze() gerekmez. Eski modelde bu kod InvalidMutabilityException fırlatırdı. Bu dersteki alıştırmada basit bir Counter yazacaksın; bellek modelinin getirdiği rahatlığı göreceksin.
Uygulama Counter yaz
class Counter(private var n: Int = 0) tanımla. fun inc() metodu n'yi bir artırsın; fun get(): Int n'yi döndürsün. main içinde val c = Counter() yapıp iki kez c.inc() çağır ve println(c.get()) yaz.
Başlangıç kodu
// Counter sınıfını ekle
fun main() {
// iki kez inc çağır ve get sonucunu yazdır
}Örnek çözüm
class Counter(private var n: Int = 0) {
fun inc() { n += 1 }
fun get(): Int = n
}
fun main() {
val c = Counter()
c.inc(); c.inc()
println(c.get())
}Beklenen çıktı
2
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bellek modeli eşle
| Kavram | Anlamı |
|---|---|
Yeni model |
Paylaşımlı yığın |
Eski model |
İş parçacığı yalıtımı |
GC |
Çöp toplayıcı |
freeze |
Eski döndürma |
2 Yeni bellek modeli neyi kaldırdı?
- Döndürma (freeze) gerekliliğini Doğru cevap
- Coroutine'leri
- Type inference'ı
- Sınıf tanımlarını
Açıklama: Yeni model dondurmayı gereksiz kıldı; paylaşım serbestçe yapılır.
3 inc metodunu tamamla
class Counter(private var n: Int = 0) {
fun ____() { n += 1 }
fun get(): Int = n
}
class Counter(private var n: Int = 0) {
fun inc() { n += 1 }
fun get(): Int = n
}
Açıklama: inc() sayacı bir artırır.