Java Моделът памет
Java модел памет (Англ. Java Memory Model. JMM) описва поведението на потоците в изпълнение среда Java. модел на паметта - част от езиковите семантиката на Java, и описва какво може и какво не трябва да очакваме програмистите, разработващи софтуер не е за конкретна Java машина, както и за Java като цяло.
- Или всеки акт на достъп до сингъла - дори когато обектът е създаден за дълго време и нищо не може да се промени - ще доведе до заключване на конци.
- Или при определени обстоятелства, системата ще недовършени сам.
- Или при определени обстоятелства системата ще създаде два сингъла.
- Или дизайн ще зависи от конкретния поведението на дадена машина.
Програмният език Java позволява да пишете многонишковите програми. Тъй като Java може да работи с различни процесори и операционни системи, конци синхронизация е особено трудно. Така че програмист може да направи някакви изводи за поведението на програми, Java разработчиците са решили да се определят ясно различни поведения на програмата Java.
На съвременните компютри за скорост код се изпълнява в различен ред, в който писмено. Пермутации извършва от компилатора, процесора и подсистемата на паметта. На многопроцесорни машини, всяко ядро може да има собствен кеш. не в синхрон с основната памет. Така че, различни процесори могат да бъдат различни стойности в същото време на една и съща променлива. Когато много теми, взаимодействат помежду си, обикновено е желателно: да бъде уведомен за друго процесор, имате нужда от много време.
В допълнение към еднонишкови околната среда е достатъчно да се изисква от системата "psevdoposledovatelnogo" на програмата - наблюдателят, който вижда само вход-изход, изглежда, че всички действия се извършват в реда, в който са се появили в програмата, дори и ако това не е така. Въпреки това, всеки, който може да "вижда" в памет на компютъра - в това число друга тема - всички тези "трикове" ще се вижда. Да разгледаме два потока, който едновременно управлява код (х и у първоначално нули).
Ако няма пермутация и потока на мисълта 2 у = 2. е гарантирано да бъде х = 1. след влизане в X се извършва преди запис в база. С пермутация е възможно, и на пръв поглед парадоксална ситуация: r1 = 2. R2 = 0.
Това поведение е многонишковите програми, моделът позволява на JMM, но описва, когато са възможни пермутации. По този начин, моделът на памет Java ограничава взаимодействието на потоци, така че да не се губи възможността да се оптимизира и в същото време да се даде възможност на многонишковите програми държат предвидимо и надеждно, където трябва да бъде. Програмистът може да направи заключения за реда, по който кодът се изпълнява на многонишковите машината, въпреки че оптимизацията се извършва от компилатора и процесор кеша.
Правило номер 1: еднонишкови програми се изпълняват psevdoposledovatelno. Това означава, че в действителност, процесорът може да изпълнява множество операции на такт, в същото време промените реда им, но всички зависимости данни са, така че поведението не се различава от серийния.
Правило номер 2: няма къде, които взеха ценности. Четене всяка променлива (с изключение на енергонезависима дълго и двойно. За което не може да се изпълни това правило) ще даде на стойност по подразбиране (нула), или нещо написано на другия отбор.
И правило номер 3: Останалата част от събитията, се изпълняват в ред, ако са свързани с строг частична поръчка "се изпълнява преди" (на английски се случи преди това.).
"Running първи"
Двата потока е намерено верига "се извършва преди" (определени частични криви символи за "по-малко") - така println показва правилната стойност.
"Running преди" (на английски се случи преди това.) - строг частична поръчка (arefleksivnoe, antisymmetric, преходен) въвежда между атомни команди (++ и - не атомен), въведен от Лесли Lamport и не означава "физически и преди." Това означава, че втората команда ще бъде "наясно" на промените, извършени на първо място.
По-специално, една изпълнена преди другото за такива сделки (списъкът не е изчерпателен):
- Синхронизация и монитори.
- Capture монитор (началото на заключването на метод синхронизирани.) И всичко, след като в една и съща нишка.
- Монитор връщане (в края на синхронизирани. Метод за отключване на), и всичко, което пред него в същата нишка.
- По този начин, оптимизатор може да влезе в синхрон блок ред, но не и навън.
- Връщане на монитора и последвалото залавяне на друга тема.
- Писане и четене:
- Всяко зависимост от данни (т.е. пост в някоя променлива и последващото му четене същото) в един поток.
- Всичко, което е в същата нишка, преди написването на летлив -variable и записа само себе си.
- летлив -Read и всичко, след като в една и съща нишка.
- Влизане летливи -variable и след това четене като [2] [4]. По този начин, летлив е -record върши същата памет, че връщането на монитора, а четенето - същото като залавянето на [5]. Това означава, че ако една нишка се записва в енергонезависима -variable, а вторият е намерен, всичко, което предхожда Записът се извършва преди всичко, което идва след четенето; см. илюстрация.
- За обект променливи (например, летливи Списък х;) такава силна гаранция се извършват за справка на обект, но не и за съдържанието му.
- Поддръжка:
- Статично инициализация и всяко действие с всеки обект, например.
- Писане в крайното поле в конструктора [6], и всичко, което след строителя. Като изключение от общото преходните, това се случва, преди връзка не е свързан с преходен други правила, и, следователно, може да причини раса-резба [7].
- Всяка работа с предмета и финализира ().
- Обслужване на потока:
- Като се започне поток и всеки код в потока.
- Изчезващата на променливите, свързани с потока, и всеки код в потока.
- поток код и да се присъединят (); код поток и isAlive () == невярно.
- прекъсване () и факта, откриване на спиране на потока.
Благодарение на широкото прилагане на многонишковите и паралелни системи, необходими инструменти с ясна семантика. Java модел памет е първият опит да се разработи цялостна модел между конец взаимодействие за мащабна език за програмиране. [8]
В C ++ 03, единствената забележка за резби - за летливи инстанция променливи не извършват никакви оптимизации, свързани с достъп до ускорение. Това също не е достатъчно, за да се даде възможност на пълен обмени на мощност компилатор / процесор и не получавате съобщение за грешка, свързани с извънредно изпълнение на някои отбори. Подобен модел на памет включен в C ++ 11 [9].