"Merhaba, Amigo!"

"Dışarıda çok büyük bir konu var: Java Bellek Modeli. Temel olarak, henüz bu konuda bilgi sahibi olmanıza gerek yok, ancak duymanız faydalı olacaktır."

"Olası tüm sorunları ortadan kaldırmak için Java, bellek yönetim mekanizmasını değiştirdi. Artık bellek, bir iş parçacığının yerel önbelleğine ve genel belleğe bölünmüyor; mekanizma daha da iyi."

"Ve daha karmaşık!"

"Evet, daha iyi ve daha karmaşık. Uçak gibi. Uçakla uçmak yürümekten daha iyi ama daha karmaşık. Yeni durumu çok basit bir şekilde açıklamaya çalışacağım."

"İşte buldukları şey. Yerel iş parçacığı belleğini senkronize etmek için 'önce-olur' adı verilen bir mekanizma koda eklendi. Birkaç kural/koşul icat edildi. Bu koşullar karşılandığında, hafıza senkronize edilir veya mevcut duruma güncellenir. durum.

"İşte bir örnek:"

Emir konu 1 Konu 2
1
2

101
102
103
104
105

201
202
203
204
205
public int y = 1;
public int x = 1;

x = 2;
synchronized(mutex)
{
 y = 2;
}
İş parçacığı, muteksin serbest bırakılmasını bekliyor

synchronized(mutex)
{
 if (y == x)
 System.out.println("YES");
}

"Bu koşullardan biri, serbest bırakılan muteksin edinilmesidir. Bir muteks serbest bırakılır ve yeniden edinilirse, bu durumda bellek, edinmeden önce senkronize edilir. 2. İş Parçacığı, x ve y değişkenlerinin 'en son' değerlerini görecektir. onları uçucu ilan etmiyorsun."

"Ne kadar ilginç! Ve bu koşullardan çok var mı?"

"Yeter—işte bellek senkronizasyonu için bazı koşullar:"

  • "Tek bir iş parçacığı içinde, herhangi bir komut, kaynak kodda onu takip eden herhangi bir işlemden önce gerçekleşir ."
  • "Bir kilidin açılması , aynı kilit elde edilmeden önce gerçekleşir ."
  • " Senkronize bir bloktan/yöntemden  çıkış , aynı monitöre senkronize blok/yöntem girilmeden önce gerçekleşir ."
  • "Geçici bir alanın belleğe yazılması , aynı geçici alan bellekten okunmadan önce gerçekleşir ."
  • "Bir Thread nesnesinin çalıştırma yönteminin sonu, join() yöntemi sona ermeden veya isAlive() yöntemi aynı iş parçacığındaki nesnede false döndürmeden önce gerçekleşir ."
  • "Bir Thread nesnesinin start() yöntemine çağrı , aynı iş parçacığındaki nesnede run() yöntemi başlamadan önce gerçekleşir ."
  • "Kurucunun sonu , bu sınıfın finalize() yönteminin başlangıcından önce gerçekleşir ."
  • "Interrupted() yöntemine yapılan bir çağrı , iş parçacığı bu yöntemin çağrıldığını belirlemeden önce , ya bir InterruptedException atıldığı için ya da isInterrupted() ya da interrupted() yöntemleri kullanılarak gerçekleşir."

"Yani, her şey düşündüğümden biraz daha karmaşık mı?"

"Evet, biraz daha karmaşık..."

"Teşekkürler Rishi. Bunu düşüneceğim."

"Bu konuyu fazla kafana takma. Hepsini kendi kendine anlayacağın bir zaman gelecek. Şimdilik, ormanın derinliklerine inmektense, temelleri anlaman senin için daha iyi olacaktır." Java makinesinin iç işleyişi. Java 9 piyasaya sürülecek ve ardından her şey yeniden değişecek."

"O_o. Evet... Bazı şeyleri bilmemek daha iyidir."