Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ race condition java
Race condition ΠΈ D ata Race
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ΅ΡΠΈΡ ΡΡΠ°ΡΠ΅ΠΉ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ, ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ΅, concurrency ΠΈ Π΄ΡΡΠ³ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΡΡΡΠΊΠ°Ρ .
Race condition ΠΈ data race β Π΄Π²Π΅ ΡΠ°Π·Π½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΡΡΠΎ ΠΏΡΡΠ°ΡΡ. ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ.
Race condition
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²ΠΎΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ:
Race condition ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΊΠ»Π°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π΄Π²ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠΈΡ Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΡΡΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ.
Race condition β ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°Π±ΠΎΡΠ° ΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠ°ΡΡΠΈ ΠΊΠΎΠ΄Π°.
Race condition β ΡΡΠΎ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΈΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΡΡΠ°Π΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π΄Π²Π΅ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, Π½ΠΎ ΠΈΠ·-Π·Π° ΠΏΡΠΈΡΠΎΠ΄Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΡΡΠΎΠ±Ρ Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΌΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ.
Race condition β ΡΡΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΈΠ»ΠΈ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ±ΡΡΠΈΠΉ, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎΠΌΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠΎ ΠΌΠ½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡΠΎΡΠΊΠΎΠ΅ ΠΈ ΠΏΡΠΎΡΡΠΎΠ΅:
Race condition β ΡΡΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° Π²ΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠΎΠ±ΡΡΠΈΠΉ Π²Π»ΠΈΡΡΡ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠ°ΠΆΠ½ΠΎ, ΡΡΠΎ Race condition β ΡΡΠΎ ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ°.
Π ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΡ ΡΡ Π΅ΠΌ Π΅ΡΡΡ ΠΏΠΎΡ ΠΎΠΆΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°:
Π‘ΠΎΡΡΡΠ·Π°Π½ΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² β ΡΠ²Π»Π΅Π½ΠΈΠ΅ Π² ΡΠΈΡΡΠΎΠ²ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ ΡΠ°Π±ΠΎΡΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ Π°ΠΏΠΏΠ°ΡΠ°ΡΡΡΠ΅.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ, Π³Π΄Π΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½:
ΠΡΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠ΅:
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π³ΠΎΡΡΡΠΈΠ½. ΠΡΠΎ ΡΠΈΠΏΠΈΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° race condition. Π‘ΠΈΡΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅ΠΉ ΠΈ Π½Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½Π΅ΠΉ.
Π£ΡΠΈΡΡΠ²Π°Ρ, ΡΡΠΎ race condition ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ°, Π½Π΅Ρ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ»ΠΈΡΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅.
ΠΠΎΠΌΠΎΡΡ ΠΌΠΎΠ³ΡΡ Ρ ΠΎΡΠΎΡΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ.
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Π΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅ΡΠ½ΡΠ΅ ΠΈ Π½Π΅ΡΠ΅ΡΠ½ΡΠ΅ ΡΠΈΡΠ»Π°, Π° ΡΠ°ΡΡΠΈΡΡΠ²Π°Π»ΠΈ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ½ΡΠ΅.
ΠΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ ΠΎΠ±ΡΠΈΠΌ ΡΠ΅ΡΡΡΡΠ°ΠΌ ΠΏΡΠΎΡΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈ ΡΠ΅ΡΠ°ΡΡΡΡ ΠΎΠ½ΠΈ ΠΎΠ±ΡΡΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ:
ΠΈΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠ΅ΠΉ:
Data Race
Data race ΡΡΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΠΎΠ³Π΄Π° ΡΠ°Π·Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ΅ΠΉΠΊΠ΅ ΠΏΠ°ΠΌΡΡΠΈ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ Π·Π°ΠΏΠΈΡΡ.
ΠΡΠΈΠΌΠ΅Ρ Ρ Π±Π°Π»Π°Π½ΡΠΎΠΌ Π½Π° ΡΡΠ΅ΡΡ:
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π² ΡΠ°Π·Π½ΡΡ Π³ΠΎΡΡΡΠΈΠ½Π°Ρ :
ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π±Π°Π»Π°Π½Ρ ΡΠ°Π²Π΅Π½ 0, Π΄Π΅ΠΏΠΎΠ·ΠΈΡΠΈΠΌ 1000 ΡΠ°Π· ΠΏΠΎ 1. ΠΠΆΠΈΠ΄Π°Π΅ΠΌ Π±Π°Π»Π°Π½Ρ ΡΠ°Π²Π½ΡΠΉ 1000, Π½ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΄ΡΡΠ³ΠΎΠΉ:
ΠΠΎΡΠ΅ΡΡΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π΅Π½Π΅Π³.
ΠΡΠΈΡΠΈΠ½Π° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ acc.balance += amount Π½Π΅ Π°ΡΠΎΠΌΠ°ΡΠ½Π°Ρ. ΠΠ½Π° ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π·Π»ΠΎΠΆΠΈΡΡΡΡ Π½Π° 3:
ΠΠΎΠΊΠ° ΠΌΡ ΠΌΠ΅Π½ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅, Π² Π΄ΡΡΠ³ΠΈΡ ΡΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ balance. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ΅ΡΡΠ΅ΡΡΡ ΡΠ°ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ Π½Π°Ρ 2 ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠ° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΈΠ±Π°Π²ΠΈΡΡ ΠΊ Π±Π°Π»Π°Π½ΡΡ ΠΏΠΎ 1:
ΠΠΆΠΈΠ΄Π°Π»ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±Π°Π»Π°Π½Ρ=102, Π° ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ = 101.
Π£ Data Race Π΅ΡΡΡ ΡΠΎΡΠ½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡΡ, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΠ΅ΠΉ Π΄Π΅ΡΠ΅ΠΊΡΠΎΡΠΎΠ² Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½ΡΡ (ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅/Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ, ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π½Π° ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ, ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ Π³ΠΈΠ±ΡΠΈΠ΄Π½ΠΎΠ³ΠΎ data race).
Π£ Go Π΅ΡΡΡ Ρ ΠΎΡΠΎΡΠΈΠΉ Data Race Detector Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°ΠΊΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ.
Π Π΅ΡΠ°Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ:
Race Condition ΠΈ Data Race
Π€ΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΠ΅Π΄ΡΡΠ² Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΡΠ΅ΡΠ° Π½Π° Π΄ΡΡΠ³ΠΎΠΉ:
ΠΠ° ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠ΅ΡΡ Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ 1000, Π° Π½Π° Π΄ΡΡΠ³ΠΎΠΌ 0. ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ 1 Π² 1000 Π³ΠΎΡΡΡΠΈΠ½Π°Ρ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, ΡΡΠΎ Π²ΡΠ΅ Π΄Π΅Π½ΡΠ³ΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΡΠ΅ΡΠ° ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΡΡ Π² Π΄ΡΡΠ³ΠΎΠΉ:
ΠΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°ΠΊΠΈΠΌ:
ΠΡΠ»ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠΈΠΊΠ» Π½Π° Π±ΠΎΠ»ΡΡΠ΅Π΅ ΠΊΠΎΠ»-Π²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π΅ΠΉ:
ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π±Π΅Π· Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΠΊΠ°ΠΊ dara race (Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡΡΠ°ΡΡΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π±Π°Π»Π°Π½Ρ ΡΡΠ΅ΡΠ°), ΡΠ°ΠΊ ΠΈ race condition (Π² ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΠΏΠΎΡΠ΅ΡΠ΅ Π΄Π΅Π½Π΅Π³).
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΊΠΎΠΏΠΈΡ. ΠΠ±ΡΠ°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ ΡΠ°ΠΊΠΎΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΠΈ Π² ΠΈΡΠΎΠ³Π΅ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊ:
Π£ Π½Π°Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ Π²ΡΠ΅ ΡΡΠ°ΡΡΠΊΠΈ Ρ Π·Π°ΠΏΠΈΡΡΡ ΠΈ ΡΡΠ΅Π½ΠΈΠ΅ΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½Π°Ρ ΠΊΠΎΠΏΠΈΡ, Race Detector Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΡΠ³Π°Π΅ΡΡΡ Π½Π° ΠΊΠΎΠ΄. ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ 1000 ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π²Π΅ΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
ΠΠΎ ΡΡΠΎ Π΅ΡΠ»ΠΈ Π³ΠΎΡΡΡΠΈΠ½ Π±ΡΠ΄Π΅Ρ 10ΠΊ:
ΠΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ data race, Π½ΠΎ race condition ΠΎΡΡΠ°Π»ΡΡ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π½Π° Π²ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΠ΅Π΄ΡΡΠ², Π½ΠΎ ΡΡΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
Π Π΅ΡΠΈΠ² Data Race ΡΠ΅ΡΠ΅Π· ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΏΠ°ΠΌΡΡΠΈ (Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ) Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ΅ΡΠ°Π΅ΡΡΡ race condition ΠΈ logical correctness.
ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ ΠΊ race condition
ΠΡΠ»ΠΈ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ²ΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ Π²Π°Π»ΡΡΠΎΠΉ, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π΅Π³ΠΎ Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ ΡΠΈΠΏΠ° race condition (Β«ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΠ½ΠΊΠΈΒ» ΠΈΠ»ΠΈ, Π΅ΡΠ»ΠΈ ΡΠΎΡΠ½Π΅Π΅, β Β«Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β»). Race condition β ΡΡΠΎ Β«ΠΏΠ»Π°Π²Π°ΡΡΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ°Β», ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠ³ΡΡ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠΈ. Π‘ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ Π²Π°Π»ΡΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π΅Ρ ΠΈ, ΠΏΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, Π½Π°Π½Π΅ΡΡΠΈ ΠΎΡΡΡΠΈΠΌΡΠΉ ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΡΠΉ ΡΡΠ΅ΡΠ± Π²Π»Π°Π΄Π΅Π»ΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ°. ΠΠ΅Π΄Π°Π²Π½ΠΎ ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ ΡΠ°ΠΊΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½Π°ΡΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ Π΅Π΅ ΡΠ΅ΡΠΈΡΡ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ race condition
Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠ°ΡΡΠΎ Π·Π°Π±ΡΠ²Π°ΡΡ, ΡΡΠΎ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ½ΠΈ Π½Π΅ ΡΠ΅ΡΡΠΈΡΡΡΡ ΠΏΡΠΎΠ΄ΡΠΊΡ Π½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡ ΡΠΈΠΏΠ° race condition, Ρ ΠΎΡΡ ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ° Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π°.
Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π±ΡΠΊΡΠ½Π΄Π° ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ: Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΌΡ ΡΠ΅ΡΡΡΡΡ: ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΠΈΠ»ΠΈ ΡΠ°ΠΉΠ»Π°ΠΌ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΈΠ»ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ. ΠΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ Π²ΡΠ²ΠΎΠ΄Π° Π΄Π°Π½Π½ΡΡ .
ΠΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠΉ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ. ΠΠΎΠΏΡΡΡΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ Π±ΠΎΠ½ΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΡΠΌΠΈ ΠΊΠΎΡΠ΅Π»ΡΠΊΠ°ΠΌΠΈ. Π£ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠ° Π΅ΡΡΡ Π΄Π²Π° ΠΊΠΎΡΠ΅Π»ΡΠΊΠ° β A ΠΈ B, ΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ Π΅ΡΡΡ 1000 Π±ΠΎΠ½ΡΡΠΎΠ². ΠΠ° ΡΡ Π΅ΠΌΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΡΡΠΌΠΌΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° Π½Π° ΡΠ²ΠΎΠΉ ΡΡΠ΅Ρ ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΠ· 10 Π±ΠΎΠ½ΡΡΠΎΠ² β 20.
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ°ΠΊΠΈΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, RacePWN ΠΊΠΎΡΠΎΡΡΠΉ Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½Π° Π²Ρ ΠΎΠ΄ json-ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΎΠ±Π»Π΅Π³ΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΡ Π°ΡΠ°ΠΊΠΈ Π΄Π»Ρ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠΎΠ². ΠΡΡΡΠ½ΡΡ ΠΆΠ΅ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ POST-Π·Π°ΠΏΡΠΎΡΠΎΠ².
Π‘ΠΌΠ΅ΡΡΠ΅Π»ΡΠ½Π°Ρ race condition
Π Π‘Π¨Π Ρ ΠΈΡΠ½Ρ 1985 Π³ΠΎΠ΄Π° ΠΏΠΎ ΡΠ½Π²Π°ΡΡ 1987 Π³ΠΎΠ΄Π° ΠΎΡΠΈΠ±ΠΊΠ° race condition Π² Π°ΠΏΠΏΠ°ΡΠ°ΡΠ΅ Π»ΡΡΠ΅Π²ΠΎΠΉ ΡΠ΅ΡΠ°ΠΏΠΈΠΈ Therac-25, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠ°Π½Π°Π΄ΡΠΊΠΎΠΉ Π³ΠΎΡΡΠ΄Π°ΡΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Atomic Energy of Canada Limited (AECL) ΡΡΠ°Π»Π° ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΡΠ΅ΡΡΠΈ ΠΏΠ΅ΡΠ΅Π΄ΠΎΠ·ΠΈΡΠΎΠ²ΠΎΠΊ ΡΠ°Π΄ΠΈΠ°ΡΠΈΠ΅ΠΉ. ΠΠ΅ΡΡΠ²Ρ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π΄ΠΎΠ·Ρ Π² Π΄Π΅ΡΡΡΠΊΠΈ ΡΡΡΡΡ ΡΠ°Π΄. Π‘ΠΌΠ΅ΡΡΠ΅Π»ΡΠ½ΡΠΌ ΡΡΠΈΡΠ°Π΅ΡΡΡ ΡΡΠΎΠ²Π΅Π½Ρ Π² 1000 ΡΠ°Π΄. ΠΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΎΠΆΠΎΠ³ΠΎΠ² ΠΏΠΎΡΡΡΠ°Π΄Π°Π²ΡΠΈΠ΅ ΡΠΌΠ΅ΡΠ»ΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π½Π΅Π΄Π΅Π»Ρ. ΠΡΠΆΠΈΡΡ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΡΠΈΠ΅Π½ΡΠΊΠ΅.
ΠΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Therac ΠΈΠΌΠ΅Π»ΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ Π·Π°ΡΠΈΡΡ: Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠ΅ ΡΠ΅ΠΏΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡΡΠΈΠ΅ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΠΉ Π»ΡΡ; ΠΌΠ΅Ρ Π°Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠΎΡΡ; Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ; ΠΎΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΎΡ ΡΠ°Π½ΠΈΡΠ΅Π»ΠΈ. Π Therac-25 Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΡ Π·Π°ΡΠΈΡΡ ΡΠ±ΡΠ°Π»ΠΈ. ΠΠ° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΎΡΠ²Π΅ΡΠ°Π»ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΠΏΠΏΠ°ΡΠ°Ρ ΠΈΠΌΠ΅Π» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΆΠΈΠΌΠΎΠ² ΡΠ°Π±ΠΎΡΡ, ΠΈ ΠΈΠ·-Π·Π° ΠΎΡΠΈΠ±ΠΊΠΈ race condition Π²ΡΠ°Ρ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π», Π² ΠΊΠ°ΠΊΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Π°ΠΏΠΏΠ°ΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅. Π Ρ ΠΎΠ΄Π΅ ΡΡΠ΄Π΅Π±Π½ΡΡ ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅Π»ΡΡΡΠ² Π²ΡΡΡΠ½ΠΈΠ»ΠΎΡΡ, ΡΡΠΎ ΠΠ Therac-25 Π±ΡΠ»ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠΌ, Π½ΠΎ Ρ AECL Π½Π΅ Π±ΡΠ»ΠΎ Π΄Π°Π½Π½ΡΡ , ΠΊΠ΅ΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ.
ΠΠΎ ΠΈΡΠΎΠ³Π°ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΡΠ°Π²ΠΈΡΠ΅Π»ΡΡΡΠ²ΠΎ Π‘Π¨Π ΡΠ΅ΡΡΠ΅Π·Π½ΠΎ ΡΠΆΠ΅ΡΡΠΎΡΠΈΠ»ΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΈΡΡΠ΅ΠΌ, ΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΊΡΠΈΡΠΈΡΠ½Π° Π΄Π»Ρ Π»ΡΠ΄Π΅ΠΉ.
ΠΠ°ΠΊ Π·Π°ΡΠΈΡΠΈΡΡΡΡ
ΠΡΠΎΡΠ΅ ΠΈ Π΄Π΅ΡΠ΅Π²Π»Π΅ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ race condition β ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠΎΡ ΡΡΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ.
ΠΠ°ΠΊ ΠΌΡ Π½Π°ΡΠ»ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡ
ΠΠ°Ρ ΠΊΠ»ΠΈΠ΅Π½Ρ β ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-ΠΌΠ°Π³Π°Π·ΠΈΠ½ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΊΠΈΠ΄ΠΎΠΊ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΡΠΏΠΎΠ½ΠΎΠ². Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡ β ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ POST-Π·Π°ΠΏΡΠΎΡΠ° ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΡΠΏΠΎΠ½Π°. ΠΡΠΏΡΠ°Π²Π»ΡΡ Π·Π°ΠΏΡΠΎΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°ΠΌΠΈ, ΡΠ΄Π°Π²Π°Π»ΠΎΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΊΠΈΠ΄ΠΊΡ Π΄Π²Π°ΠΆΠ΄Ρ. Π‘ΡΠ΄Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΡ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π΄ΠΎΠΏΡΡΡΠΈΠ»ΠΈ Π³ΡΡΠ±ΡΡ ΠΎΡΠΈΠ±ΠΊΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΎΠΆΠ΄Π΅ΡΡΠ²Π»ΡΠ»ΡΡ Ρ ΠΏΠΎΠΊΡΠΏΠΊΠΎΠΉ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅
Race condition Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π½Π΅Π΄ΠΎΠΎΡΠ΅Π½ΠΈΠ²Π°ΡΡ. ΠΡΡΡΠ΅ ΠΏΠΎΡΡΠ°ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ ΠΈ ΡΠ΅ΡΡΡΡΡ Π½Π° ΠΏΠΎΠΈΡΠΊ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π΅ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΉ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ Π΄Π»Ρ Π±ΡΠ΄ΠΆΠ΅ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ.
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π² Java. Π§Π°ΡΡΡ 2
Jul 9, 2020 Β· 5 min read
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΠ½ΠΊΠΈ
ΠΠ½ΠΎΠ²Ρ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡ Π²Π°Ρ Π² ΡΠ΅ΠΌΠ΅ βΠ‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π² Javaβ! ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΠ»ΠΈ ΠΌΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΡΡ ΡΡΠ°ΡΡΡ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΡΠΌΡΡ, ΡΡΠΎ ΠΆΠ΅ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΠ½ΠΊΠΈ. ΠΡΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΡΠΎΡΠ²Π»ΡΠ΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ Π΄Π°Π½Π½ΡΠΌ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ. Π₯ΠΎΡΠΎΡΠΎ, ΡΠΎΠ³Π΄Π° ΡΡΠΎ ΠΆΠ΅ Π·Π½Π°ΡΠΈΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ Π΄Π°Π½Π½ΡΠΌ? ΠΡΠΎΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΄Π²Π° ΡΠ°Π·Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΠΎΠ³ΡΡ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΠΏΠΎΠ»Π΅, ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΠ°ΡΡΠΈΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ° Java. ΠΠ°Π²Π°ΠΉΡΠ΅ Π²ΠΎΠ·ΡΠΌΡΠΌ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ βSingletonβ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ Π² Π½ΡΠΌ ΠΏΡΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΠ½ΠΊΠΈ.
ΠΠ²Π° ΠΏΠΎΡΠΎΠΊΠ° ΠΏΡΡΠ°ΡΡ Ρ Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠΎΡ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°. ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅ ΡΠ΅Π±Π΅ ΡΠΈΡΡΠ°ΡΠΈΡ, Π³Π΄Π΅ ΠΏΠΎΡΠΎΠΊ 1 (T1) Π·Π°Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π² Π±Π»ΠΎΠΊΠ΅ if, Π² ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Π² ΠΏΡΠΎΡΠ΅ΡΡ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ T2 ΠΈ Π² ΠΈΡΠΎΠ³Π΅ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ Π±Π»ΠΎΠΊ if ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ βΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Singletonβ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΎΠΏΡΡΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ T1 ΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ T2 ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ.
ΠΠ°ΠΊ ΠΆΠ΅ ΡΡΠΎΠ³ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ? Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ Π΄Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
ΠΠ½Π°ΡΠΈΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ? ΠΠ°, ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ. Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π΅Ρ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠ². Π Π½ΠΈΡ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ synchronized Π·Π°ΡΠΈΡΠ°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ.
ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠ΅ΠΉ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΡΡΠΈ Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΠ» ΡΠ΅ΡΠΈΡ ΡΠΈΡΡΠ½ΠΊΠΎΠ². ΠΠ±ΡΠ°Π· ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ. ΠΠ·Π³Π»ΡΠ½ΠΈΡΠ΅ Π½Π° ΡΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎΡ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ ΠΏΡΠΎΡΠΈΡ ΠΊΠ»ΡΡ ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Ρ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡΡΡ Π² ΠΌΠ΅ΡΠΎΠ΄, Π° Π·Π°ΡΠ΅ΠΌ, ΠΏΠΎΠΊΠΈΠ΄Π°Ρ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠ»ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ. ΠΠΎΡΡΠΎΠΌΡ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ (ΠΏΠΎΡΠΎΠΊ 2) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ, ΡΡΠΎΠ±Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠ»ΡΡ. ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠ½ΡΠΈΠΏ, Π½Π΅ ΡΠ°ΠΊ Π»ΠΈ?
ΠΠΎ ΡΠ°ΠΊΡΡ ΠΈΠ· ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΊΠ»ΡΡ, Π΄Π΅Π»Π°Ρ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ. Π ΡΠ»ΡΡΠ°Π΅, ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠΌ Π²ΡΡΠ΅, ΠΌΡ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ»ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ synchronized Π² public static method. Π ΡΡΠΎ ΠΆΠ΅ Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ΄ΠΎΠ»Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π² ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ JVM? ΠΠ±ΡΠ΅ΠΊΡ Singleton.class. Π’.Π΅. ΡΡ ΠΎΠΆΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π² ΡΠ»ΡΡΠ°Π΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π² Π½Π΅ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π°Ρ JVM ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Singleton.class Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ²Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ²Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π° Π½ΠΈΠΆΠ΅. ΠΠ°, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π²Ρ ΡΠΆΠ΅ Π·Π½Π°Π΅ΡΠ΅ ΠΏΠΎΡΠ΅ΠΌΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° getName() ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π±Π»ΠΎΠΊ Π²Π½ΡΡΡΠΈ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ key Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° synchronized. ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΡΡΠΎ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°ΡΠ½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ.
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ Student Ρ Π΄Π²ΡΠΌΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ getName() ΠΈ getMarks(). ΠΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ JVM, Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ°ΠΌΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ Student. ΠΠΎΠ³Π΄Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π·Π°Ρ ΠΎΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ getName(), ΠΎΠ½ Π²ΠΎΠ·ΡΠΌΡΡ ΡΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ Π»ΠΈΡΠ°Ρ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠΎΡ ΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Ρ Π½ΠΈΠΌ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π½Π΅ ΠΎΠ±ΡΡΠ²Π»ΡΠ»ΠΈ ΡΠ²Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π² ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π½Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ ΡΠΎΡ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡ key. ΠΡΠ°ΠΊ, ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ Π΄Π»Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΈΡ Π΄Π²ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π² ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅ Student Π΄Π²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ Π΄Π²Π° Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π° ΠΈΠ· 2 Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ (2 ΡΠ°Π·Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²).
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ Π΄Π²Π° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΊΠ»Π°ΡΡΠ° Student: Student1 ΠΈ Student2. Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π²ΡΠΌΡ ΠΊΠ»ΡΡΠ°ΠΌΠΈ.
What is a race condition?
When writing multithreaded applications, one of the most common problems experienced is race conditions.
My questions to the community are:
18 Answers 18
A race condition occurs when two or more threads can access shared data and they try to change it at the same time. Because the thread scheduling algorithm can swap between threads at any time, you don’t know the order in which the threads will attempt to access the shared data. Therefore, the result of the change in data is dependent on the thread scheduling algorithm, i.e. both threads are «racing» to access/change the data.
Problems often occur when one thread does a «check-then-act» (e.g. «check» if the value is X, then «act» to do something that depends on the value being X) and another thread does something to the value in between the «check» and the «act». E.g:
The point being, y could be 10, or it could be anything, depending on whether another thread changed x in between the check and act. You have no real way of knowing.
In order to prevent race conditions from occurring, you would typically put a lock around the shared data to ensure only one thread can access the data at a time. This would mean something like this:
A «race condition» exists when multithreaded (or otherwise parallel) code that would access a shared resource could do so in such a way as to cause unexpected results.
If you had 5 threads executing this code at once, the value of x WOULD NOT end up being 50,000,000. It would in fact vary with each run.
This is because, in order for each thread to increment the value of x, they have to do the following: (simplified, obviously)
Any thread can be at any step in this process at any time, and they can step on each other when a shared resource is involved. The state of x can be changed by another thread during the time between x is being read and when it is written back.
Let’s say a thread retrieves the value of x, but hasn’t stored it yet. Another thread can also retrieve the same value of x (because no thread has changed it yet) and then they would both be storing the same value (x+1) back in x!
Race conditions can be avoided by employing some sort of locking mechanism before the code that accesses the shared resource:
Here, the answer comes out as 50,000,000 every time.
For more on locking, search for: mutex, semaphore, critical section, shared resource.
Religious code review, multi-threaded unit tests. There is no shortcut. There are few Eclipse plugin emerging on this, but nothing stable yet.
How do you handle and prevent them?
The best thing would be to create side-effect free and stateless functions, use immutables as much as possible. But that is not always possible. So using java.util.concurrent.atomic, concurrent data structures, proper synchronization, and actor based concurrency will help.
The best resource for concurrency is JCIP. You can also get some more details on above explanation here.
There is an important technical difference between race conditions and data races. Most answers seem to make the assumption that these terms are equivalent, but they are not.
A data race occurs when 2 instructions access the same memory location, at least one of these accesses is a write and there is no happens before ordering among these accesses. Now what constitutes a happens before ordering is subject to a lot of debate, but in general ulock-lock pairs on the same lock variable and wait-signal pairs on the same condition variable induce a happens-before order.
A race condition is a semantic error. It is a flaw that occurs in the timing or the ordering of events that leads to erroneous program behavior.
Many race conditions can be (and in fact are) caused by data races, but this is not necessary. As a matter of fact, data races and race conditions are neither the necessary, nor the sufficient condition for one another. This blog post also explains the difference very well, with a simple bank transaction example. Here is another simple example that explains the difference.
Now that we nailed down the terminology, let us try to answer the original question.
Given that race conditions are semantic bugs, there is no general way of detecting them. This is because there is no way of having an automated oracle that can distinguish correct vs. incorrect program behavior in the general case. Race detection is an undecidable problem.
On the other hand, data races have a precise definition that does not necessarily relate to correctness, and therefore one can detect them. There are many flavors of data race detectors (static/dynamic data race detection, lockset-based data race detection, happens-before based data race detection, hybrid data race detection). A state of the art dynamic data race detector is ThreadSanitizer which works very well in practice.
Handling data races in general requires some programming discipline to induce happens-before edges between accesses to shared data (either during development, or once they are detected using the above mentioned tools). this can be done through locks, condition variables, semaphores, etc. However, one can also employ different programming paradigms like message passing (instead of shared memory) that avoid data races by construction.
ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ Π² Java. ΠΠ΅ΠΊΡΠΈΡ 2: ΠΏΠΎΡΠΎΠΊΠΈ, ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΏΠΎΡΠΎΠΊΠΎΠ², Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
Π’Π΅ΠΌΠ½ΡΡ ΡΠΈΠ»Ρ ΡΡΠ²ΡΡΠ²ΡΡ Ρ.
ΠΠ°Π΅ΡΡ ΠΏΠ°ΡΡΠ΅ΠΊ Π·Π° ΡΡΠΈ Π³ΠΎΠ΄Π°.
ΠΠ²ΠΎΠ΄Π½ΡΡ ΡΡΠ°ΡΡΡ ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ Π² Java ΡΠΈΡΠ°ΠΉΡΠ΅ Π·Π΄Π΅ΡΡ! Π Π΅Π΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠΈ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ: ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅, Π·Π°ΠΏΡΡΠΊ ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΏΠΎΡΠΎΠΊΠ°, ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠ°Π»Π΅Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° synchronized, volatile ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ happens-before.
2.1 Π‘ΡΠ΅Π΄ΡΡΠ²Π° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡΡ Π² Java ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ
Π ΠΏΠ΅ΡΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Java ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡΡ Π±ΡΠ»ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ. ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π°: ΠΊΠ»Π°ΡΡ Thread, ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Runnable, ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ synchronized ΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ wait(), notify() ΠΈ notifyAll() Π² ΠΊΠ»Π°ΡΡΠ΅ Object. Π Π²Π΅ΡΡΠΈΡ Java 1.5 ΡΠΆΠ΅ Π±ΡΠ» Π²ΠΊΠ»ΡΡΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ java.util.concurrent, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΡΠ²ΠΈΠ»ΠΎΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ². Π’Π°ΠΊΠΆΠ΅ Π² Π²Π΅ΡΡΠΈΠΈ Java 1.8 Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊΠ»Π°ΡΡ CompletableFuture, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠΎΠΈΡΡ ΡΠ΅ΠΏΠΎΡΠΊΠΈ ΠΈΠ· Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ Π·Π°Π΄Π°Ρ ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ .
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠ² (ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ) Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ:
Π‘Π΅ΠΉΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΡ Ρ ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, akka (ΡΡΡΠΉΠΌΠ²ΠΎΡΠΊ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡΡ, ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° ΡΠ°Π·Π½ΡΠ΅ ΡΠ·ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ: Java, Scala, C#) Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ.
Π‘ΠΏΠΎΡΠΎΠ±Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ :
2.2 Π‘Π²ΠΎΠΉΡΡΠ²Π° ΠΏΠΎΡΠΎΠΊΠΎΠ², Π·Π°ΠΏΡΡΠΊ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²
ΠΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΠΊΠ°ΠΊΠΎΠΌ-Π»ΠΈΠ±ΠΎ ΠΏΠΎΡΠΎΠΊΠ΅. ΠΠΎΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ main, ΡΠ²Π»ΡΠ΅ΡΡΡ Π³Π»Π°Π²Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΈΠΌΠ΅Π΅Ρ ΠΈΠΌΡ main.
Π Java ΠΏΠΎΡΠΎΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ ΠΊΠ»Π°ΡΡΠΎΠΌ Thread. Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΡΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ:
1) Π‘ΠΎΠ·Π΄Π°ΡΡ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠ° ΠΎΡ ΠΊΠ»Π°ΡΡΠ° Thread ΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ run().
ΠΠΈΡΡΠΈΠ½Π³ 1:
public class MyThread extends Thread <
public void run() <
long sum = 0;
for (int i = 0; i
System.out.println(βHello!β);
>
Thread t = new Thread(r);
ΠΠ»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΠΎΡΠΎΠΊΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ Thread.start(). ΠΡΠ»ΠΈ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ run(), ΡΠΎ ΠΎΠ½ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ Π² Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠ΅:
ΠΠΈΡΡΠΈΠ½Π³ 3:
Thread t = new Thread(r);
t.run(); //ΠΊΠΎΠ΄ r Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠ΅
t.start(); //ΠΊΠΎΠ΄ r Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅
ΠΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΏΠΎΡΠΎΠΊ ΠΈΠ· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΊΠ»Π°ΡΡΠ°. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Spring, ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². Π ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΠ΅ΡΠ΅, ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ°, Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ².
ΠΠ±ΡΠ΅ΠΊΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ, Π²ΡΠ·Π²Π°Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄: Thread.currentThread().
ΠΠΌΠ΅Π½Π° ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅ΡΠΎΠ΄ setName() ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π΄Π°Π²Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΡΠ΅ ΠΈΠΌΠ΅Π½Π°, ΡΡΠΎ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅. ΠΠ΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π΄Π°Π²Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ΠΈΠΌΠ΅Π½Π°, Ρ ΠΎΡΡ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΡΠΎΠΊΠΎΠ² Π½Π΅ Π²Π°Π»ΠΈΠ΄ΠΈΡΡΡΡΡΡ JVM.
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ ΠΈΠΌΠ΅Π½ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½Ρ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΠΎ β thread-N, Π³Π΄Π΅ N ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠ»Ρ ΠΏΡΠ»Π° ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ β pool-N-thread-M, Π³Π΄Π΅ N ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΏΡΠ»Π° (ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠ», Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΡΡΠΈΠΊ N ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ), Π° M β ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠ° Π² ΠΏΡΠ»Π΅.
Π£ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π΅ΡΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ ΠΎΡ 1 Π΄ΠΎ 10. Π§Π΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΡΠΈΡΠ»ΠΎ, ΡΠ΅ΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠΎΡΠΎΠΊ main ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ 5. Π ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ Π½ΠΎΠ²ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠ°Π²Π΅Π½ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΡ ΠΏΠΎΡΠΎΠΊΠ°-ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° setPriority(int). ΠΠΎΡΠΎΠΊ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΡΠ»ΠΈ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ, ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΌ, Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ°: (Round-Robin, First Come First Serve).
ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ Π΄Π»Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΏΠΎΡΠΎΠΊΠΎΠ²:
ΠΠΈΡΡΠΈΠ½Π³ 4:
public class Main <
public static void main(String[] args) <
System.out.println(Thread.currentThread().getName());
Thread.currentThread().setPriority(8);
Thread thread = new Thread() <
public void run() <
Thread.currentThread().setName(«My name»);
System.out.println(Thread.currentThread().getName());
System.out.println(Thread.currentThread().getPriority());
>
>;
thread.start();
>
>
Π Java Π΅ΡΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ½ΡΡΠΈΠ΅, ΠΊΠ°ΠΊ ΠΏΠΎΡΠΎΠΊ-Π΄Π΅ΠΌΠΎΠ½. Π Π°Π±ΠΎΡΠ° JVM Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΠΎΠ½ΡΠΈΠ» Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π΅-Π΄Π΅ΠΌΠΎΠ½, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ-Π΄Π΅ΠΌΠΎΠ½Ρ. ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΡΠΈΠΌ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π²Π° ΠΌΠ΅ΡΠΎΠ΄Π°: setDaemon() ΠΈ isDaemon().
ΠΠ»Π°ΡΡ ThreadGroup. ΠΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² Π³ΡΡΠΏΠΏΠ°Ρ , ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠ° ThreadGroup. ΠΡΡΠΏΠΏΠ° ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°. ΠΡΠ»ΠΈ Π³ΡΡΠΏΠΏΠ° Π½Π΅ Π±ΡΠ»Π° ΡΠΊΠ°Π·Π°Π½Π°, ΡΠΎ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² ΡΡ ΠΆΠ΅ Π³ΡΡΠΏΠΏΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΡΠΎΠΊ-ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ. ΠΠ΅ΡΠΎΠ΄Ρ activeCount() ΠΈ enumerate() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ Π°ΠΊΡΠΈΠ²Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π² Π³ΡΡΠΏΠΏΠ΅.
ΠΠ΅ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ join() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ. ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ t1 Π²ΡΠ·ΡΠ²Π°Π΅Ρ Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° t2h2t2.join(), ΡΠΎ ΠΏΠΎΡΠΎΠΊ th2 ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΏΠΎΡΠΎΠΊ t2 Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ. ΠΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ join() ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈ Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΌ Π»ΠΈΠΌΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ (Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ ΠΈΠ»ΠΈ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ Ρ Π½Π°Π½ΠΎ ΡΠ΅ΠΊΡΠ½Π΄Π°ΠΌΠΈ). ΠΡΠ»ΠΈ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ t2 Π½Π΅ Π·Π°ΠΊΠΎΠ½ΡΠΈΡ ΡΠ°Π±ΠΎΡΡ Π·Π° ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΌΠ΅ΡΠΎΠ΄ join() Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π²Π΅ΡΠ½Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΎΡΡ t1.
2.3 ΠΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²
ΠΠ»Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡΠΎΠΊΠ° Π² Java Π²Π΅ΡΡΠΈΠΈ 1 ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ ΠΌΠ΅ΡΠΎΠ΄ stop(). ΠΠ΄Π½Π°ΠΊΠΎ Π² Π²Π΅ΡΡΠΈΠΈ Java 1.1 ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΄Π΅Π»Π°Π»ΠΈ deprecated, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° stop() Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΈ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΠ΅Π»ΠΎΠΌ. ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π½Π°ΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ.
ΠΠΌΠ΅ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° stop() ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ interrupt(). Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄Π° stop(), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π» ΠΏΠΎΡΠΎΠΊ, ΠΌΠ΅ΡΠΎΠ΄ interrupt() ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΏΠΎΡΠΎΠΊΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ»Π°Π³Π° interrupted Π² true Π²Π½ΡΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠ°. ΠΡΠΎΡ ΡΠ»Π°Π³ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΡΠ°ΡΡΡ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΈ ΠΈΠΌΠ΅Π΅Ρ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ false. ΠΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Π²ΡΡ :
ΠΡΡΡ ΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠ°:
ΠΠΈΡΡΠΈΠ½Π³ 5:
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π²Π° Π²ΠΈΠ΄Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ: Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅. ΠΠ΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°. Π Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ½Π΅ΡΡΠΈ Π²ΡΠ·ΠΎΠ²Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² sleep(), wait(), join() ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΊΠ»Π°ΡΡΠ° Socket. ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ» ΠΏΡΠ΅ΡΠ²Π°Π½, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π²ΡΠΏΠΎΠ»Π½ΡΠ» Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΠΎΠ½ΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΏΡΠ΅ΡΠ²Π°Π½Ρ Π½Π΅Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΡΠΎΠΊ ΡΠΆΠ΅ ΠΎΡΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊ ΠΏΡΠ΅ΡΠ²Π°Π½Π½ΡΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ Π»ΡΠ±Π°Ρ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡΠ΅ΡΠ²Π΅ΡΡΡ ΠΈ Π²ΡΠ±ΡΠΎΡΠΈΡ InterruptedException.
ΠΠ»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ Π² ΠΏΠΎΡΠΎΠΊΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΡΠ»Π΅Π΄ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠ»Π°Π³Π° interrupted ΠΏΡΠΈΠΌΠ΅Ρ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.
ΠΠΈΡΡΠΈΠ½Π³ 6:
public void run() <
while (Thread.currentThread().isInterrupted()) <
someHeavyComputations();
>
>
ΠΠΎΠ³Π΄Π° Π² ΡΠΈΠ³Π½Π°ΡΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° Π΅ΡΡΡ InterruptedException, ΡΡΠΎ Π΅ΡΠ΅ ΡΠ°Π· Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ, ΡΡΠΎ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ. InterruptedException ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΡΠΎΠΊΠ° Ρ ΠΎΡΡΡ Π·Π°Π²Π΅ΡΡΠΈΡΡ. ΠΡΠΈ ΡΡΠΎΠΌ Π½Π΅ ΠΏΡΠΎΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.
ΠΠ΅ΡΠ²ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ InterruptedException β ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π² Π²ΡΡΠ΅ΡΡΠΎΡΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Π΅. Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° InterruptedException ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡΠΈΡΡΠΊΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ) ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΠ±ΡΠΎΡΠΈΡΡ InterruptedException.
ΠΠΎ Π²ΡΠΎΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° InterruptedException ΠΎΠ±ΡΡΠ²ΠΈΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅ InterruptedException ΡΠ»Π°Π³ interrupted ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π² false, ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π½Π΅ ΡΠ²ΠΈΠ΄ΡΡ, ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½ΠΎ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠ΄Π½Π°ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ»Π°Π³ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ, Π²ΡΠ·Π²Π°Π² Thread.currentThread().interrupt() ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ.
Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π°Π³Π° interrupted ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ ΡΡΡΠ»ΠΊΡ Π½Π° Π²ΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ Ρ ΠΎΡΠ΅Ρ ΡΠ·Π½Π°ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ»Π°Π³Π° Π²ΡΠΎΡΠΎΠ³ΠΎ.
Π‘ΡΠΎΠΈΡ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² threadpool. InterruptedException ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Β«ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½Β» Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ΄Ρ, Π½ΠΎ ΠΈ ΠΏΠΎΡΠΎΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠΎΡ ΠΊΠΎΠ΄.
ΠΠΈΡΡΠΈΠ½Π³ 7:
try <
Object o = queue.take();
> catch InterruptedException e) <
>
ΠΡΠΎΡ ΠΊΠΎΠ΄ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ΅Π½, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠΎΠ³Π»ΠΎΡΠ°Π΅Ρ (swallows) ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅. ΠΡΠ»ΠΈ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² tread pool, ΡΠΎ Π²ΠΎΡΠΊΠ΅Ρ (thread pool worker) tread pool`Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π½ΠΎ ΡΡΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ³Π»ΠΎΡΠ΅Π½ΠΎ, ΠΈ ΡΠ»Π°Π³ Π±ΡΠ΄Π΅Ρ ΡΠ±ΡΠΎΡΠ΅Π½.
ΠΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
ΠΠΈΡΡΠΈΠ½Π³ 8:
try <
Object o = queue.take();
> catch InterruptedException e) <
Thread.currentThread().interrupt();
>
Π Π±Π»ΠΎΠΊΠ΅ catch ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΠ΅Ρ Π²Π°Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»Π°Π³Π° Π² true.
ΠΠ΅ ΡΡΠΎΠΈΡ ΠΏΠΎΠ³Π»ΠΎΡΠ°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΠΎ ΡΠ°ΠΊ (ΠΊΠΎΠ΄ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 7), ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΡΡΠΎΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π² Π»ΠΎΠ³ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ InterruptedException. ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ, ΠΊΠΎΠ³Π΄Π° Π»ΠΎΠ³ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠΈΡΠ°Π½, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΡΠΈΠΉΡΠΈ Π² Π½Π΅ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
2.4 Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ
ΠΡΠ»ΠΈ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ: Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΡΡΡ ΠΎΠ΄Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ° Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π·Π° ΠΎΠ΄Π½Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΡΠΎ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ β ΡΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ race condition. ΠΠ»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ race condition, Π½Π°Π·ΡΠ²Π°ΡΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΡΠ΅ΠΊΡΠΈΡΠΌΠΈ. Π§ΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ Π² Java ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Ρ ΡΠΏΠΎΡΠΎΠ±Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ².
ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ β ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Β«ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°Β» ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ synchronized. ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π±ΡΠ»Π° Π²Π²Π΅Π΄Π΅Π½Π° Π² ΡΠ·ΡΠΊΠ΅ Pascal. Π Java ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Β«ΠΌΠΎΠ½ΠΈΡΠΎΡΒ», Π½Π΅Ρ, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΈΠΏΠ° Object Π΅ΡΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Β«ΠΌΠΎΠ½ΠΈΡΠΎΡΒ». Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ Π²ΡΠ΅Ρ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΎΠ±ΡΠΈΠΉ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ β Object, Π²ΡΠ΅ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Β«ΠΌΠΎΠ½ΠΈΡΠΎΡΒ».
ΠΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Β«ΠΌΠΎΠ½ΠΈΡΠΎΡΒ» Π²Π½ΡΡΡΠΈ ΡΠ΅Π±Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 4 ΠΏΠΎΠ»Ρ:
Π ΠΈΡ 1. ΠΠ½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Β«ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°Β»
Blocked set, ΠΊΠ°ΠΊ ΠΈ wait set, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π½Π΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ, Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΠ΅Π΅ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΠΎΠ². Π’. Π΅. Π² wait set ΠΈΠ»ΠΈ blocked set ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΏΠΎΡΠΎΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΠΈΡΠ°Π½ Π΄Π²Π° ΡΠ°Π·Π°.
ΠΠΎΠ»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΡ. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ wait(), notify() ΠΈ notifyAll(), ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π» ΠΎΡ ΠΊΠ»Π°ΡΡΠ° Object. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° synchronized Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π² ΠΊΠ°ΠΆΠ΄ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΡΡΡ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° synchronized:
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠ΅ΡΠ²ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ: ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² synchronized Π±Π»ΠΎΠΊ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΡΡ ΡΠ΅ΠΊΡΠΈΡ ΠΈ Π²ΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠ· Π±Π»ΠΎΠΊΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ synchronized Π²ΡΠ΅Π³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΌΠΎΠ½ΠΈΡΠΎΡ. Π‘ΠΏΠ΅ΡΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ locked ΠΈ owner. ΠΡΠ»ΠΈ ΡΡΠΈ ΠΏΠΎΠ»Ρ false ΠΈ null, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΎΠ½ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΡΡΡΡ. ΠΠΎΠ»Π΅ locked ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ true, Π° Π² ΠΏΠΎΠ»Π΅ owner Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΡΡΠ»ΠΊΠ° Π½Π° Π·Π°Ρ Π²Π°ΡΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ, ΡΡΠΈΡΠ°Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ» ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΎΡΠΊΡΡΠ²Π°ΡΡΠ΅ΠΉ ΡΠΈΠ³ΡΡΠ½ΠΎΠΉ ΡΠΊΠΎΠ±ΠΊΠ΅ synchronized Π±Π»ΠΎΠΊΠ°, ΠΈ ΠΏΠΎΡΠΎΠΊ Π·Π°Π½ΡΠ» ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ» ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π·Π°ΠΊΡΡΠ²Π°ΡΡΠ΅ΠΉΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΠΉ ΡΠΊΠΎΠ±ΠΊΠ΅ Π±Π»ΠΎΠΊΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ locked ΠΈ owner Π² ΠΌΠΎΠ½ΠΈΡΠΎΡΠ΅ ΠΎΡΠΈΡΠ°ΡΡΡΡ.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ ΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΡΠΆΠ΅ Π·Π°Π½ΡΡΡΠΉ ΠΌΠΎΠ½ΠΈΡΠΎΡ. Π‘Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ locked == true, Π·Π°ΡΠ΅ΠΌ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ owner. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ owner Π½Π΅ ΡΠ°Π²Π½Π° ΡΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΎΡΠ΅Ρ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ, ΡΠΎ Π²ΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² blocked set ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°. ΠΡΠ»ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ owner Π΄Π°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ true, ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΏΠΎΡΠΎΠΊ ΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ β Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΡΠΎΠΊ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ΅Π΅Π½ΡΠ΅ΡΠ½Π°Π±Π΅Π»ΡΠ½ΠΎΡΡΡΡ. ΠΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ β ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠ»Π°ΡΡ, Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠΊΠΈΠ΄Π°Π΅Ρ blocked set ΠΈ Π·Π°Ρ Π²Π°ΡΡΠ²Π°Π΅Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡ. Π blocked set ΠΌΠΎΠΆΠ΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π°Π»Π΅Π΅ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ.
ΠΠΈΡΡΠΈΠ½Π³ 9:
public class SomeClass <
private final Object PRIVATE_LOCK_OBJECT = new Object();
public synchronized void firstMethod() <
//some code
>
public void theSameAsFirstMethod() <
synchronized(this) <
//some code
>
>
public void theBestMethodUsingSynchr() <
synchronised(PRIVATE_LOCK_OBJECT) <
//some code
>
>
public static void synchronizedOnStaticMethod() <
synchronized(SomeClass.class) <
//some code
>
>
public static synchronized void synchronizedOnStaticMethod() <
//some code
>
>
ΠΠΎΠ³Π΄Π° ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ synchronized, ΡΡΠΎ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ ΠΊΠΎΠ΄Ρ, ΠΊΠΎΠ³Π΄Π° Π²ΡΡ Π΅Π³ΠΎ ΡΠ΅Π»ΠΎ ΠΎΠ±Π΅ΡΠ½ΡΡΠΎ Π² synchronized Π±Π»ΠΎΠΊ ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ ΡΠ»ΡΠΆΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡ this. ΠΠΎΠ³Π΄Π° ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ synchronized, ΡΡΠΎ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ SomeClass.class. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ°ΠΌΡΠΉ Π»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± β ΠΎΠ±ΡΡΠ²ΠΈΡΡ private final ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ. Π‘ΡΠΎΠΈΡ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° synchronized β ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ. Π’. Π΅. Π²ΡΠ΅Π³Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΎΡΠΊΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΈΠ³ΡΡΠ½Π°Ρ ΡΠΊΠΎΠ±ΠΊΠ° ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ Π΅ΠΉ Π·Π°ΠΊΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΈΠ³ΡΡΠ½Π°Ρ ΡΠΊΠΎΠ±ΠΊΠ° synchronized Π±Π»ΠΎΠΊΠ°. Synchronized Π±Π»ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ Π΄ΡΡΠ³ Π² Π΄ΡΡΠ³Π° (ΡΠΌ. ΠΠΈΡΡΠΈΠ½Π³ 10).
ΠΠΈΡΡΠΈΠ½Π³ 10:
final Object LOCK = new Object();
synchronized(LOCK) <
synchronized(LOCK) <
synchronized(LOCK) <
>
>
>
ΠΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΠΈΡΡΠΈΠ½Π³Π΅ 10, ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ ΡΠΎΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅. ΠΠ΅Ρ ΡΠΏΠΎΡΠΎΠ±Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π±ΡΠ» Π·Π°Ρ Π²Π°ΡΠ΅Π½ ΠΌΠΎΠ½ΠΈΡΠΎΡ, ΠΈ Π½Π΅ ΡΡΠΎΠΈΡ ΡΡΡΠΎΠΈΡΡ ΡΠ°ΠΊΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΠ»Π΅ Π²ΡΡ ΠΎΠ΄Π° ΠΈΠ· Π²Π΅ΡΡ Π½Π΅Π³ΠΎ synchronized Π±Π»ΠΎΠΊΠ°. Π ΠΠΈΡΡΠΈΠ½Π³Π΅ 11 ΠΏΠΎΠΊΠ°Π·Π°Π½ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΉ.
ΠΠΈΡΡΠΈΠ½Π³ 11:
Object LOCK_A = new Object();
Object LOCK_B = new Object();
Object LOCK_C = new Object();
synchronized(LOCK_A) <
synchronized(LOCK B) <
synchronized(LOCK_C) <
>
>
>
Π ΠΠΈΡΡΠΈΠ½Π³Π΅ 11 ΡΠ½Π°ΡΠ°Π»Π° Π·Π°Ρ Π²Π°ΡΡΠ²Π°ΡΡΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΡ LOCK_A, Π·Π°ΡΠ΅ΠΌ LOCK_B ΠΈ LOCK_Π‘, Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΡ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅.
ΠΡΠ΅ ΠΎΠ΄Π½Π° ΡΠΈΡΡΠ°ΡΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ synchronized β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² wait(), notify() ΠΈ notifyAll(). ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ΅Π³Π΄Π° Π·Π°Ρ Π²Π°ΡΡΠ²Π°ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ. ΠΡΠ»ΠΈ Π½Π΅ Π·Π°Ρ Π²Π°ΡΡΠ²Π°ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ, Π±ΡΠ΄Π΅Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΎ IllegalMonitorStateException (ΡΠΌ. ΠΠΈΡΡΠΈΠ½Π³ 12).
ΠΠΈΡΡΠΈΠ½Π³ 12:
public class MainClass <
public static void main(String [] args) throws InterruptedException <
final Object lock = new Object();
lock.wait(); //Π±ΡΠ΄Π΅Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ IllegalMonitorStateException
>
>
ΠΠΈΡΡΠΈΠ½Π³ 13:
public class MainClass <
private static final Object LOCK = new Object();
public static void main(String [] args) throws InterruptedException <
synchronized(LOCK) <
LOCK.wait();
>
>
>
Π ΠΠΈΡΡΠΈΠ½Π³Π΅ 13 ΠΏΠΎΡΠΎΠΊ main Π·Π°Ρ Π²Π°ΡΡΠ²Π°Π΅Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° LOCK ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ wait() Π½Π° LOCK. ΠΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΏΠΎΡΠΎΠΊ main ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² wait set ΠΌΠΎΠ½ΠΈΡΠΎΡΠ° LOCK. ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΠΎΠ½ΠΈΡΠΎΡ LOCK ΠΠ‘ΠΠΠΠΠΠΠΠΠ’Π‘Π―, Ρ. Π΅. ΠΎΡΠΈΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»Π΅ owner, Π° ΠΏΠΎΠ»Π΅ locked ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ false. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π·Π°Ρ ΠΎΡΠ΅Ρ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΡΠΎΠ±ΡΡΠΈΡ Π½Π° ΡΡΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅, ΡΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ LOCK ΠΈ ΠΏΠΎΠΏΠ°ΡΡΡ Π² wait set.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² wait set, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠ»ΠΈ ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ LOCK ΠΈ Π½Π° LOCK Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ notify() ΠΈΠ»ΠΈ notifyAll(). ΠΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π° notify() ΠΈΠ· wait set Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡ Π² blocked set. ΠΡΠ»ΠΈ Π±ΡΠ» Π²ΡΠ·Π²Π°Π½ ΠΌΠ΅ΡΠΎΠ΄ notifyAll(), ΡΠΎ Π²ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΠΈΠ· wait set ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΡΡΡ Π² blocked set. ΠΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΌΠΎΠ½ΠΈΡΠΎΡ LOCK Π·Π°Π½ΡΡ ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·Π²Π°Π» ΠΌΠ΅ΡΠΎΠ΄ notify ΠΈΠ»ΠΈ notifyAll(). ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΉΠ΄Π΅Ρ ΠΈΠ· synchronized Π±Π»ΠΎΠΊΠ°, Π½ΠΎΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ Π·Π°Ρ Π²Π°ΡΡΠ²Π°ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΠ΅ΡΠΎΠ΄Ρ wait(), notify() ΠΈ notifyAll() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡ, Π° Π½Π΅ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ .
ΠΠ· ΡΠΎΡΡΠΎΡΠ½ΠΈΡ wait ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΉΡΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ:
ΠΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ, Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ wait Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΏΡΠΎΡΠ½ΡΡΡΡΡ. ΠΡΠ° ΡΠΈΡΡΠ°ΡΠΈΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ spurious wakeup. Π‘Π»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ»ΡΡΠ°ΡΡΡΡ ΠΊΡΠ°ΠΉΠ½Π΅ ΡΠ΅Π΄ΠΊΠΎ (ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΡΠΈ Π½Π΅ Π±ΡΠ²Π°Π΅Ρ) Π½ΠΎ ΡΡΠΎΠ±Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΠΊΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ wait() Π² ΡΠΈΠΊΠ»Π΅.
ΠΠΈΡΡΠΈΠ½Π³ 14:
ΠΡΡΡ Π΄Π²Π° ΡΠ»ΡΡΠ°Ρ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΏΠ°ΡΡΡ Π² blocked set:
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ΅Π³Π΄Π° Π΄Π΅Π»Π°ΡΡ Π·Π°ΠΊΡΡΡΠΎΠΉ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΊΠ»Π°ΡΡΠ΅ private final Object obj = new Object(). Π‘ΡΠΈΡΠ°Π΅ΡΡΡ ΠΏΠ»ΠΎΡ ΠΈΠΌ ΡΡΠΈΠ»Π΅ΠΌ, Π΅ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π²ΠΈΠ΄Π΅Π½ ΡΠ½Π°ΡΡΠΆΠΈ ΠΊΠ»Π°ΡΡΠ°.
ΠΠΈΡΡΠΈΠ½Π³ 15:
class X <
public synchronized void method1() <
>
>
public class TestX <
public void someMethod(X x) <
synchronized(x) <
while(true);
>
>
>
Π ΡΠ°ΠΊΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ method1() Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° x. ΠΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ method1() Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° x, Π±ΡΠ΄Π΅Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ. ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π² ΠΠΈΡΡΠΈΠ½Π³Π΅ 16.
ΠΠΈΡΡΠΈΠ½Π³ 16:
public class TestX <
public void someMethod(X x) <
synchronized(x) <
while(true) <
x.wait();
>
>
>
>
ΠΡΠ»ΠΈ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° x Π±ΡΠ΄ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ x.notify(), ΡΠΈΠΊΠ» Π² ΠΠΈΡΡΠΈΠ½Π³Π΅ 16 Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ³Π»ΠΎΡΠ°ΡΡ Π²ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΌΠ΅ΡΠΎΠ΄Π° notify(), Ρ. Π΅. ΠΏΠΎΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠ΄, Π±ΡΠ΄Π΅Ρ Π²ΡΠ΅Π³Π΄Π° Π² wait set. Π§ΡΠΎΠ± ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΠ°ΠΊΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ private final ΠΎΠ±ΡΠ΅ΠΊΡ-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΠΊΠ°ΠΊ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² Π²ΡΡΠ΅. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ±ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. ΠΡΠΎ Π½Π°ΡΡΡΠ°Π΅Ρ ΠΏΡΠΈΠ½ΡΠΈΠΏ single responsibility ΠΈ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
2.5 Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°
Π£ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ:
Π ΠΈΡ 2. Π‘Ρ Π΅ΠΌΠ° ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΎΠ² ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π² Π΄ΡΡΠ³ΠΎΠ΅
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π² ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠΈ Thread.State.
2.6 ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ volatile
ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ volatile ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΏΠ°ΠΌΡΡΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΠΌΠΈΠ½ΡΡ ΠΊΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, Ρ. Π΅. Π½Π°ΠΏΡΡΠΌΡΡ.
Π ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π½Π΅ volatile ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΠΊΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° Π΄Π»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΡΠ»ΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΄Π΅Ρ ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΡΠ΄ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΠΎΠ΄Π½Π° ΠΈ ΡΠ° ΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ΄ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π±ΡΠ΄Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ: ΠΊΠΎΠΏΠΈΠΈ Π² ΠΊΡΡΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΄ΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΈ ΠΊΠΎΠΏΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ volatile ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π½Π΅Π»ΡΠ·Ρ Π·Π½Π°ΡΡ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ°, ΠΊΠΎΠ³Π΄Π° JVM ΡΠΈΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² Π³Π»Π°Π²Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ. ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π΅ΡΡΡ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ°, ΠΈΠΌΠ΅ΡΡΠΈΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΅ΡΡΡ ΡΡΠ΅ΡΡΠΈΠΊ (Π‘ΠΌ. ΠΠΈΡΡΠΈΠ½Π³ 17).
ΠΠΈΡΡΠΈΠ½Π³ 17:
public class SharedObject <
public int counter = 0;
>
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ ΠΎΠ±Π° ΠΏΠΎΡΠΎΠΊΠ° ΠΌΠΎΠ³ΡΡ ΡΠΈΡΠ°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ counter Π½Π΅ volatile, ΡΠΎ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°ΡΠ°Π½ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΠΈΡΠ°Π½Π° Π² ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ, ΡΡΠΎΠ± Π²Π½ΠΎΠ²Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ²ΠΈΠ΄Π΅Π» Π²ΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠΎΠΊ. ΠΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ counter ΠΊΠ°ΠΊ volatile (ΡΠΌ. ΠΠΈΡΡΠΈΠ½Π³ 18).
ΠΠΈΡΡΠΈΠ½Π³ 18:
public class SharedObject <
public volatile int counter = 0;
>
Π±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΊ volatile Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π»ΡΠ±ΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π»ΡΠ±Π°Ρ Π·Π°ΠΏΠΈΡΡ Π² ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΡΠ°Π·Ρ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² Π³Π»Π°Π²Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ. ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ counter ΠΊΠ°ΠΊ volatile Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, Π° Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠΈΡΠ°Π΅Ρ Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡΠ»ΠΈ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΎΠ±ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° volatile Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ β Π±ΡΠ΄Π΅Ρ race condition. ΠΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ volatile Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
ΠΠΈΡΡΠΈΠ½Π³ 19:
public class MyClass <
private int years;
private int months
private volatile int days;
public void update(int years, int months, int days) <
this.years = years;
this.months = months;
this.days = days;
>
>
ΠΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² volatile ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ days Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΡΡΡ, ΡΡΠΎ Π·Π°ΠΏΠΈΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ years ΠΈ months ΡΠΎΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π° Π² Π³Π»Π°Π²Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ. Π§ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ (ΡΠΌ. ΠΠΈΡΡΠΈΠ½Π³ 20).
ΠΠΈΡΡΠΈΠ½Π³ 20:
public class MyClass <
private int years;
private int months
private volatile int days;
public int totalDays() <
int total = this.days;
total += months * 30;
total += years * 365;
return total;
>
public void update(int years, int months, int days) <
this.years = years;
this.months = months;
this.days = days;
>
>
Π ΠΠΈΡΡΠΈΠ½Π³Π΅ 20 Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ totalDays ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ΅Π½ΠΈΠ΅ volatile ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ days, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ . ΠΡΠΎ ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ Ρ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
JVM ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π·Π° ΡΠΎΠ±ΠΎΠΉ ΠΏΡΠ°Π²ΠΎ ΠΏΠ΅ΡΠ΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π½Π΅ ΠΌΠ΅Π½ΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠΈΠΌΠ΅Ρ Π² ΠΠΈΡΡΠΈΠ½Π³Π΅ 21.
ΠΠΈΡΡΠΈΠ½Π³ 21:
int a = 1;
int b = 2;
a++;
b++;
//changes to
int a = 1;
a++;
int b = 2;
b++;
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΈΠ· ΠΠΈΡΡΠΈΠ½Π³Π° 22.
ΠΠΈΡΡΠΈΠ½Π³ 22:
public void update(int years, int months, int days) <
this.days = days;
this.months = months;
this.years = years;
>
Π ΠΠΈΡΡΠΈΠ½Π³Π΅ 22 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π·Π°ΠΏΠΈΡΠΈ Π² volatile ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ Π² ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 20. Π Java Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠ½ΠΊΡΠ΅.
Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ, Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° volatile Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΠ΅Π»ΠΎΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΡΡ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΎΠ±ΡΠΈΠΉ ΡΡΠ΅ΡΡΠΈΠΊ. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ±ΡΡΡ ΠΏΠ°ΠΌΡΡΡ. ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° ΠΏΡΠΎΡΠΈΡΠ°Π»ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π΄ΠΎΠΏΡΡΡΠΈΠΌ, ΡΠ°Π²Π½ΠΎΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠ²Π΅Π»ΠΈΡΠΈΠ» Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° 1, ΠΈ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π·Π°ΠΏΠΈΡΠ°Π» Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 2 Π² Π³Π»Π°Π²Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΈ Π²ΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π·Π°ΠΏΠΈΡΠ°Π» Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 2 Π² ΠΎΠ±ΡΡΡ ΠΏΠ°ΠΌΡΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΠΈΡΠΈ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π² ΠΎΠ±ΡΡΡ ΠΏΠ°ΠΌΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ 3. Π’Π°ΠΊΠ°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ race condition ΠΈ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΌΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ synchronized, Π»ΠΈΠ±ΠΎ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅.
Π’Π°ΠΊΠΆΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ Π² volatile ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π΄ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Π² ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π·Π°ΠΏΠΈΡΡ Π² ΠΊΡΡ ΡΠ΄ΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΡΡΡΠ΅Π΅ ΡΠ΅ΠΌ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ.
2.7 ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before
ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ Π±ΡΠ΄ΡΡ Π²ΠΈΠ΄Π½Ρ Π² Π΄ΡΡΠ³ΠΎΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅. ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠ΅ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π²Π½ΡΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π§ΡΠΎΠ±Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ ΠΏΠΎΡΠΎΠΊ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Y, ΠΌΠΎΠΆΠ΅Ρ Π²ΠΈΠ΄Π΅ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ X (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ Π»ΠΈ X ΠΈ Y Π² ΡΠ°Π·Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ°Ρ ), ΠΌΠ΅ΠΆΠ΄Ρ X ΠΈ Y Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before. ΠΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ happens-before ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ JVM ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΊΠ°ΠΊ ΡΠ³ΠΎΠ΄Π½ΠΎ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π·Π° ΡΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° JVM.
Π ΠΈΡ 3. ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before
ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before ΡΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π½ΠΎ ΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ ΡΡΠ΅Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΏΠ°ΠΌΡΡΡ. ΠΡΠ»ΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ happens-before Π½Π΅ Π±ΡΠ΄Π΅Ρ, Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΈΡΠ°ΡΡ ΠΈ ΠΏΠΈΡΡΡ Π² ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎΠΆΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΏΠ°ΠΌΡΡΠΈ, ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½Ρ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π½ΠΎ Π½Π΅ ΡΠΌΠΎΠ³ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π°.
ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ»ΡΡΠ°ΡΡ .
Π ΠΈΡ 4. ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅.
Π ΠΈΡ 5. ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before ΠΏΡΠΈ Π·Π°Ρ Π²Π°ΡΠ΅ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°.
Π ΠΈΡ 6. ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΠΎΡΠΎΠΊΠ°.
Π ΠΈΡ 7. ΠΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° join.
2.8 ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΠΎΡΠ½ΠΎΠ²Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ: ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΡΡΠΊ ΠΏΠΎΡΠΎΠΊΠ°, ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΏΠΎΡΠΎΠΊΠ°, ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΠΎΡΡΠΎΡΠ½ΠΈΡ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΡΠΎΠΊ. ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ, ΠΊΠ°ΠΊ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ synchronized ΠΈ ΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΈΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅. Π ΠΊΠΎΠ½ΡΠ΅ ΡΠ°ΡΡΠΊΠ°Π·Π°Π»ΠΈ ΠΎ volatile ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ happens-before. Π’Π°ΠΊΠΈΠ΅ Π·Π½Π°Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΠ°ΡΡ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ, ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ.