„Здрасти, Амиго!“

„Има една огромна тема – моделът на паметта на Java. По принцип все още не е нужно да знаете за нея, но ще бъде полезно да чуете за нея.“

„За да елиминира всички потенциални проблеми, Java промени своя механизъм за управление на паметта. Сега паметта не е просто разделена на локалния кеш на нишката и глобалната памет – механизмът е още по-добър.“

— И още по-сложно!

"Да, по-добре и по-сложно. Това е като самолет. Летенето със самолет е по-добро от ходенето, но по-сложно. Ще се опитам да обясня новата ситуация много просто."

„Ето Howво измислиха. Към codeа беше добавен механизъм за синхронизиране на паметта на локалната нишка, наречен „случва се преди“. Бяха измислени няколко правила/условия. Когато тези условия са изпълнени, паметта се синхронизира or актуализира до текущата състояние.

"Ето един пример:"

Поръчка Тема 1 Нишка 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;
}
Нишката чака мютексът да бъде освободен

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

„Едно от тези условия е придобиването на освободения мутекс. Ако мутекс бъде освободен и повторно придобит, тогава паметта ще бъде синхронизирана преди придобиването. Нишка 2 ще види „най-новите“ стойности на променливите x и y, дори ако не ги обявявате за непостоянни."

"Колко интересно! И има ли много от тези условия?"

„Достатъчно – ето някои условия за синхронизиране на паметта:“

  • „В рамките на една нишка всяка команда се изпълнява - преди всяка операция, която я следва в изходния code.“
  • „Освобождаването на заключване се случва – преди същото заключване да бъде придобито.“
  • „Случва се изход от синхронизиран блок/метод  – преди синхронизираният блок/метод да бъде въведен на същия монитор.“
  • "Записването на променливо поле в паметта се случва - преди същото променливо поле да бъде прочетено от паметта."
  • „Случва се край на метода за изпълнение на обект Thread – преди методът join() да приключи or методът isAlive() да върне false на обекта в същата нишка.“
  • „Извикването към метода start() на обект Thread се случва – преди методът run() да започне върху обекта в същата нишка.“
  • „Краят на конструктора се случва – преди началото на метода finalize() на този клас.“
  • „Извикването на метода interrupt() се случва – преди нишката да определи, че този метод е бил извикан, or защото е хвърлено InterruptedException, or чрез използване на методите isInterrupted() or interrupted().“

— Значи всичко е малко по-сложно, отколкото си мислех?

— Да, малко по-сложно…

"Благодаря ти, Риши. Ще помисля."

„Не се тревожете твърде много за тази тема. Ще дойде време, когато ще разберете всичко сами. Засега би било по-добре да разберете основите, instead of да се ровите в гъстата гора, която е вътрешна работа на Java машината. Java 9 ще бъде пусната и след това всичко ще се промени отново."

"O_o. Да... Някои неща е по-добре да не знаете."