ΠΠ½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ Java Memory Model
ΠΠΎΠ΄Π΅Π»Ρ ΠΏΠ°ΠΌΡΡΠΈ Java (Java Memory Model, JMM) ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π² ΡΡΠ΅Π΄Π΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Java. ΠΠΎΠ΄Π΅Π»Ρ ΠΏΠ°ΠΌΡΡΠΈ β ΡΠ°ΡΡΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΈ ΡΠ·ΡΠΊΠ° Java, ΠΈ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ, Π½Π° ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΈ Π½Π° ΡΡΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ, ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΠΉ ΠΠ Π½Π΅ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ Java-ΠΌΠ°ΡΠΈΠ½Ρ, Π° Π΄Π»Ρ Java Π² ΡΠ΅Π»ΠΎΠΌ.
ΠΡΡ ΠΎΠ΄Π½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΠ°ΠΌΡΡΠΈ Java (ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΉ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΎΡΠ½ΠΎΡΠΈΡΡΡ βΠΏΠΎΡΠΎΠΊΠΎΠ»ΠΎΠΊΠ°Π»ΡΠ½Π°Ρ ΠΏΠ°ΠΌΡΡΡβ), ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½Π°Ρ Π² 1995 Π³ΠΎΠ΄Ρ, ΡΡΠΈΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎΠΉ: ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ, Π½Π΅ ΠΏΠΎΡΠ΅ΡΡΠ² Π³Π°ΡΠ°Π½ΡΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΊΠΎΠ΄Π°. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ βΠΎΠ΄ΠΈΠ½ΠΎΡΠΊΡβ:
- Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π°ΠΊΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΠ΄ΠΈΠ½ΠΎΡΠΊΠ΅ (Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π°Π²Π½ΠΎ ΡΠΎΠ·Π΄Π°Π½, ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ ΡΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡΡ) Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΠΆΠΏΠΎΡΠΎΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ;
- Π»ΠΈΠ±ΠΎ ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ² ΡΠΈΡΡΠ΅ΠΌΠ° Π²ΡΠ΄Π°ΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ΄ΠΈΠ½ΠΎΡΠΊΡ;
- Π»ΠΈΠ±ΠΎ ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ² ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π²Π° ΠΎΠ΄ΠΈΠ½ΠΎΡΠΊΠΈ;
- Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ.
ΠΠΎΡΡΠΎΠΌΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ°Π±ΠΎΡΡ ΠΏΠ°ΠΌΡΡΠΈ Π±ΡΠ» ΠΏΠ΅ΡΠ΅ΡΠ°Π±ΠΎΡΠ°Π½. Π 2005 Π³ΠΎΠ΄Ρ, Ρ Π²ΡΡ ΠΎΠ΄ΠΎΠΌ Java 5 Π±ΡΠ» ΠΏΡΠ΅Π·Π΅Π½ΡΠΎΠ²Π°Π½ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» Π΅ΡΠ΅ ΡΠ»ΡΡΡΠ΅Π½ Ρ Π²ΡΡ ΠΎΠ΄ΠΎΠΌ Java 14.
Π ΠΎΡΠ½ΠΎΠ²Π΅ Π½ΠΎΠ²ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π»Π΅ΠΆΠ°Ρ ΡΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°:
ΠΡΠ°Π²ΠΈΠ»ΠΎ β 1: ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠ΅Π²Π΄ΠΎΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ. ΠΡΠΎ Π·Π½Π°ΡΠΈΡ: Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π·Π° ΡΠ°ΠΊΡ, Π·Π°ΠΎΠ΄Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΏΠΎ Π΄Π°Π½Π½ΡΠΌ ΠΎΡΡΠ°ΡΡΡΡ, ΡΠ°ΠΊ ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ.
ΠΡΠ°Π²ΠΈΠ»ΠΎ β 2: Π½Π΅Ρ Π½Π΅Π²Π΅ΡΡΡ ΠΎΡΠΊΡΠ΄Π° Π²Π·ΡΠ²ΡΠΈΡ ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. Π§ΡΠ΅Π½ΠΈΠ΅ Π»ΡΠ±ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ (ΠΊΡΠΎΠΌΠ΅ Π½Π΅-volatile long ΠΈ double, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ) Π²ΡΠ΄Π°ΡΡ Π»ΠΈΠ±ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ (Π½ΠΎΠ»Ρ), Π»ΠΈΠ±ΠΎ ΡΡΠΎ-ΡΠΎ, Π·Π°ΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ ΡΡΠ΄Π° Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.
Π ΠΏΡΠ°Π²ΠΈΠ»ΠΎ β 3: ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ, Π΅ΡΠ»ΠΈ ΡΠ²ΡΠ·Π°Π½Ρ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΡΠΎΠ³ΠΎΠ³ΠΎ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° βΠ²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠ΅ΠΆΠ΄Π΅β (happens before).
Happens before
ΠΠ΅ΡΠ»ΠΈ ΠΡΠΌΠΏΠΎΡΡ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π» ΠΏΠΎΠ½ΡΡΠΈΠ΅ Happens before. ΠΡΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠ³ΠΎΠ³ΠΎ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ°, Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ (++ ΠΈ -- Π½Π΅ Π°ΡΠΎΠΌΠ°ΡΠ½Ρ) ΠΈ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°ΡΡΠ΅Π΅ βΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ΅ΠΆΠ΄Π΅β.
ΠΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΠΎΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡΠ΄Π΅Ρ βΠ² ΠΊΡΡΡΠ΅β ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Π½ΡΡ ΠΏΠ΅ΡΠ²ΠΎΠΉ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ΄Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠ΅ΠΆΠ΄Π΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ:
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΡ:
- ΠΠ°Ρ Π²Π°Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ° (ΠΌΠ΅ΡΠΎΠ΄ lock, Π½Π°ΡΠ°Π»ΠΎ synchronized) ΠΈ Π²ΡΠ΅, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΏΠΎΡΠ»Π΅ Π½Π΅Π³ΠΎ.
- ΠΠΎΠ·Π²ΡΠ°Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ° (ΠΌΠ΅ΡΠΎΠ΄ unlock, ΠΊΠΎΠ½Π΅Ρ synchronized) ΠΈ Π²ΡΠ΅, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΏΠ΅ΡΠ΅Π΄ Π½ΠΈΠΌ.
- ΠΠΎΠ·Π²ΡΠ°Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ° ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π·Π°Ρ Π²Π°Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ.
ΠΠ°ΠΏΠΈΡΡ ΠΈ ΡΡΠ΅Π½ΠΈΠ΅:
- ΠΠ°ΠΏΠΈΡΡ Π² Π»ΡΠ±ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΡΡΠ΅Π½ΠΈΠ΅ Π΅Π΅ ΠΆΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅.
- ΠΡΠ΅, ΡΡΠΎ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΠΈΡΡΡ Π² volatile-ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΠΈ ΡΠ°ΠΌΠ° Π·Π°ΠΏΠΈΡΡ. volatile-ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΠ΅, ΡΡΠΎ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΏΠΎΡΠ»Π΅ Π½Π΅Π³ΠΎ.
- ΠΠ°ΠΏΠΈΡΡ Π² volatile-ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π΅Π΅ ΠΆΠ΅. Volatile-Π·Π°ΠΏΠΈΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ ΠΏΠ°ΠΌΡΡΡΡ ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°, Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Π·Π°Ρ Π²Π°Ρ. ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ Π·Π°ΠΏΠΈΡΠ°Π» Π² volatile-ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, Π° Π²ΡΠΎΡΠΎΠΉ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ» ΡΡΠΎ, Π²ΡΠ΅, ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π·Π°ΠΏΠΈΡΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ°Π½ΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ, ΡΡΠΎ ΠΈΠ΄Π΅Ρ ΠΏΠΎΡΠ»Π΅ ΡΡΠ΅Π½ΠΈΡ; ΡΠΌΠΎΡΡΠΈ ΡΠΈΡΡΠ½ΠΎΠΊ.
ΠΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°:
- Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ Π»ΡΠ±ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π»ΡΠ±ΡΠΌΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
- ΠΠ°ΠΏΠΈΡΡ Π² final-ΠΏΠΎΠ»Ρ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΈ Π²ΡΠ΅, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°. ΠΠ°ΠΊ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ β ΡΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ happens-before Π½Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΠΎ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΠΆΠΏΠΎΡΠΎΡΠ½ΡΡ Π³ΠΎΠ½ΠΊΡ.
- ΠΡΠ±Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΈ finalize().
ΠΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°:
- ΠΠ°ΠΏΡΡΠΊ ΠΏΠΎΡΠΎΠΊΠ° ΠΈ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ΄ Π² ΠΏΠΎΡΠΎΠΊΠ΅.
- ΠΠ°Π½ΡΠ»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΠΎΡΠ½ΠΎΡΡΡΠΈΡ ΡΡ ΠΊ ΠΏΠΎΡΠΎΠΊΡ, ΠΈ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ΄ Π² ΠΏΠΎΡΠΎΠΊΠ΅.
- ΠΠΎΠ΄ Π² ΠΏΠΎΡΠΎΠΊΠ΅ ΠΈ join(); ΠΊΠΎΠ΄ Π² ΠΏΠΎΡΠΎΠΊΠ΅ ΠΈ isAlive() == false.
- interrupt() ΠΏΠΎΡΠΎΠΊΠ° ΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΡΠ° ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ.
ΠΡΠ°Π½ΡΡ ΡΠ°Π±ΠΎΡΡ Happens before
ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ (releasing) ΠΌΠΎΠ½ΠΈΡΠΎΡΠ° happens-before ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠ΅ΠΆΠ΄Π΅, ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ (acquiring) ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°. Π‘ΡΠΎΠΈΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅, Π° Π½Π΅ Π²ΡΡ ΠΎΠ΄, ΡΠΎ Π΅ΡΡΡ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ wait ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ Π·Π½Π°Π½ΠΈΠ΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΌ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Π½Π°Ρ ΠΏΡΠΈΠΌΠ΅Ρ. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ΅ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ: Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ±ΡΠ°ΡΡ Π²Π½Π΅ΡΠ½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΈ ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ°ΠΊ Π΅ΡΡΡ. Π’Π΅ΠΏΠ΅ΡΡ Π²ΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΡΠ²ΠΈΠ΄ΠΈΡ Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π΅Π³ΠΎ ΠΎΡΠΏΡΡΡΠΈΡ. Π ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π΅Π³ΠΎ Π½Π΅ ΠΎΡΠΏΡΡΡΠΈΡ, ΠΏΠΎΠΊΠ° Π²ΡΠ΅ Π½Π΅ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ, ΠΌΡ ΡΠ²ΠΈΠ΄Π΅ΠΌ Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ°Π·Ρ, Π° Π½Π΅ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ:
public class Keeper {
private Data data = null;
public Data getData() {
synchronized(this) {
if(data == null) {
data = new Data();
}
}
return data;
}
}
ΠΠ°ΠΏΠΈΡΡ Π² volatile ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ happens-before ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ Π²Π½Π΅ΡΠ»ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΈΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ, Π½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠ³ΠΎ, ΠΊΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π» ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄, ΡΡΠ΄Π°, ΠΎΡΠΊΡΠ΄Π° ΠΎΠ½ ΠΏΡΠΈΡΠ΅Π» β ΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·. Π‘ΠΏΠ°ΡΡΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ volatile. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Π³ΠΎ, ΡΡΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΎ volatile, ΠΌΡ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ Π³ΠΎΠ²ΠΎΡΠΈΠ» ΡΠ°Π½ΡΡΠ΅, Π΄Π»Ρ volatile ΠΏΠΎΠ»Π΅ΠΉ Π·Π°ΠΏΠΈΡΡ Π²ΡΠ΅Π³Π΄Π° (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ long ΠΈ double) ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ. ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ: Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ volatile ΡΡΡΠ½ΠΎΡΡΡ, ΠΈΠΌΠ΅ΡΡΠ°Ρ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ°ΡΡΠΈΠ², List ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ Π΅ΡΠ΅ ΠΊΠ»Π°ΡΡ), ΡΠΎ Π²ΡΠ΅Π³Π΄Π° βΡΠ²Π΅ΠΆΠ΅ΠΉβ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΠ°ΠΌΡ ΡΡΡΠ½ΠΎΡΡΡ, Π½ΠΎ Π½Π΅ Π½Π° Π²ΡΠ΅, Π² Π½Π΅Π΅ Π²Ρ ΠΎΠ΄ΡΡΠ΅Π΅.
ΠΡΠ°ΠΊ, ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊ Π½Π°ΡΠΈΠΌ Double-locking Π±Π°ΡΠ°Π½Π°ΠΌ. Π‘ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ volatile ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊ:
public class Keeper {
private volatile Data data = null;
public Data getData() {
if(data == null) {
synchronized(this) {
if(data == null) {
data = new Data();
}
}
}
return data;
}
}
Π’ΡΡ Ρ Π½Π°Ρ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ data == null. ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΌΡ ΠΎΡΡΠ΅ΠΈΠ²Π°Π΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ volatile read. ΠΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ volatile store happens-before volatile read, ΠΈ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅, Π²ΠΈΠ΄Π½Ρ ΡΠΎΠΌΡ, ΠΊΡΠΎ ΡΠΈΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ.