Bölüm 9 · Simülatörİş Parçacığı Yarışı? ← Bölüm 9Java koduPaylaşılan bellekdeger0Araya girme sırası (son 4)1000 deneyhenüz deney yok Kapatİş Parçacığı YarışıAmaç: İki iş parçacığı aynı nesnedeki deger alanını artırdığında neden bazı artışların kaybolabildiğini (yarış durumu) ve synchronized ile AtomicInteger'ın bunu nasıl önlediğini görmek.Neden kaybolur?deger++ tek bir işlem değildir: değer bellekten okunur (r = deger), iş parçacığının kendi kopyasında artırılır (r = r + 1) ve belleğe yazılır (deger = r). İki iş parçacığı aynı eski değeri okuyup ikisi de yazarsa ikinci yazma birincinin artışını ezer: kayıp güncelleme. İş parçacıkları hangi sırayla çalışacağını seçemez; sırayı zamanlayıcı belirler.Düzeltmelersynchronized: metoda giren iş parçacığı nesnenin kilidini (monitör) alır. Kilit doluyken öbürü BLOCKED durumunda bekler; oku-artır-yaz bölünmeden tamamlanır.AtomicInteger: incrementAndGet() kilitsiz çalışır. Burada kavramsal olarak bir compareAndSet döngüsü gösterilir: okunan değer hâlâ bellekteyse yeni değer yazılır, değilse yeniden okunur. JVM bunu çoğu işlemcide tek bir atomik makine komutuyla yapar.Nasıl kullanılır?T1 ▶ ve T2 ▶ ile hangi iş parçacığının bir adım çalışacağını siz seçersiniz (klavyede 1 ve 2). Rastgele bir adım, Bitir rastgele bir sıralamayla bitirir.1000 deney, seçili sayaçla 1000 rastgele sıralama yapıp son değerlerin dağılımını çizer (yeşil çubuk: beklenen 2k).Görev: korumasız sayaçta bir kayıp güncelleme yaratın ya da elde edilebilecek en küçük sonuca ulaşın. Her biri k kez artıran iki iş parçacığında olası sonuçlar k = 1 için 1–2, k ≥ 2 için 2–2k'dır (bütün sıralamalar denenerek bulunmuştur).Gerçek bir Java 8 çalıştırmasında, her biri 100000 kez artıran iki iş parçacığı korumasız sayaçta beş denemede 194246 ile 199180 arasında sonuçlar verdi; aynı döngüde synchronized ve AtomicInteger sayaçları her seferinde 200000 oldu.İlgili sunum: Bölüm 9 · İş Parçacıkları (Yarış Durumu, sayac++ Neden Kaybolur?, synchronized ve Monitör, Yarışı Önlemek).