Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 120

Автор Π‘Ρ€ΡŽΡ ЭккСль

Π’Π°ΠΊΠΆΠ΅ стоит ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ сама опСрация ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π° состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… шагов ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Π²Π°Π½Π° ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Ρ…ΠΎΠ΄Π΅ выполнСния β€” Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ Π² 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.