Π Π°Π·Π½ΠΎΠ΅

Java volatile Ρ‡Ρ‚ΠΎ это: Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ volatile Π² Java β€” urvanov.ru

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ volatile Π² Java β€” urvanov.ru

МногиС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Java, Π΄Π°ΠΆΠ΅ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π½Π° Π½Ρ‘ΠΌ ΡƒΠΆΠ΅ нСсколько Π»Π΅Ρ‚, Π½Π΅ Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово
volatile Π² Java.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ поля с
volatile:

class A {
private volatile double someField1;
}

class A {

Β Β Β Β private volatile double someField1;

}

ИспользованиС
volatile β€” это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов обСспСчСния согласованного доступа ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Java ΠΈ синхронизации ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ Π² ΠΌΠΎΠ΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π² Java.

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово
volatile указываСтся для поля для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ компилятору, Ρ‡Ρ‚ΠΎ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присвоСния этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΈΠ· Π½Π΅Ρ‘ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ.

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, присвоСниС значСния этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ связь happens-before (ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ-Π΄ΠΎ) для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‡Ρ‚Π΅Π½ΠΈΠΉ ΠΈΠ· этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для Π»ΡŽΠ±Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ послС присвоСния Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ увидят это Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Java позволяСт ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π² цСлях ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΊΠ΅ΡˆΠ°Ρ… ΠΈΠ»ΠΈ рСгистрах процСссора). Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС послС записи Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния Π² ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ свою Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ копию со старым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. ИспользованиС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова
volatile Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ всСгда Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅, исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ измСнСния этого исходного значСния Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ сразу ΠΆΠ΅. Аналогично всС измСнСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ sychronized-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ synchronized-Π±Π»ΠΎΠΊΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±Π»ΠΎΠΊΠΎΠ² с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ Π²Ρ€ΠΎΠ΄Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ интСрфСйса
java.util.concurrent.locks.Lock послС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π²ΠΈΠ΄Π½Ρ‹ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ послС взятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π°Π΄ Ρ‚Π΅ΠΌ ΠΆΠ΅ самым ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π½ΠΎ Ссли Π±ΠΎΠ»Π΅Π΅ слоТныС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
volatile. МоТно Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… совмСстно β€” особого Π²Ρ€Π΅Π΄Π°, я Π΄ΡƒΠΌΠ°ΡŽ, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ
volatileΒ  ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° синглСтон.


ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ:

5 Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ Π½Π΅ Π·Π½Π°Π»ΠΈ ΠΎ многопоточности / Π₯Π°Π±Ρ€

Π₯ΠΎΡ‚ΡŒ ΠΎΡ‚ многопоточности ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‘ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚, ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Java-программисты, Π½ΠΎ Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π°ΡˆΡ‘Π» врСмя ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ вопрос Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ Π΅Ρ‰Ρ‘ мСньшС. ВмСсто этого ΠΌΡ‹ ΡƒΠ·Π½Π°Ρ‘ΠΌ ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, сколько Π½Π°ΠΌ трСбуСтся для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, добавляя Π½ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΡ‘ΠΌΡ‹ Π² свой инструмСнтарий лишь Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Π’Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ достойныС прилоТСния, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ Π»ΡƒΡ‡ΡˆΠ΅. ПониманиС особСнностСй компилятора ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Java ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивный, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄.

Π’ этом выпускС сСрии Β«5 Π²Π΅Ρ‰Π΅ΠΉ …», я ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Ρ‚ΠΎΠ½ΠΊΠΈΡ… аспСктов ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ программирования, Π² Ρ‚ΠΎΠΌ числС synchronized-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ классы. Π Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π² особСнности ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· этих конструкций Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с JVM ΠΈ Java-компилятором, ΠΈ ΠΊΠ°ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ взаимодСйствия ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: я ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈΠ· Ρ‚Π΅Ρ… людСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π·Π½Π°Π»ΠΈ этих пяти Π²Π΅Ρ‰Π΅ΠΉ ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, поэтому посчитала, Ρ‡Ρ‚ΠΎ эта ΡΡ‚Π°Ρ‚ΡŒΡ стоит Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‘ ΠΎΠ±Π½Π°Ρ€ΠΎΠ΄ΠΎΠ²Π°Ρ‚ΡŒ здСсь, Π½ΠΎ ΠΈ поэтому ΠΆΠ΅ ΠΌΠΎΠ³Π»Π° Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ошибки Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ΡΡ с энтузиазмом.
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°2: Π² коммСнтариях Π·Π½Π°ΡŽΡ‰ΠΈΠ΅ люди дСлятся ссылками ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅, Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ интСрСсными, Ρ‡Π΅ΠΌ содСрТаниС ΡΡ‚Π°Ρ‚ΡŒΠΈ)

1. Synchronized-ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ synchronized-Π±Π»ΠΎΠΊ?

Π’Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠΆΠ΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈΡΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Π»ΠΈ синхронизированным вСсь ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρƒ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠΈΡ‚ΡŒ. Π’ Ρ‚Π°ΠΊΠΈΡ… ситуациях, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° компилятор Java ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ исходный ΠΊΠΎΠ΄ Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄, ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с synchronized-ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΈ synchronized-Π±Π»ΠΎΠΊΠ°ΠΌΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ.

Когда JVM выполняСт synchronized-ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΏΠΎΡ‚ΠΎΠΊ опрСдСляСт, Ρ‡Ρ‚ΠΎ Π² method_info этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° проставлСн Ρ„Π»Π°Π³ ACC_SYNCHRONIZED. Π’ΠΎΠ³Π΄Π° ΠΎΠ½ автоматичСски устанавливаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ снимаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Если Π²Ρ‹Π»Π΅Ρ‚Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΊ автоматичСски снимаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, synchronized-Π±Π»ΠΎΠΊ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Π² JVM ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ запросов Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ явно Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π΅. Если Π²Ρ‹ посмотритС Π½Π° Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ для Π±Π»ΠΎΠΊΠ°, ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π² Π½Ρ‘ΠΌ ΠΊΡƒΡ‡Ρƒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² сравнСнии с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ. Листинг 1 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² ΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ.

Листинг 1. Π”Π²Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ синхронизации.

packageΒ com.geekcap;
publicΒ classΒ SynchronizationExampleΒ {

Β Β Β Β privateΒ intΒ i;

Β 

Β Β Β Β publicΒ synchronizedΒ intΒ synchronizedMethodGet()Β {

Β Β Β Β Β Β Β Β returnΒ i;

Β Β Β Β }

Β 

Β Β Β Β publicΒ intΒ synchronizedBlockGet()Β {

Β Β Β Β Β Β Β Β synchronized(Β thisΒ )Β {

Β Β Β Β Β Β Β Β Β Β Β Β returnΒ i;

Β Β Β Β Β Β Β Β }

Β Β Β Β }
}

ΠœΠ΅Ρ‚ΠΎΠ΄ synchronizedMethodGet() method Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄:

	0:	aload_0
	1:	getfield
	2:	nop
	3:	iconst_m1
	4:	ireturn

А Π²ΠΎΡ‚ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° synchronizedBlockGet():

        0:	aload_0
	1:	dup
	2:	astore_1
	3:	monitorenter
	4:	aload_0
	5:	getfield
	6:	nop
	7:	iconst_m1
	8:	aload_1
	9:	monitorexit
	10:	ireturn
	11:	astore_2
	12:	aload_1
	13:	monitorexit
	14:	aload_2
	15:	athrow

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ synchronized-Π±Π»ΠΎΠΊΠ° Π²Ρ‹Π΄Π°Π»ΠΎ 16 строк Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ synchronized-ΠΌΠ΅Ρ‚ΠΎΠ΄Π° – Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 5.

2. Β«Π’Π½ΡƒΡ‚Ρ€ΠΈΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅Β» (ThreadLocal) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ экзСмпляр ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для всСх экзСмпляров класса, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ класса. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ экзСмпляр ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ (ThreadLocal) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. ThreadLocal ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° свой собствСнный, ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ экзСмпляр ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ get() ΠΈΠ»ΠΈ set().

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ трассировщик ΠΊΠΎΠ΄Π°, Ρ‡ΡŒΠ΅ΠΉ Ρ†Π΅Π»ΡŒΡŽ являСтся ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‡Π΅Ρ€Π΅Π· ваш ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… классах Ρ‡Π΅Ρ€Π΅Π· нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π‘Π΅Π· ThreadLocal это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌΠΎ. Когда ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡ΠΈΠ½Π°Π» Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΅Π³ΠΎ трассировщиком, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ этот ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΏΡ€ΠΈ трассировкС.

Π‘ ThreadLocal это ΠΏΡ€ΠΎΡ‰Π΅. ΠŸΠΎΡ‚ΠΎΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ThreadLocal ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² Π½Π°Ρ‡Π°Π»Π΅ выполнСния, Π° Π·Π°Ρ‚Π΅ΠΌ обращаСтся ΠΊ Π½Π΅ΠΌΡƒ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ классС, ΠΈ пСрСмСнная ΠΏΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°ΡΡΠΈΡ€ΠΎΠ²ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для исполняСмого Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Когда Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ свою ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ запись ΠΎ трассировкС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ управлСния, отвСтствСнному Π·Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ всСх записСй.

ИспользованиС ThreadLocal ΠΈΠΌΠ΅Π΅Ρ‚ смысл, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ экзСмпляры ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

3. Volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

По ΠΌΠΎΠΈΠΌ ΠΎΡ†Π΅Π½ΠΊΠ°ΠΌ, лишь ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° всСх Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Java Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Java Π΅ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово volatile. Из Π½ΠΈΡ… лишь ΠΎΠΊΠΎΠ»ΠΎ 10 ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ² Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΈ Π΅Ρ‰Π΅ мСньшС Π·Π½Π°ΡŽΡ‚, ΠΊΠ°ΠΊ эффСктивно Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. ΠšΠΎΡ€ΠΎΡ‡Π΅ говоря, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом volatile(Β«ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹ΠΉΒ») ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ volatile, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ, Π½Π΅-volatile, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ.

Π’ цСлях ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ эффСктивности Ρ€Π°Π±ΠΎΡ‚Ρ‹, спСцификации языка Java позволяСт JRE ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ копию ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся Π½Π° Π½Π΅Π΅. МоТно ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ эти Β«Π²Π½ΡƒΡ‚Ρ€ΠΈΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅Β» ΠΊΠΎΠΏΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌΠΈ Π½Π° кэш, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π³Π»Π°Π²Π½ΠΎΠΉ памяти ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° трСбуСтся доступ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Но ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ случаС: запустятся Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ А ΠΊΠ°ΠΊ 5, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π²Ρ‚ΠΎΡ€ΠΎΠΉ – ΠΊΠ°ΠΊ 10. Если пСрСмСнная А измСнились ΠΎΡ‚ 5 Π΄ΠΎ 10, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ А. Однако Ссли пСрСмСнная А Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ°ΠΊ volatile, Ρ‚ΠΎ Ρ‚ΠΎ Π² любоС врСмя, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ обращаСтся ΠΊ Π΅Ρ‘ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ копию А ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Ρ‘ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Если ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ кэш ΠΈΠΌΠ΅Π΅Ρ‚ смысл. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для вас ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово volatile.

4. Volatile ΠΏΡ€ΠΎΡ‚ΠΈΠ² synchronized.

Если пСрСмСнная объявлСна ΠΊΠ°ΠΊ volatile, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ оТидаСтся Π΅Ρ‘ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. ЕстСствСнно, Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ JRE Π½Π°Π»ΠΎΠΆΠΈΡ‚ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΡ‹ синхронизации для volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π₯ΠΎΡ€ΠΎΡˆΠΎ это ΠΈΠ»ΠΈ ΠΏΠ»ΠΎΡ…ΠΎ, JRE нСявно обСспСчиваСт ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ доступС ΠΊ volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Π½ΠΎ с ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‡Π΅Π½ΡŒ большой ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΊΠΎΠΉ: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… синхронизировано ΠΈ запись Π² volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ синхронизирована, Π° Π½Π΅Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ – Π½Π΅Ρ‚.
Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π΅ бСзопасСн для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²:

myVolatileVar++;

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записан ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

intΒ tempΒ =Β 0;

synchronize(Β myVolatileVarΒ )Β {

Β Β tempΒ =Β myVolatileVar;
}

Β 

temp++;

Β 

synchronize(Β myVolatileVarΒ )Β {

Β Β myVolatileVarΒ =Β temp;
}

Β 

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли volatile пСрСмСнная обновляСтся нСявно, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ читаСтся, измСнСняСтся, Π° Π·Π°Ρ‚Π΅ΠΌ присваиваСтся ΠΊΠ°ΠΊ Π½ΠΎΠ²ΠΎΠ΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅-потокобСзопасным ΠΌΠ΅ΠΆΠ΄Ρƒ двумя синхронными опСрациями. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ, слСдуСт Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ JRE автоматичСской синхронизации volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠΠ°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ зависит ΠΎΡ‚ вашСго случая: Ссли присвоСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ зависит ΠΎΡ‚ Π΅Ρ‘ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎ врСмя ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°), Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ опСрация Π±Ρ‹Π»Π° потокобСзопасной.

5. ОбновлСния Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ.

Когда Π²Π°ΠΌ трСбуСтся ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°, Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ срСди Π½ΠΎΠ²Ρ‹Ρ… Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… классов Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ java.util.concurrent.atomic, Ρ‡Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ synchronized Π±Π»ΠΎΠΊ самому. АтомарныС классы Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ потокобСзопасно, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°, обновлСния ΠΈ добавлСния(add) значСния. Бписок Π°Ρ‚ΠΎΠΌΠ½Ρ‹Ρ… классов Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ AtomicInteger, AtomicBoolean, AtomicLong, AtomicIntegerArray, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π‘Π²ΠΎΠ΅ΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ программисту Π² использовании Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… классов являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ класса, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ get, set ΠΈ сСмСйство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ get-set Ρ‚ΠΎΠΆΠ΅ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΈ записи, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ значСния Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, синхронизированы, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния-обновлСния-записи. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ контроля Π½Π°Π΄ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ΠΌ синхронизированного ΠΊΠΎΠ΄Π°, Ρ‚ΠΎ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ³ΠΎ Π°ΠΏΠ΄Π΅ΠΉΡ‚Π΅Ρ€Π° поля.

ИспользованиС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ³ΠΎ Π°ΠΏΠ΄Π΅ΠΉΡ‚Π΅Ρ€Π°.

