Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

Race condition ΠΈ D ata Race

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ΅Ρ€ΠΈΡŽ статСй ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… многопоточности, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ΅, concurrency ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… интСрСсных ΡˆΡ‚ΡƒΠΊΠ°Ρ….

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

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

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

Ѐункция для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° срСдств с ΠΎΠ΄Π½ΠΎΠ³ΠΎ счСта Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ:

На ΠΎΠ΄Π½ΠΎΠΌ счСту Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ 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 java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ часто Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ½ΠΈ Π½Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ Π½Π° ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠ° race condition, хотя эта ошибка довольно распространСна.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния бэкэнда это выглядит Ρ‚Π°ΠΊ: нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ прСдусмотрСна Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ»ΠΈ синхронизация. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСсогласованности Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ….

Π’ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠΉ уязвимости. Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ бонусы ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½Ρ‹ΠΌΠΈ кошСльками. Π£ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ° Π΅ΡΡ‚ΡŒ Π΄Π²Π° кошСлька β€” A ΠΈ B, ΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ 1000 бонусов. На схСмС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ манипулируя Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ запроса Π½Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ сумму ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π° свой счСт ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ· 10 бонусов β€” 20.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ автоматичСскиС инструмСнты для поиска Ρ‚Π°ΠΊΠΈΡ… уязвимостСй. НапримСр, 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

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

Jul 9, 2020 Β· 5 min read

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

БостояниС Π³ΠΎΠ½ΠΊΠΈ

Π’Π½ΠΎΠ²ΡŒ ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ вас Π² Ρ‚Π΅ΠΌΠ΅ β€œΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡ Π² Java”! НадСюсь, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΡ€ΠΎΡ‡Π»ΠΈ мою ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ состояниС Π³ΠΎΠ½ΠΊΠΈ. Π­Ρ‚ΠΎ состояниС проявляСтся, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Π₯ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚ΠΎΠ³Π΄Π° Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ? ΠŸΡ€ΠΎΡ‰Π΅ говоря, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΏΠΎΠ»Π΅, ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ массив, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ класса Java. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ популярный шаблон проСктирования β€œSingleton” ΠΈ посмотрим, ΠΊΠ°ΠΊ Π² Π½Ρ‘ΠΌ проявляСтся Ρ‚Π°ΠΊΠΎΠ΅ состояниС Π³ΠΎΠ½ΠΊΠΈ.

Π”Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ с я Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ этот Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Π³Π΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊ 1 (T1) задСрТиваСтся Π² Π±Π»ΠΎΠΊΠ΅ if, Π² это врСмя Π² процСсс Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ T2 ΠΈ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π±Π»ΠΎΠΊ if созданиСм β€œΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ³ΠΎ экзСмпляра Singleton”, послС Ρ‡Π΅Π³ΠΎ ΠΎΠΏΡΡ‚ΡŒ запускаСтся T1 ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ созданный T2 экзСмпляр.

Как ΠΆΠ΅ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ? Π’ этом случаС ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ синхронизация, которая Π½Π΅ Π΄Π°Ρ‘Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

Π—Π½Π°Ρ‡ΠΈΡ‚ синхронизация Ρ€Π΅ΡˆΠΈΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ? Π”Π°, ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π΅Ρ‘ Π² дСйствии Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ². Π’ Π½ΠΈΡ… ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово synchronized Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

Для большСй наглядности я ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ» ΡΠ΅Ρ€ΠΈΡŽ рисунков. ΠžΠ±Ρ€Π°Π· Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой ΠΏΠΎΡ‚ΠΎΠΊ. ВзглянитС Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ этот Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ просит ΠΊΠ»ΡŽΡ‡ ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄, Π° Π·Π°Ρ‚Π΅ΠΌ, покидая этот ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ (ΠΏΠΎΡ‚ΠΎΠΊ 2) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡. Достаточно простой ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

По Ρ„Π°ΠΊΡ‚Ρƒ ΠΈΠ· сказанного слСдуСт, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡, дСлая ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ. Π’ случаС, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅, ΠΌΡ‹ помСстили ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово 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:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

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.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

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.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

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: ΠΏΠΎΡ‚ΠΎΠΊΠΈ, свойства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

Π’Π΅ΠΌΠ½ΡƒΡŽ силу Ρ‡ΡƒΠ²ΡΡ‚Π²ΡƒΡŽ я.
Π”Π°Π΅ΡˆΡŒ парсСк Π·Π° Ρ‚Ρ€ΠΈ Π³ΠΎΠ΄Π°.

Π’Π²ΠΎΠ΄Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΎ многопоточности Π² 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.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition java

Рис 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. Π’Π°ΠΊΠΈΠ΅ знания Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΡ‚Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ основой для дальнСйшСго изучСния, понимания ΠΈ написания ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

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

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