модел Java памет и валентност операции (Java модел памет)

Това се случва, че понякога pochityvayu различни интересни книги. Ето, например, за собственото си развитие всеки JSR чета :). От близкото - гледам през JSR-133 Java памет модел и Тема спецификация (Java модел памет) на.

В тази статия, искам да покажа още веднъж важността на конци синхронизация, пример за такова нещо като валентност (валентност) операции.

Да разгледаме следния код:

Аз декларирали променлива с летлив модификатор за да се гарантира, че всички теми, винаги ще виждат най-подходящата променлива.

Когато стартирате на екрана ще се появи цифрите 0 и 1. Разбира се, тъй като стойността на променливата и в потока последователно увеличава и намалява стойността си.

В действителност, за да System.out то ще бъде показано по следния начин:

И така, какво е сделката?

И това нещо е, че инкремент и декремент не са атомни. Последователно четене случи, повишаване / намаляване стойността и по-нататъшно запис.

Коригиране на грешка в кода помага на синхронизирани блока:

Валентност на клас Синхронизация казва, че по едно време в синхрон блок се намира на не повече от един поток. Други теми, ще чакат да улови клас монитор валентност. В какво ще се случи само след активната нишка освобождава монитора.

След коригиране и започнете клас в конзолата ще видим следното:

Атомност казва, че някои действия (или последователност), трябва да се случи "всички наведнъж". Osutstvie синхронизация може да доведе до катастрофални последици. Това не е NullPointerException, който може да се открие незабавно. Програмата може да работи в продължение на дълъг период от време и vizaulno няма проблеми, няма да се намери.

Когато пишете многонишковите приложения трябва да бъдат внимателни, да се следват всички възможни случаи на не-атомни грешки.

И още един много важен момент - в съответствие с влизането на Java памет модел в променлива от тип дълъг и двойно не е атомна. Дългите и двойни видове са 64-битови и се считат за атомни само на записите за всеки 32-битова част. Това може да доведе до факта, че някои поток вижда една част от стойността на актуализирана и второ, все още.

За да се гарантира атомност рекорд в дълъг и удвои трябва да го декларира като летлив.

Между другото, записването на референтен обект (справка) винаги атомен, независимо от това дали имаме работа с 32-битова или 64-битова изпълнение на JVM.

В Java памет модел Говорихме много по-интересни неща, като например видимост (видимост) и ред (поръчка). Но това е друга история.