АтомарныС Π°ΠΏΠ΄Π΅ΠΉΡ‚Π΅Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, ΠΈ AtomicReferenceFieldUpdater ΠΏΠΎ сущСству ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΊ volatile полям. Π’Π½ΡƒΡ‚Ρ€ΠΈ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ классов Java ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΈΡ…. Π₯отя ΠΎΠ½ΠΈ Π½Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ Ρƒ вас Π½Π΅Ρ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ Π½Π΅ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Ρ‚ΡŒ свою Тизнь с ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ.

Листинг 2 дСмонстрируСт ΠΏΡ€ΠΈΠΌΠ΅Ρ€ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ обновлСния для измСнСния ΠΊΠ½ΠΈΠ³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚:
Листинг 2. Класс Book.

packageΒ com.geeckap.atomicexample;

Β 
publicΒ classΒ Book
{

Β Β Β Β privateΒ StringΒ name;

Β 

Β Β Β Β publicΒ Book()

Β Β Β Β {

Β Β Β Β }

Β 

Β Β Β Β publicΒ Book(Β StringΒ nameΒ )

Β Β Β Β {

Β Β Β Β Β Β Β Β this.nameΒ =Β name;

Β Β Β Β }

Β 

Β Β Β Β publicΒ StringΒ getName()

Β Β Β Β {

Β Β Β Β Β Β Β Β returnΒ name;

Β Β Β Β }

Β 

Β Β Β Β publicΒ voidΒ setName(Β StringΒ nameΒ )

Β Β Β Β {

Β Β Β Β Β Β Β Β this.nameΒ =Β name;

Β Β Β Β }
}

Β 

Класс Book – просто POJO (plain old Java object – нСзамысловатый старый Java ΠΎΠ±ΡŠΠ΅ΠΊΡ‚), Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅: name.

Листинг 3. Класс MyObject.

packageΒ com.geeckap.atomicexample;

Β 
importΒ java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

Β 
/**

Β *

Β *Β @authorΒ shaines

Β */
publicΒ classΒ MyObject
{

Β Β Β Β privateΒ volatileΒ BookΒ whatImReading;

Β 

Β Β Β Β privateΒ staticΒ finalΒ AtomicReferenceFieldUpdater<MyObject,Book>Β updaterΒ =

Β Β Β Β Β Β Β Β Β Β Β Β AtomicReferenceFieldUpdater.newUpdater(Β 

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β MyObject.class,Β Book.class,Β «whatImReading»Β );

Β 

Β Β Β Β publicΒ BookΒ getWhatImReading()

Β Β Β Β {

Β Β Β Β Β Β Β Β returnΒ whatImReading;

Β Β Β Β }

Β 

Β Β Β Β publicΒ voidΒ setWhatImReading(Β BookΒ whatImReadingΒ )

Β Β Β Β {

Β Β Β Β Β Β Β Β //this.whatImReadingΒ =Β whatImReading;

Β Β Β Β Β Β Β Β updater.compareAndSet(Β this,Β this.whatImReading,Β whatImReadingΒ );

Β Β Β Β }
}

Β 

Класс MyObject Π² листингС 3 прСдставляСт, ΠΊΠ°ΠΊ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, get ΠΈ set ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ set Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ просто ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ свою Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ссылку Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΊΠ½ΠΈΠ³Ρƒ (Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π² листингС 3), ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ AtomicReferenceFieldUpdater.

AtomicReferenceFieldUpdater

Javadoc опрСдСляСт AtomicReferenceFieldUpdater Ρ‚Π°ΠΊ:

A reflection-based utility that enables atomic updates to designated volatile reference fields of designated classes. This class is designed for use in atomic data structures in which several reference fields of the same node are independently subject to atomic updates.

(Основанная Π½Π° ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°, которая Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ обновлСния Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌ volatile ссылочным полям Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… классов. Π­Ρ‚ΠΎΡ‚ класс ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для использования Π² Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… структурах Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нСсколько ссылочных ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ записи ΡΠ²Π»ΡΡŽΡ‚ΡΡ нСзависимыми ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ для Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ)ΡƒΠ±Π΅ΠΉΡ‚Π΅ мСня, я Π½Π΅ знаю, ΠΊΠ°ΠΊ это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ пСрСвСсти

Π’ листингС 3 AtomicReferenceFieldUpdater создан Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° newUpdater, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

β€’ класс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, содСрТащСго ΠΏΠΎΠ»Π΅ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, MyObject)

β€’ класс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, Book)

β€’ имя поля для Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ³ΠΎ обновлСния

Π—Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΌ здСсь являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ getWhatImReading выполняСтся Π±Π΅Π· синхронизации любого Ρ€ΠΎΠ΄Π°, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ setWhatImReading выполняСтся ΠΊΠ°ΠΊ атомарная опСрация.

Π’ листингС 4 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ setWhatImReading () ΠΈ доказываСтся, Ρ‡Ρ‚ΠΎ пСрСмСнная измСняСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ:

Листинг 4. ВСст-кСйс Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ³ΠΎ Π°ΠΏΠ΄Π΅ΠΉΡ‚Π΅Ρ€Π°.

packageΒ com.geeckap.atomicexample;

Β 
importΒ org.junit.Assert;
importΒ org.junit.Before;
importΒ org.junit.Test;

Β 
publicΒ classΒ AtomicExampleTest
{

Β Β Β Β privateΒ MyObjectΒ obj;

Β 

Β Β Β Β @Before

Β Β Β Β publicΒ voidΒ setUp()

Β Β Β Β {

Β Β Β Β Β Β Β Β objΒ =Β newΒ MyObject();

Β Β Β Β Β Β Β Β obj.setWhatImReading(Β newΒ Book(Β «JavaΒ 2Β FromΒ Scratch»Β )Β );

Β Β Β Β }

Β 

Β Β Β Β @Test

Β Β Β Β publicΒ voidΒ testUpdate()

Β Β Β Β {

Β Β Β Β Β Β Β Β obj.setWhatImReading(Β newΒ Book(Β 

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β «ProΒ JavaΒ EEΒ 5Β PerformanceΒ ManagementΒ andΒ Optimization»Β )Β );

Β Β Β Β Β Β Β Β Assert.assertEquals(Β «IncorrectΒ bookΒ name»,Β 

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β «ProΒ JavaΒ EEΒ 5Β PerformanceΒ ManagementΒ andΒ Optimization»,Β 

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β obj.getWhatImReading().getName()Β );

Β Β Β Β }

Β 
}

Β 

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ – это всСгда испытаниС, Π½ΠΎ с Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΊΠ°ΠΊ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Java ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π»Π°, ΠΎΠ½Π° ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Π»Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ, которая ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ программирования. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я рассмотрСл ΠΏΡΡ‚ΡŒ Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π½Π΅ Π·Π½Π°Ρ‚ΡŒ ΠΎ написании ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Java, Π² Ρ‚ΠΎΠΌ числС Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ синхронизированными ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ ΠΊΠΎΠ΄Π°, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ использования ThreadLocal ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ Π½Π΅Π΄ΠΎΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ volatile (Π² Ρ‚ΠΎΠΌ числС опасности ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° volatile, ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ), ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ тонкостСй Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… классов. ΠšΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ большС, смотритС Ρ€Π°Π·Π΄Π΅Π» Бсылки(Π½Π° сайтС Π°Π²Ρ‚ΠΎΡ€Π°).

