Π’Π°ΠΊΠΆΠ΅ ΡΡΠΎΠΈΡ ΡΡΠΈΡΡΠ²Π°ΡΡ, ΡΡΠΎ ΡΠ°ΠΌΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°Π³ΠΎΠ² ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅ΡΠ²Π°Π½Π° ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π² Ρ ΠΎΠ΄Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ β Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½Ρ Π² Java Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ. ΠΠ°ΠΆΠ΅ ΠΏΡΠΎΡΡΠΎΠ΅ ΠΏΡΠΈΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ Π·Π°ΡΠΈΡΡ Π·Π°Π΄Π°ΡΠΈ.
Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² Π΄ΠΎΡΡΡΠΏΠ°
ΠΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²: Π²Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π½Π°Π΅ΡΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ. ΠΠΎΠΎΠ±ΡΠ°Π·ΠΈΡΠ΅, ΡΡΠΎ Π²Ρ ΡΠΈΠ΄ΠΈΡΠ΅ Π·Π° ΡΡΠΎΠ»ΠΎΠΌ Ρ Π²ΠΈΠ»ΠΊΠΎΠΉ Π² ΡΡΠΊΠ°Ρ , ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΠ΅ΡΡ ΡΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ, ΡΠ°ΠΌΡΠΉ Π»Π°ΠΊΠΎΠΌΡΠΉ ΠΊΡΡΠΎΡΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π»Π΅ΠΆΠΈΡ Π½Π° ΡΠ°ΡΠ΅Π»ΠΊΠ΅ ΠΏΡΡΠΌΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π²Π°ΠΌΠΈ. ΠΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π²Ρ ΡΡΠ½Π΅ΡΠ΅ΡΡ ΠΊ Π΅Π΄Π΅ Π²ΠΈΠ»ΠΊΠΎΠΉ, ΠΎΠ½Π° ΠΈΡΡΠ΅Π·Π°Π΅Ρ (ΠΊΠ°ΠΊ Π²Π°Ρ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ» Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½, ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π΅ ΠΏΠΎΡΡΠ΅ΡΠ½ΡΠ»ΡΡ Β«ΡΡΡΠ½ΡΡΡΒ» Ρ Π²Π°Ρ Π΅Π΄Ρ). ΠΠΎΡ ΡΠ°ΠΊΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΡΠ°ΡΡ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ ΠΎΠ±ΡΠΈΠ΅ ΡΠ΅ΡΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ. Π§ΡΠΎΠ±Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ°Π»Π°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°ΡΡΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΡΡΡΠ·Π°Π½ΠΈΡ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π·Π° ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΡΡΡ (ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΡΠΈΡΠΈΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ).
ΠΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΡΠ°ΠΊΠΎΠ΅ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ² Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ β Π½Π°Π΄ΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΡΡΡ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠΈΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅ΡΡΡΡΡ, Π²Π΅ΡΠ°Π΅Ρ Π½Π° Π½Π΅Π³ΠΎ Β«Π·Π°ΠΌΠΎΠΊΒ», ΠΈ ΡΠΎΠ³Π΄Π° Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π½Π΅ ΡΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠΎΡ ΡΠ΅ΡΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Β«Π·Π°ΠΌΠΎΠΊΒ» Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ½ΡΡ, ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΎΠ²Π»Π°Π΄Π΅Π΅Ρ ΡΠ΅ΡΡΡΡΠΎΠΌ ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ, ΠΈ Ρ. Π΄. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π½Π΅Π΅ ΡΠΈΠ΄Π΅Π½ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π»Ρ Π΄Π΅ΡΠ΅ΠΉ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠΌ ΡΠ΅ΡΡΡΡΠΎΠΌ, ΡΠΎ ΡΠ΅Π±Π΅Π½ΠΎΠΊ, ΠΏΠ΅ΡΠ²ΡΠΌ ΠΊΡΠΈΠΊΠ½ΡΠ²ΡΠΈΠΉ Β«Π§ΡΡ, Ρ ΡΠΏΠ΅ΡΠ΅Π΄ΠΈ!Β», ΠΎΡΡΡΠΎΡΠ» ΡΠ²ΠΎΠ΅ ΠΏΡΠ°Π²ΠΎ Π½Π° Β«Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡΒ».
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎΠΏΠ΅ΡΠ½ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠ΅ ΡΡ Π΅ΠΌΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠΌ ΡΠ΅ΡΡΡΡΠ°ΠΌ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΌΡ ΡΠ΅ΡΡΡΡΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ. Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠ΄Π° Π² ΡΠ΅ΠΊΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΊ, ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡΠΎΠΉΡΠΈ ΠΏΠΎ ΡΡΠΎΠΌΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΠΊΠΎΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π°Π΅Ρ ΡΡΡΠ΅ΠΊΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΡΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ°ΡΡΠΎ Π½Π°Π·ΡΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠΌ (MUTual Exclusion).
ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΡΠ²ΠΎΡ Π²Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠ½Π°ΡΡ β Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π»ΡΠ΄Π΅ΠΉ (ΠΏΠΎΡΠΎΠΊΠΈ) ΠΌΠΎΠ³ΡΡ Π·Π°Ρ ΠΎΡΠ΅ΡΡ ΡΠΊΡΠΊΠ»ΡΠ·ΠΈΠ²Π½ΠΎ Π²Π»Π°Π΄Π΅ΡΡ Π΅ΠΉ (ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠΌ ΡΠ΅ΡΡΡΡΠΎΠΌ). Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ Π² Π²Π°Π½Π½ΡΡ, ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ ΡΡΡΡΠΈΡΡΡ Π² Π΄Π²Π΅ΡΡ, ΠΆΠ΅Π»Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π½Π΅ Π·Π°Π½ΡΡΠ° Π»ΠΈ ΠΎΠ½Π°. ΠΡΠ»ΠΈ Π²Π°Π½Π½Π°Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Π°, ΠΎΠ½ Π²Ρ ΠΎΠ΄ΠΈΡ Π² Π½Π΅Π΅ ΠΈ Π·Π°ΠΏΠΈΡΠ°Π΅Ρ Π΄Π²Π΅ΡΡ. ΠΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΆΠ΅Π»Π°ΡΡΠΈΠΉ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π²Π½ΡΡΡΠΈ, Β«Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡΒ» Π² ΡΡΠΎΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ, ΠΈ Π΅ΠΌΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΆΠ΄Π°ΡΡ Ρ Π΄Π²Π΅ΡΠΈ, ΠΏΠΎΠΊΠ° Π²Π°Π½Π½Π°Ρ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡΡ.
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΡΡΡΠ°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π΄Π²Π΅ΡΡ Π² Π²Π°Π½Π½ΡΡ ΠΊΠΎΠΌΠ½Π°ΡΡ ΡΠ½ΠΎΠ²Π° ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΡΡ, ΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ Π²ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄ΠΎΡΡΡΠΏ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ. ΠΠ°ΠΊ Π»ΡΠ΄ΠΈ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½Π΅ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΡΠ°ΠΊ ΠΈ Π·Π΄Π΅ΡΡ ΠΌΡ ΡΠΎΡΠ½ΠΎ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΠΊΡΠΎ Β«Π·Π°ΠΉΠ΄Π΅Ρ Π² Π²Π°Π½Π½ΡΡΒ» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ° ΠΏΠΎΡΠΎΠΊΠΎΠ² Π½Π΅Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈ-ΡΠΎΠ²Π°Π½ΠΎ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π³ΠΈΠΏΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π³ΡΡΠΏΠΏΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΠΎΠ»ΠΊΡΡΠΈΡ ΡΡ Ρ Π΄Π²Π΅ΡΠΈ, ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π½ΠΈΠΌΠ°Π» Β«Π²Π°Π½Π½ΡΡΒ», ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π΅Π΅ ΠΈ ΡΠΉΠ΄Π΅Ρ, ΡΠΎΡ ΠΏΠΎΡΠΎΠΊ, ΡΡΠΎ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π±Π»ΠΈΠΆΠ΅ Π²ΡΠ΅Ρ ΠΊ Π΄Π²Π΅ΡΠΈ, Β«Π²ΠΎΠΉΠ΄Π΅ΡΒ» Π² Π½Π΅Π΅. ΠΠ°ΠΊ ΡΠΆΠ΅ Π±ΡΠ»ΠΎ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΎ, ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π²Π°ΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ yield() ΠΈ setPriority(), Π½ΠΎ ΡΡΠΈ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ΄ΡΡ ΠΈΠΌΠ΅ΡΡ ΡΡΡΠ΅ΠΊΡ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π°ΡΠ΅ΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ JVM.
Π Java Π΅ΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² Π² Π²ΠΈΠ΄Π΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° synchronized. ΠΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ ΠΆΠ΅Π»Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π°, ΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌΡΠΉ ΡΠ»ΠΎΠ²ΠΎΠΌ synchronized, ΠΎΠ½ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π»ΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠ΄ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡ.
Π Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡΠΉ ΡΠ΅ΡΡΡΡ ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΎΠΌ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ, Π½ΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°ΠΉΠ», ΠΏΠΎΡΡ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° ΠΈΠ»ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ (ΡΠΊΠ°ΠΆΠ΅ΠΌ, ΠΏΡΠΈΠ½ΡΠ΅Ρ). ΠΠ»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΌΡ ΡΠ΅ΡΡΡΡΡ Π²Ρ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΠ΅ Π΅Π³ΠΎ Π²Π½ΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π»ΡΠ±ΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅ΡΡΡΡΡ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΠΊΠ°ΠΊ synchronized. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ, Π΅ΡΠ»ΠΈ Π·Π°Π΄Π°ΡΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΡ ΠΊΠ°ΠΊ synchronized ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π½Π΅ ΡΡΠΌΠ΅ΡΡ Π·Π°ΠΉΡΠΈ Π½ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΉ synchronized-ΠΌΠ΅ΡΠΎΠ΄ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π΅ Π²Π΅ΡΠ½Π΅ΡΡΡ ΠΈΠ· ΡΠ²ΠΎΠ΅Π³ΠΎ Π²ΡΠ·ΠΎΠ²Π°.
ΠΠ°ΠΊ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, Π² ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Ρ ΠΊΠ»Π°ΡΡΠ° ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡΡΡ Π·Π°ΠΊΡΡΡΡΠΌΠΈ (private), Π° Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². Π§ΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡ, ΠΎΠ±ΡΡΠ²ΠΈΡΠ΅ ΡΠ°ΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ (Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° synchronized):
synchronized void f() { /* .. */ }
synchronized void g(){ /*.. */ }
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΎΡΡΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (ΡΠ°ΠΊΠΆΠ΅ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΎΠΌ). ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ (synchronized) ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΠΈ ΠΏΠΎΠΊΠ° ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π½Π΅ Π·Π°ΠΊΠΎΠ½ΡΠΈΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ ΠΈ Π½Π΅ ΡΠ½ΠΈΠΌΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½Ρ. Π ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, Π΅ΡΠ»ΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ f(), ΠΌΠ΅ΡΠΎΠ΄ Π΄() Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ f() Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ ΠΈ Π½Π΅ ΡΠ±ΡΠΎΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΠΎΠ½ΠΈΡΠΎΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΉ ΠΏΠ°ΠΌΡΡΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
ΠΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ. ΠΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π΄ΡΡΠ³ΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅ΡΠΎΠ΄ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΈ Ρ. Π΄. ΠΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° JVM ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΡΠ΅ΠΌ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ» Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½. ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π»ΡΡ, Π΅Π³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ. ΠΠΎΠ³Π΄Π° Π·Π°Π΄Π°ΡΠ° Π·Π°Ρ Π²Π°ΡΡΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·, ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π΄ΠΎ Π΅Π΄ΠΈΠ½ΠΈΡΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°ΡΠ° ΡΠ½ΠΎΠ²Π° ΠΎΠ²Π»Π°Π΄Π΅Π²Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ. ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΡΠΎ Π²ΡΠ΅ ΡΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°Π»Π° ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. ΠΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ Π·Π°Π΄Π°ΡΠΈ ΠΈΠ· ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΡΠ΅ΡΡΠΈΠΊ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΠ°Π²Π½ΡΠΌ Π½ΡΠ»Ρ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ.
Π’Π°ΠΊΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΌΠΎΠ½ΠΈΡΠΎΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° (ΡΠ°ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Class), ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ (static) ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ (synchronized). ΠΌΠ΅ΡΠΎΠ΄Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±ΡΠΈΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΠ°.
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° EvenGenerator
ΠΠΊΠ»ΡΡΠΈΠ² Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ EvenGenerator.java ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ synchronized, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²:
//β’ concurrency/SynchronizedEvenGenerator java
// Π£ΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΡΡΡΠ΅ΠΊΡΠ°ΠΌΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
// ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° synchronized
// {RunByHand}
public class
SynchronizedEvenGenerator extends IntGenerator { private int currentEvenValue = 0; public synchronized int nextO { ++currentEvenValue, Thread yieldO, // Π£ΡΠΊΠΎΡΡΠ΅ΠΌ ΡΠ±ΠΎΠΉ ++currentEvenValue. return currentEvenValue.
}
public static void main(String[] args) {
EvenChecker test (new SynchronizedEvenGeneratorO);
}
} III ~
ΠΡΠ·ΠΎΠ² Thread.yield() ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΏΡΠΈ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ currentEvenValue Π² Π½Π΅ΡΠ΅ΡΠ½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡΡΡΠ΅ΠΊΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΡΡ ΡΠ΅ΠΊΡΠΈΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅, ΡΠ±ΠΎΠ΅Π² Π½Π΅ Π±ΡΠ΄Π΅Ρ.
ΠΠ΅ΡΠ²Π°Ρ Π·Π°Π΄Π°ΡΠ°, Π²Ρ ΠΎΠ΄ΡΡΠ°Ρ Π² next(), ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π° Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΏΡΡΠ°ΡΡΠΈΠ΅ΡΡ Π΅Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ, Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ½ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ. Π ΡΡΠΎΠΉ ΡΠΎΡΠΊΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ Π΄ΡΡΠ³ΡΡ Π·Π°Π΄Π°ΡΡ, ΠΎΠΆΠΈΠ΄Π°ΡΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°Π΄Π°ΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ ΠΏΠΎ ΠΊΠΎΠ΄Ρ, Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎΠΌΡ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠΌ.
ΠΠ±ΡΠ΅ΠΊΡΡ Lock
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Java SE5 java.utiLconcurrent ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ²Π½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠ°ΠΌΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π² java.util.concurrent.locks. ΠΠ±ΡΠ΅ΠΊΡ Lock ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈΠ»ΠΈ ΡΠ½ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ; ΠΏΡΠ°Π²Π΄Π°, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½Π΅Π΅ ΡΠ»Π΅Π³Π°Π½ΡΠ½ΡΠΌ, ΡΠ΅ΠΌ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΠΎΡΠΌΡ. Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΠΎΠ½ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ΠΉ Π³ΠΈΠ±ΠΊΠΎΡΡΡΡ ΠΏΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΈΠΏΠΎΠ² Π·Π°Π΄Π°Ρ. ΠΠΎΡ ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ SynchronizedEvenGenerator.java Ρ ΡΠ²Π½ΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Lock:
II: concurrency/MutexEvenGenerator.java
// ΠΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ².
II {RunByHand}
import java.util.concurrent.locks.*;
public class MutexEvenGenerator extends IntGenerator { private int currentEvenValue = 0, private Lock lock = new ReentrantLockO; public int nextO { lock lockO; try {
++currentEvenValue; Thread.yieldO; // Π£ΡΠΊΠΎΡΡΠ΅ΠΌ ΡΠ±ΠΎΠΉ ++currentEvenValue; return currentEvenValue; } finally { ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ^
lock.unlockO,
}
}
public static void main(String[] args) {
EvenChecker test(new MutexEvenGeneratorO).
}
} /// ~
MutexEvenGenerator Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΌΡΡΡΠ΅ΠΊΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ lock ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ lock() ΠΈ unlock() Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ Π² next(). ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Lock ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΈΠ΄ΠΈΠΎΠΌΡ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΡ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅: ΡΡΠ°Π·Ρ ΠΆΠ΅ Π·Π° Π²ΡΠ·ΠΎΠ²ΠΎΠΌ lock() Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ try-finally, ΠΏΡΠΈ ΡΡΠΎΠΌ Π² ΡΠ΅ΠΊΡΠΈΡ finally Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ² unlock() β ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ½ΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ.
Π₯ΠΎΡΡ try-finally ΡΡΠ΅Π±ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΌΠ° ΠΊΠΎΠ΄Π°, ΡΠ΅ΠΌ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ synchronized, ΡΠ²Π½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Lock ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°ΠΌΠΈ. ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ synchronized ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π½ΠΎ Π²Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΡΡΠΎΠ±Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ Lock ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π² ΡΠ΅ΠΊΡΠΈΠΈ finally.