volatile vs. volatile / Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ OTUS. Онлайн-ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ / Π₯Π°Π±Ρ€

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚! ΠœΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π² ΠΏΡ€Π΅Π΄Π΄Π²Π΅Ρ€ΠΈΠΈ старта курса Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ C++Β»


ΠŸΠΎΠ²Π΅ΡΡ‚ΡŒ ΠΎ Π΄Π²ΡƒΡ…, казалось Π±Ρ‹, ΠΏΠΎΡ…ΠΎΠΆΠΈΡ…, Π½ΠΎ всС ΠΆΠ΅ Ρ€Π°Π·Π½Ρ‹Ρ… инструмСнтах

Π₯Π΅Ρ€Π± β€” Π°Π²Ρ‚ΠΎΡ€ бСстсСллСров ΠΈ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Π½Ρ‚ ΠΏΠΎ вопросам Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€ ПО Π² Microsoft. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с Π½ΠΈΠΌ Π½Π° www.gotw.ca.


Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово volatile? Как Π΅Π³ΠΎ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ? К всСобщСму Π·Π°ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Ρƒ, сущСствуСт Π΄Π²Π° распространСнных ΠΎΡ‚Π²Π΅Ρ‚Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² зависимости ΠΎΡ‚ языка, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄, volatile относится ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΈΠΊ программирования: lock-free ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ (Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ) ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со Β«Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉΒ» ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. (Π‘ΠΌ. Рисунок 1.)

Рисунок 1: ΠΏΠΎΠ²Π΅ΡΡ‚ΡŒ ΠΎ Π΄Π²ΡƒΡ… тСхничСских трСбованиях.

УсугубляСт ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρƒ ΠΈ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ эти Π΄Π²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… случая использования ΠΈΠΌΠ΅ΡŽΡ‚ частично ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ прСдпосылки ΠΈ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ограничСния, Ρ‡Ρ‚ΠΎ заставляСт ΠΈΡ… Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ схоТими, Π½Π΅ΠΆΠ΅Π»ΠΈ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π° самом Π΄Π΅Π»Π΅. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΆΠ΅ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΈ ΠΏΠΎΠΉΠΌΠ΅ΠΌ ΠΈΡ…, ΠΈ разбСрСмся, ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ Π² C, C++, Java ΠΈ C# β€” ΠΈ всСгда Π»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠ°ΠΊ volatile.

Π’Π°Π±Π»ΠΈΡ†Π° 1: Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ, Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… прСдпосылок.

Π‘Π»ΡƒΡ‡Π°ΠΉ 1: УпорядочСнныС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для lock-free программирования

Lock-free ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ связано с Π½Π°Π»Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ синхронизации ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструмСнтов Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, Π½Π΅ΠΆΠ΅Π»ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Как Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΈ сСгодня сущСствуСт ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр Ρ‚Π°ΠΊΠΈΡ… инструмСнтов. Π’ Π³Ρ€ΡƒΠ±ΠΎΠΌ историчСском порядкС ΠΎΠ½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ явныС Π±Π°Ρ€ΡŒΠ΅Ρ€Ρ‹ (explicit fences/barriers β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, mb() Π² Linux), ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ API (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, InterlockedExchange Π² Windows) ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ разновидности ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². МногиС ΠΈΠ· этих инструмСнтов ΠΌΡƒΡ‚ΠΎΡ€Π½Ρ‹ ΠΈ/ΠΈΠ»ΠΈ слоТны, ΠΈ ΠΈΡ… ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ lock-free ΠΊΠΎΠ΄ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² Ρ€Π°Π·Π½Ρ‹Ρ… срСдах ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ.

Однако Π² послСдниС нСсколько Π»Π΅Ρ‚ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ конвСргСнция ΠΌΠ΅ΠΆΠ΄Ρƒ поставщиками Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния: Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ индустрия ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ΡΡ Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ согласованных упорядочСнных Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (ordered atomic variables) Π² качСствС стандарта ΠΈΠ»ΠΈ СдинствСнного способа написания lock-free ΠΊΠΎΠ΄Π° с использованиСм основных языков ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ ОБ. Π’ Π΄Π²ΡƒΡ… словах, упорядочСнныС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ бСзопасны для чтСния ΠΈ записи Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ явных Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π΄Π²Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ: ΠΈΡ… Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² исходном ΠΊΠΎΠ΄Π΅ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹; ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ запись Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ, β€œΠ²ΡΠ΅ ΠΈΠ»ΠΈ ничСго”. Π£ Π½ΠΈΡ… Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ compareAndSet, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ. Π‘ΠΌ. [1] для получСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± упорядочСнных Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

УпорядочСнныС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ доступны Π² Java, C# ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языках .NET, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² готовящСмся стандартС ISO C++, Π½ΠΎ ΠΏΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ:

  • Java прСдоставляСт упорядочСнныС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом volatile (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, volatile int), ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ поддСрТивая это с Java 5 (2004). Java Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прСдоставляСт нСсколько ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² java.util.concurrent.atomic, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, AtomicLongArray, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ‚Π΅Ρ… ΠΆΠ΅ Ρ†Π΅Π»Π΅ΠΉ.
  • .NET Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΈΡ… Π² Visual Studio 2005, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом volatile (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, volatile int). Они подходят ΠΏΠΎΡ‡Ρ‚ΠΈ для любого Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° использования lock-free ΠΊΠΎΠ΄Π°, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π΅Π΄ΠΊΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ Π”Π΅ΠΊΠΊΠ΅Ρ€Π°. .NET исправляСт ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ ошибки Π² Visual Studio 2010, которая находится Π½Π° стадии Π±Π΅Ρ‚Π°-тСстирования Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания этой ΡΡ‚Π°Ρ‚ΡŒΠΈ.
  • ISO C++ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΈΡ… Π² Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ стандарта C++ 0x Π² 2007 Π³ΠΎΠ΄Ρƒ ΠΏΠΎΠ΄ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ atomic <T> (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, atomic). Π‘ 2008 Π³ΠΎΠ΄Π° ΠΎΠ½ΠΈ стали доступны Π² Boost ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… рСализациях. [2]. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° atomic ISO C++ Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт C-совмСстимый способ написания этих Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, atomic_int), ΠΈ ΠΎΠ½ΠΈ, вСроятно, Π±ΡƒΠ΄ΡƒΡ‚ приняты ISO C Π² блиТайшСм Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

ΠŸΠ°Ρ€Ρƒ слов ΠΎΠ± ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠœΡ‹ рассмотрим, ΠΊΠ°ΠΊ упорядочСнныС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ компиляторы, процСссоры, эффСкты ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты вашСй срСды выполнСния. Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ сначала ΠΊΡ€Π°Ρ‚ΠΊΠΎ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ основныС ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ практичСски Π²ΠΎ всСх языках Ρ‚Π°ΠΊΠΎΠ²ΠΎ: ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°ΡŽΡ‚ (Β«Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚Β») Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вашСго ΠΊΠΎΠ΄Π°, всСгда ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½Ρ‹ΠΌΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ смысла ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ исходного ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках это Ρ‚Π°ΠΊΠΆΠ΅ извСстно ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Β«as-ifΒ», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ своС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹Π΅ эффСкты, Β«ΠΊΠ°ΠΊ Ссли Π±Ρ‹Β» (as if) исходный исходный ΠΊΠΎΠ΄ Π±Ρ‹Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ Π±Ρ‹Π» ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ написан.

Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ двоякий эффСкт: Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, оптимизация Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π½ΡŒΡˆΠ΅ Π±Ρ‹Π» Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½, ΠΈΠ»ΠΈ Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ исходному ΠΊΠΎΠ΄Ρƒ Π±Ρ‹Π»ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ сСмантику языка. Если ΠΌΡ‹ Π΄Π°Π΄ΠΈΠΌ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, бСзусловно, смогут Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ, ΠΈ это ΡƒΠΆΠ΅ Π½Π΅ Β«ΠΊΠ°ΠΊ Ссли Π±Ρ‹Β» ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ исходный Π½Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… исполнСний. НапримСр, оптимизация ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ (Π½ΠΎ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅) чСрСдования (ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ порядка выполнСния инструкций β€” ΠΈΠ½Ρ‚Π΅Ρ€Π»ΠΈΠ²ΠΈΠ½Π³) Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄ΡƒΡ‚. Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄ΡƒΡ‚.

УпорядочСнныС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ оптимизация

ИспользованиС упорядочСнных Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π²ΠΈΠ΄Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ваш компилятор, процСссор ΠΈ систСма ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. [3] Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ:

  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ упорядочСнных Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния ΠΈ записи.
  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ сосСдних ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния ΠΈ записи.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, всС упорядочСнныС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΈ записи Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ строго Π² порядкС исходного ΠΊΠΎΠ΄Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΠΎΠ΄Π½Π° ΠΈΠ· Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ упорядочСнных Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΡ‹ всС Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Π² частности, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ эффСкт, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ этот ΠΏΠΎΡ‚ΠΎΠΊ просто всСгда выполнялся Ρ‚Π°ΠΊ быстро, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ Π±Ρ‹ чСрСдования с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

НапримСр, рассмотрим этот ΠΊΠΎΠ΄, Π³Π΄Π΅ a β€” упорядочСнная атомарная пСрСмСнная:

a = 1;  	// A
a = 2;  	// B

Допустимо Π»ΠΈ для компилятора, процСссора, кэша ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ части срСды выполнСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΡƒΡŽ запись Π² строкС A?

// A ': OK: ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ строку A 
a = 2;  	// B

ΠžΡ‚Π²Π΅Ρ‚: Β«Π”Π°Β». Π­Ρ‚ΠΎ Π»Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ; это β€œΠΊΠ°ΠΊ Ссли бы” этот ΠΏΠΎΡ‚ΠΎΠΊ всСгда Ρ€Π°Π±ΠΎΡ‚Π°Π» Ρ‚Π°ΠΊ быстро, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ строками A ΠΈ B, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. [4]

Аналогично, Ссли a β€” упорядочСнная атомарная пСрСмСнная, Π° local β€” нСраздСляСмая локальная пСрСмСнная, допустимо ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ

a = 1;  	// C: запись в a
local = a;  // D: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· a

Π²

a = 1;  	// C: запись в a
local = 1;  // D': OK, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ "подстановку константы"

Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· a. Π”Π°ΠΆΠ΅ Ссли Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ пытаСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запись Π² a, это β€œΠΊΠ°ΠΊ Ссли бы” этот ΠΏΠΎΡ‚ΠΎΠΊ всСгда Ρ€Π°Π±ΠΎΡ‚Π°Π» Ρ‚Π°ΠΊ быстро, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡƒΠ΄Π°Π²Π°Π»ΠΎΡΡŒ Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ строки C ΠΈ D, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ успССм Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ нашС собствСнноС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² local.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π±Π»ΠΈΠ·Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΈ записи всС Π΅Ρ‰Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ пСрСупорядочСны Π²ΠΎΠΊΡ€ΡƒΠ³ упорядочСнных Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ…, Π½ΠΎ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ограничСниями. Π’ частности, ΠΊΠ°ΠΊ описано Π² [3], ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΈ записи Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ упорядочСнному Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΌΡƒ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ (ΠΎΡ‚ β€œΠΏΠΎΡΠ»Π΅β€ ΠΊ β€œΠ΄ΠΎβ€) ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π²Π½ΠΈΠ· ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ упорядочСнной Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ записи (ΠΎΡ‚ β€œΠ΄ΠΎβ€ ΠΊ β€œΠΏΠΎΡΠ»Π΅β€). ΠšΠΎΡ€ΠΎΡ‡Π΅ говоря, это ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти ΠΈΡ… ΠΈΠ· критичСского Ρ€Π°Π·Π΄Π΅Π»Π° ΠΊΠΎΠ΄Π°, ΠΈ Π²Ρ‹ смоТСтС ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΈΠ³Ρ€Π°ΡŽΡ‚ ΠΎΡ‚ этого Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ см. [3].

На этом всС ΠΊΠ°ΡΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ lock-free программирования ΠΈ упорядочСнных Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. А ΠΊΠ°ΠΊ насчСт Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ случая, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Β«Π²ΠΎΠ»Π°Ρ‚ΠΈΠ»ΡŒΠ½Ρ‹Π΅Β» адрСса?

Π‘Π»ΡƒΡ‡Π°ΠΉ 2: Π‘Π²ΠΎΠ±ΠΎΠ΄Π½Ρ‹Π΅ ΠΎΡ‚ сСмантики ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для памяти с Β«Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉΒ» сСмантикой

  • Вторая Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ β€” Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Β«Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉΒ» ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, которая Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ памяти Π΄Π°Π½Π½ΠΎΠ³ΠΎ языка, Π³Π΄Π΅ компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ пСрСмСнная ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² любоС врСмя ΠΈ/ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅ΠΏΠΎΠ·Π½Π°Π²Π°Π΅ΠΌΡƒΡŽ сСмантику ΠΈ слСдствия. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:
  • АппаратныС рСгистры, Ρ‡Π°ΡΡ‚ΡŒ 1: АсинхронныС измСнСния. НапримСр, рассмотрим ячСйку памяти М Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΏΠ»Π°Ρ‚Π΅, которая ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΊ ΠΏΡ€ΠΈΠ±ΠΎΡ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ запись нСпосрСдствСнно Π² M. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ памяти, которая измСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ самой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, хранящССся Π² M, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ Π² любоС врСмя, Π΄Π°ΠΆΠ΅ Ссли Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚ Π² Π½Π΅Π΅; ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ.
  • АппаратныС рСгистры, Ρ‡Π°ΡΡ‚ΡŒ 2: Π‘Π΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠ°. НапримСр, рассмотрим ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти M Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΏΠ»Π°Ρ‚Π΅, Π³Π΄Π΅ запись Π² эту ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ всСгда автоматичСски увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ мСста Π² RAM памяти, компилятор Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ записи Π² M ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ сразу послС Π½Π΅Π΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· M ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ записано.
  • ΠŸΠ°ΠΌΡΡ‚ΡŒ, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ адрСса. Если данная ячСйка памяти доступна с использованиСм Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… адрСсов А1 ΠΈ А2, компилятор ΠΈΠ»ΠΈ процСссор ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ запись Π² ячСйку А1 ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ячСйкС А2. Π›ΡŽΠ±Π°Ρ оптимизация, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰Π°Ρ? Ρ‡Ρ‚ΠΎ запись Π² A1, Π½Π΅ измСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ A2, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΎΠΌΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½Π°.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Ρ‚Π°ΠΊΠΈΡ… мСстах памяти ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ бСзопасно Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ прСдполоТСния ΠΎ Π½ΠΈΡ… Π²ΠΎΠΎΠ±Ρ‰Π΅. Π˜Π½Ρ‹ΠΌΠΈ словами, компилятору Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ такая пСрСмСнная Π½Π΅ участвуСт Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ систСмС Ρ‚ΠΈΠΏΠΎΠ², Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. НапримСр, Ссли ячСйка памяти M ΠΈΠ»ΠΈ A1/A2 Π² Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ объявлСна ΠΊΠ°ΠΊ Β«intΒ», Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ это Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚? Π‘Π°ΠΌΠΎΠ΅ большСС, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ располоТСниС int, Π½ΠΎ это Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ int β€” Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², int Π½Π΅ Π°Π²Ρ‚ΠΎΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ сСбя, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ записываСтС Π² Π½Π΅Π³ΠΎ, ΠΈΠ»ΠΈ таинствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ измСняСт своС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚Π΅ запись Π²ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ адрСсу.

Нам Π½ΡƒΠΆΠ΅Π½ способ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ всС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ для ΠΈΡ… чтСния ΠΈ записи. ISO C ΠΈ C++ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΡ€Ρ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ, стандартный способ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ компилятору, Ρ‡Ρ‚ΠΎ это такая ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ пСрСмСнная, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ: volatile.

Java ΠΈ .NET Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ сопоставимой ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², управляСмыС срСды Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ сСмантику ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚, поэтому Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ с Β«Π½Π΅ΠΏΠΎΠ·Π½Π°Π²Π°Π΅ΠΌΠΎΠΉΒ» сСмантикой. Но ΠΈ Java, ΠΈ .NET ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π°Π²Π°Ρ€ΠΈΠΉΠ½Ρ‹Π΅ ΡˆΠ»ΡŽΠ·Ρ‹ для Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· управляСмой срСды ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°: Java прСдоставляСт Java Native Interface (JNI), Π° .NET прСдоставляСт Platform Invoke (P/Invoke). Однако Π² спСцификации JNI [5] ΠΎ volatile Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ говорится ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ упоминаСтся Π½ΠΈ Java volatile, Π½ΠΈ C/C++ volatile; Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ P/Invoke Π½Π΅ упоминаСтся взаимодСйствиС с .NET volatile ΠΈΠ»ΠΈ C/C++ volatile. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ доступа ΠΊ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ области памяти Π² Java ΠΈΠ»ΠΈ .NET Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ C/C++, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ C/C++ volatile для выполнСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΡ… ΡƒΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ инкапсулировали ΠΈ скрывали volatile ΠΏΠ°ΠΌΡΡ‚ΡŒ (Ρ‚. Π΅. Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»ΠΈ ΠΈ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ volatile) ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· JNI ΠΈ P/Invoke.

НСоптимизируСмыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ (Π½Π΅) оптимизация

ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΈ записи Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ написаны; Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ Π²ΠΎΠΎΠ±Ρ‰Π΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ сСмантику ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΈ ΠΊΠ°ΠΊ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ. Π­Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ строгиС выраТСния (ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с упорядочСнными Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ), ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² порядкС исходного ΠΊΠΎΠ΄Π°.

Рассмотрим снова Π΄Π²Π° прСобразования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ рассматривали Ρ€Π°Π½Π΅Π΅, Π½ΠΎ Π½Π° этот Ρ€Π°Π· Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡Π΅Π½Π½ΡƒΡŽ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ a Π½Π° Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ (C/C++ volatile) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ v:

v = 1;  // A
v = 2;  // B

Π›Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½ΠΎ Π»ΠΈ это ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ явно лишнюю запись Π² строкС A?

// A ': Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎ, нСльзя ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ запись
v = 2;  // B

ΠžΡ‚Π²Π΅Ρ‚ β€” Π½Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ записи строки A Π² v Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ смысла ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НапримСр, v ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ мСстополоТСниСм, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ обращаСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 ΠΏΠ΅Ρ€Π΅Π΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 2 ΠΈ ΠΈΠ½Π°Ρ‡Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Аналогично, Ссли v нСоптимизируСмая пСрСмСнная, Π° local β€” нСраздСляСмая локальная пСрСмСнная, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ нСдопустимо

v = 1;            // C: запись в v
local = v;        // C: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· v

Π²

a = 1;         	// C: запись в v
local = l;   // D': Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎ, нСльзя ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ
// "подстановку константы"

для упразднСния Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· v. НапримСр, v ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ адрСсом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски увСличиваСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ записи, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ запись 1 даст Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 2 ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ считывании.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ насчСт сосСдних ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния ΠΈ записи β€” ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ Π²ΠΎΠΊΡ€ΡƒΠ³ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ…? БСгодня Π½Π΅Ρ‚ практичСского ΠΏΠΎΡ€Ρ‚Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ компилятора C/C++ сильно Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΈ вряд Π»ΠΈ Π² скором Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π°Ρ‡Π½ΡƒΡ‚ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΡŽ. НапримСр, ΠΎΠ΄Π½Π° интСрпрСтация Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π° C++ гласит, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΌΠΎΠ³ΡƒΡ‚ свободно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² любом Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ чтСния ΠΈΠ»ΠΈ записи volatile C/C++, Π° Π²ΠΎΡ‚ обычная запись Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ чтСния ΠΈΠ»ΠΈ записи volatile C/C++ β€” Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ volatile C/C++ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΈ ΠΌΠ΅Π½Π΅Π΅ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Ρ‡Π΅ΠΌ упорядочСнныС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. НСкоторыС поставщики компиляторов ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ эту ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡŽ; Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ запись volatile; Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ сСмантику.

РСзюмС

Для написания бСзопасного lock-free ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π±Π΅Π· использования Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ упорядочСнныС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅: Java/.NET volatile, C++0x atomic<T>ΠΈ C-совмСстимый atomic_T.

Π§Ρ‚ΠΎΠ±Ρ‹ бСзопасно ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ со ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ с Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ сСмантикой, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅: ISO C/C++ volatile. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ.

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ сСмантику ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΠΈΠ»ΠΈ ΠΆΠ΅ сразу всСми гарантиями атомарности ΠΈ/ΠΈΠ»ΠΈ упорядочСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ для написания lock-free ΠΊΠΎΠ΄Π°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ стандарта ISO C++0x прСдоставляСт прямой способ Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ: volatile atomic <T>.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ

  1. Π“. Π‘Π°Ρ‚Ρ‚Π΅Ρ€. Β«Writing Lock-Free Code: A Corrected QueueΒ» (DDJ, ΠΎΠΊΡ‚ΡΠ±Ρ€ΡŒ 2008 Π³.). Доступно online Ρ‚ΡƒΡ‚.
  2. [2] Π‘ΠΌ. www.boost.org.
  3. [3] Π“. Π‘Π°Ρ‚Ρ‚Π΅Ρ€. Β«Apply Critical Sections ConsistentlyΒ» (DDJ, Π½ΠΎΡΠ±Ρ€ΡŒ 2007 Π³.). Доступно Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ Ρ‚ΡƒΡ‚.
  4. [4] БущСствуСт распространСнноС Π²ΠΎΠ·Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅: Β«Π’ исходном ΠΊΠΎΠ΄Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠ³ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Π Π°Π·Π²Π΅ это Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ наблюдаСмого повСдСния?Β» ΠΎΡ‚Π²Π΅Ρ‚: «НСт», ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ фактичСски Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ€Π°Π· воврСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅; для этого ΠΏΠΎΡ‚ΠΎΠΊΠ° ΡƒΠΆΠ΅ Π±Ρ‹Π» Π»Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” ΠΎΠ½ всСгда Ρ€Π°Π±ΠΎΡ‚Π°Π» Ρ‚Π°ΠΊ быстро, Ρ‡Ρ‚ΠΎ Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ»ΡƒΡ‡Π°Π»ΠΎΡΡŒ. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ слСдуСт ΠΈΠ· этой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ это ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… исполнСний, Ρ‡Ρ‚ΠΎ всСгда являСтся Π»Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½Ρ‹ΠΌ.
  5. [5] Π‘. Лянг. Java Native Interface: Руководство программиста ΠΈ спСцификация. (ΠŸΡ€Π΅Π½Ρ‚ΠΈΡ Π₯ΠΎΠ»Π», 1999). Доступно online Ρ‚ΡƒΡ‚.


БСсплатный Π²Π΅Π±ΠΈΠ½Π°Ρ€: Β«Hello, World!Β» Π½Π° фарси ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Unicode Π² C++»


Java Dev Notes: ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово volatile

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово volatile примСняСтся ΠΊ полям класса ΠΈ Π² ΠΎΠ±Ρ‰Π΅ΠΌ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ (ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ) нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этого ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΊ полю класса ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚:

  • Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого поля Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π² свою Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти. ВсС чтСния ΠΈ записи Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ΄Ρ‚ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² «Π³Π»Π°Π²Π½ΡƒΡŽ» ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ‚.Π΅. Ρ‚Ρƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΎ ΠΏΠΎΠ»Π΅ класса
  • Доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ дСйствуСт ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π±Ρ‹ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² Π±Π»ΠΎΠΊ synchronized, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ синхронизируСтся ΠΏΠΎ самому полю

Поясним ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚. Java позволяСт ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ доступ ΠΊ Π·Π°ΡˆΠ°Ρ€Π΅Π½Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² своСй области памяти для Π±ΠΎΠ»Π΅Π΅ эффСктивной Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’ΠΎΡ‡Π½Π΅Π΅, это позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ саму Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ многопоточности Π±ΠΎΠ»Π΅Π΅ эффСктивной. Π­Ρ‚ΠΈ «Ρ€Π°Π±ΠΎΡ‡ΠΈΠΈ ΠΊΠΎΠΏΠΈΠΈ» Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ синхронизированы с мастСр-ΠΊΠΎΠΏΠΈΠ΅ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лишь Π² Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ обусловлСны синхронизациСй — Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ лочится (locks) ΠΈ разлочиваСтся (unlocks). Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ раздСляСмая пСрСмСнная цСлостно ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ (reliably) обновляСтся, ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΊΡΠΊΠ»ΡŽΠ·ΠΈΠ²Π½Ρ‹ΠΉ доступ ΠΊ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π­Ρ‚ΠΎ дСлаСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π»ΠΎΠΊΠ° Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ обСспСчиваСт Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для доступа ΠΊ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Для пояснСния Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΡƒ для сравнСния volatile ΠΈ synchronized. НС зря Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅ использовано слово «ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ»: Доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ дСйствуСт ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π±Ρ‹ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² Π±Π»ΠΎΠΊ synchronized. Π’.ΠΊ. явно Π² ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ синхронизируСтся доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ….

Π˜Ρ‚Π°ΠΊ, Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ°:

Бвойствоsynchronizedvolatile
Π’ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉΠ’ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²
Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ Π»ΠΈ nullΠ½Π΅Ρ‚Π΄Π°
ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°Π΄Π°Π½Π΅Ρ‚
Когда происходит ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡΠšΠΎΠ³Π΄Π° явно происходит Π²Ρ…ΠΎΠ΄ Π² Π±Π»ΠΎΠΊ synchronizedΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ доступС ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ см: The volatile keyword in Java

Volatile Vs Static Π² java

ΠΏΡ€ΠΎΡ‰Π΅ говоря,

  1. статичСский : static ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ связаны с класс, Π° Π½Π΅ с ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ экзСмпляр класса раздСляСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ класса, которая находится Π² ΠΎΠ΄Π½ΠΎΠΌ фиксированном мСстС Π² памяти

  2. Π»Π΅Ρ‚ΡƒΡ‡ΠΈΠ΅: это ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊΠ°ΠΊ класс ΠΈ экзСмпляр ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

использованиС ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… сниТаСт риск ошибок согласованности памяти, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ любая запись Π² ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ устанавливаСт связь «ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ» с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ считываниями Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ измСнСния ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ всСгда Π²ΠΈΠ΄Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ

посмотри ΡΡ‚Π°Ρ‚ΡŒΠΈ by Javin Paul Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Π»ΡƒΡ‡ΡˆΠ΅ΠΌ случаС.

Π² отсутствиС volatile ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² стСкС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠΉ. Π‘Π΄Π΅Π»Π°Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΊΠ°ΠΊ volatile, всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² своСй Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ памяти ΠΈ ошибок согласованности памяти Π±Ρ‹Π»ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ.

здСсь variable ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ static (класса) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ instance (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ вашСго запроса :

Π² любом случаС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ статичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄Π½ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ для всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‚ΠΎΠ³Π΄Π° ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ΄Ρ‚ΠΈ Π½Π° volatile?

Ссли ΠΌΠ½Π΅ понадобится instance ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ static ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π”Π°ΠΆΠ΅ Π² случаС static пСрСмСнная, ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ Π½Π΅ гарантируСтся ΠΈΠ·-Π·Π° кэша ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅.

ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ сниТаСт риск ошибок согласованности памяти, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ любая запись Π² volatile-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ устанавливаСт ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ happens-before с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ считываниями Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ измСнСния ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ всСгда Π²ΠΈΠ΄Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ.

Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, это Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ volatile, ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСднСС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ volatile, Π½ΠΎ ΠΈ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ²Π΅Π» ΠΊ измСнСнию => ошибки согласованности памяти ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ с ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синхронизированныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Но Π² java Π΅ΡΡ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

использованиС простого Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ³ΠΎ доступа ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π±ΠΎΠ»Π΅Π΅ эффСктивно, Ρ‡Π΅ΠΌ доступ ΠΊ этим ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ‡Π΅Ρ€Π΅Π· синхронизированный ΠΊΠΎΠ΄

Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ классы java.util.concurrent ΠΏΠ°ΠΊΠ΅Ρ‚ прСдоставляСт Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ зависят ΠΎΡ‚ синхронизации.

относятся ΠΊ этому ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠΎΠΌ высокого уровня ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½ΠΎΠ²Ρ‹Π΅ подробности.

особСнно посмотритС Π½Π° Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

связанныС вопросы SE:

Volatile Vs Atomic

Π»Π΅Ρ‚ΡƒΡ‡ΠΈΠ΅ Π±ΡƒΠ»Π΅Π²Ρ‹Ρ… ΠΏΡ€ΠΎΡ‚ΠΈΠ² AtomicBoolean

Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ volatile ΠΈ synchronized Π² Java

4

Π°Π²Ρ‚ΠΎΡ€: Ravindra babu

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΈ понятный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова volatile Π² java (java, multithreading, concurrency, volatile)

Π’ вашСм ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: Ссли Π½Π΅ объявлСно volatile, сСрвСр JVM ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ keepRunning ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π° Π² ΠΏΠ΅Ρ‚Π»Π΅ (прСвращая Π΅Π΅ Π² бСсконСчный Ρ†ΠΈΠΊΠ») Π½ΠΎ клиСнтская JVM Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π΅ описаниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:

Когда ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΏΠΎΠ»Π΅ volatile, компилятор ΠΈ срСда выполнСния ΠΎΡ‚ΠΌΠ΅Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ эта пСрСмСнная являСтся ΠΎΠ±Ρ‰Π΅ΠΉ ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π½Π΅ΠΉ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. НСустойчивыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π΅ ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² рСгистрах ΠΈΠ»ΠΈ Π² ΠΊΡΡˆΠ°Ρ…, Π³Π΄Π΅ ΠΎΠ½ΠΈ скрыты ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ…
процСссоров, поэтому Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ°ΠΌΡƒΡŽ послСднюю запись Π»ΡŽΠ±Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

Π­Ρ„Ρ„Π΅ΠΊΡ‚Ρ‹ видимости ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π²Π½Π΅ значСния самой ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Когда ΠΏΠΎΡ‚ΠΎΠΊ A записываСт Π² ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊ B считываСт эту ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, значСния всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π²ΠΈΠ΄Π½Ρ‹ A ΠΏΠ΅Ρ€Π΅Π΄ записью Π² ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, становятся Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ B послС прочтСния ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

НаиболСС распространСнноС использованиС для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… volatile — это Ρ„Π»Π°Π³ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, прСрывания ΠΈΠ»ΠΈ состояния:

  volatile boolean flag;
  while (!flag)  {
     // do something untill flag is true
  }

Π˜Π·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΈΠ΄ΠΎΠ² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ состоянии, Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ этого трСбуСтся большС внимания. НапримСр, сСмантика volatile нСдостаточно сильна, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° (count++) Π°Ρ‚ΠΎΠΌΠ½ΠΎΠΉ, Ссли Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ пСрСмСнная написана Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΈ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ; ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ всС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ:

  • ЗаписываСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π½Π΅ Π·Π°Π²ΠΈΡΡΡ‰ΡƒΡŽ ΠΎΡ‚ Π΅Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния, ΠΈΠ»ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅
    ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ обновляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅;
  • ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Π½Π΅ участвуСт Π² ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ состояния; ΠΈ
  • Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π΅ трСбуСтся ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π²ΠΎ врСмя доступа ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠžΡ‚Π»Π°Π΄ΠΊΠ°. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки -server JVM ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ JVM, Π΄Π°ΠΆΠ΅ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ тСстирования. Π‘Π΅Ρ€Π²Π΅Ρ€ JVM выполняСт Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, Ρ‡Π΅ΠΌ клиСнтская JVM, такая ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅; ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (клиСнтская JVM), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ Π² срСдС развСртывания
(сСрвСр JVM).

Π­Ρ‚

java — Volatile: Π·Π°Ρ‡Π΅ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ пСрСупорядочиваниС ΠΊΠΎΠ΄Π° компилятора

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка

  1. Около
  2. ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹

  3. Для ΠΊΠΎΠΌΠ°Π½Π΄
  1. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка
    ΠžΠ±Ρ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹

  2. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка для ΠΊΠΎΠΌΠ°Π½Π΄
    Π“Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈ дСлятся частными знаниями с ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌΠΈ

  3. Вакансии
    ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ связанныС с Π½ΠΈΠΌ тСхничСскиС возмоТности ΠΊΠ°Ρ€ΡŒΠ΅Ρ€Π½ΠΎΠ³ΠΎ роста

  4. Π’Π°Π»Π°Π½Ρ‚
    НанимайтС тСхничСских спСциалистов ΠΈ создавайтС свой Π±Ρ€Π΅Π½Π΄ работодатСля

  5. Π Π΅ΠΊΠ»Π°ΠΌΠ°
    ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³Π°ΠΌ со всСго ΠΌΠΈΡ€Π°

.

Атомарный доступ (Π£Ρ‡Π΅Π±Π½ΠΈΠΊΠΈ Java β„’> ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ классы> ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ)

Π£Ρ‡Π΅Π±Π½ΠΈΠΊΠΈ Java Π±Ρ‹Π»ΠΈ написаны для JDK 8. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, описанныС Π½Π° этой страницС, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ прСимущСства ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ, прСдставлСнных Π² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… выпусках, ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ большС Π½Π΅ доступны.
Π‘ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΊ выпуску JDK для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π½ΠΎΠ²Ρ‹Ρ… функциях, ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡΡ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… для всСх выпусков JDK.

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ дСйствиС atomic — это дСйствиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ фактичСски происходит сразу.АтомарноС дСйствиС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° сСрСдинС: ΠΎΠ½ΠΎ Π»ΠΈΠ±ΠΎ происходит ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Π»ΠΈΠ±ΠΎ Π½Π΅ происходит вовсС. ΠŸΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ³ΠΎ дСйствия Π½Π΅ Π²ΠΈΠ΄Π½Ρ‹, ΠΏΠΎΠΊΠ° дСйствиС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ.

ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ приращСния, Ρ‚Π°ΠΊΠΎΠ΅ ΠΊΠ°ΠΊ c ++ , Π½Π΅ описываСт Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ΅ дСйствиС. Π”Π°ΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ простыС выраТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ слоТныС дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ дСйствия. Однако Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ:

  • Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ для ссылочных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (всС Ρ‚ΠΈΠΏΡ‹, ΠΊΡ€ΠΎΠΌΠ΅ long ΠΈ double ).
  • Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ для всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… volatile ( Π²ΠΊΠ»ΡŽΡ‡Π°Ρ long ΠΈ double ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…).

АтомарныС дСйствия нСльзя Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ, поэтому ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π΅ опасаясь Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Однако это Π½Π΅ устраняСт всю Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ дСйствия, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ошибки согласованности памяти всС Π΅Ρ‰Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹. ИспользованиС энСргозависимых ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… сниТаСт риск ошибок согласованности памяти, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ любая запись Π² ΡΠ½Π΅Ρ€Π³ΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ устанавливаСт связь «происходит Π΄ΠΎΒ» с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ считываниями Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ измСнСния Π² ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ всСгда Π²ΠΈΠ΄Π½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, это Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ , ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСднСС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΠΈΠ·ΠΌΠ΅Π½Ρ‡ΠΈΠ²ΠΎΠΉ , Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты ΠΊΠΎΠ΄Π°, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ это ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅.

ИспользованиС простого доступа ΠΊ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π±ΠΎΠ»Π΅Π΅ эффСктивно, Ρ‡Π΅ΠΌ доступ ΠΊ этим ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ‡Π΅Ρ€Π΅Π· синхронизированный ΠΊΠΎΠ΄, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ программиста большСй остороТности, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибок согласованности памяти.Π‘Ρ‚ΠΎΠΈΡ‚ Π»ΠΈ ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ усилия, зависит ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ слоТности прилоТСния.

НСкоторыС классы Π²
java.util.concurrent ΠŸΠ°ΠΊΠ΅Ρ‚ прСдоставляСт Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ зависят ΠΎΡ‚ синхронизации. ΠœΡ‹ обсудим ΠΈΡ… Π² Ρ€Π°Π·Π΄Π΅Π»Π΅, посвящСнном ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° высокого уровня.

.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *