Skip to content

arteam/100-Java-Concurrency-questions

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ΠžΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° 100+ вопросов ΠΏΠΎ Java Concurrency

ОглавлСниС

ΠžΠ±Ρ‰ΠΈΠ΅ вопросы

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈ процСссом?

ΠŸΡ€ΠΎΡ†Π΅ΡΡ являСтся Π±ΠΎΠ»Π΅Π΅ высокоуровнСвой абстракциСй ОБ для выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊ. Он, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π² сСбС нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠŸΡ€ΠΎΡ†Π΅ΡΡ всСгда ΠΈΠΌΠ΅Π΅Ρ‚ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ (Π³Π»Π°Π²Π½Ρ‹ΠΉ) ΠΏΠΎΡ‚ΠΎΠΊ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коопСративная ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΎΠ½Π° Π»ΠΈ Π² Java. Если Π΄Π°, Ρ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ прСимущСства. Если Π½Π΅Ρ‚, Ρ‚ΠΎ какая Ρ‚ΠΎΠ³Π΄Π° Π² Java?

ΠšΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ - это Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΠ³ΠΎ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ управлСния пСрСкладываСтся Π½Π° саму ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ многозадачности Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² большСй надСТности ΠΈ прСдопрСдСлСнности выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° сама ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ выполнСния Π·Π°Π΄Π°Ρ‡.

Π’ Java Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ.

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΈ Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰ΡƒΡŽ многозадачности

ΠŸΡ€ΠΈ Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π΅ΠΉ многозадачности ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ прСрывания Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ(~ 1мс), опСрационная систСма ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΡƒ. ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ этой Π·Π°Π΄Π°Ρ‡ΠΈ. Π—Π°Π΄Π°Ρ‡Π° выполняСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ бСзусловно прСрываСтся. ΠŸΡ€ΠΈ Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π΅ΠΉ многозадачности ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ увСдомляСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ многозадачности:

  • ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’ΠΎ Π΅ΡΡ‚ΡŒ программисты Ρ‚Π°ΠΊΠΎΠΉ систСмы Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Ρ€Π²Π°Π½Π° посСрСдинС выполнСния Π²Π°ΠΆΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Π­Ρ‚ΠΎ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ для систСм с ТСсткими гарантиями ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния.

  • ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² своС распоряТСниС всС систСмныС рСсурсы.

  • РСализация ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы с ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ с Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π΅ΠΉ.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π΅ΠΉ многозадачности:

  • ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, написанная с ошибками, Π½Π΅ Π·Π°Π±Π΅Ρ€Π΅Ρ‚ сСбС всС рСсурсы сСрвСра. ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Ρ€Π²Π΅Ρ‚ Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ пСрСдаст ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ процСссу.

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ эмуляции ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. БистСма Π½Π΅ "зависаСт", ΠΏΠΎΠΊΠ° ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ выполнят свою Π·Π°Π΄Π°Ρ‡Ρƒ.

Π’ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Π°, ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡŽΡ‰Π°Ρ большоС количСство процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ Π·Π°Π±Π΅Ρ€Π΅Ρ‚ сСбС всС рСсурсы ΠΈ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ систСму ΠΎΡ‚ выполнСния Π΄Ρ€ΡƒΠ³ΠΎΠΉ активности.

  • ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° систСмах с Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰Π΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ программисту Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС. Она сама заботится ΠΎΠ± этом.

БистСмы ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π²Ρ‹Ρ‚Π΅ΡΠ½ΡΡŽΡ‰ΡƒΡŽ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя, систСмы с ТСстким Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ выполнСния (мСдицинскоС, Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½ΠΎΠ΅, аэрокосмичСскоС ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅) ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π½Π° ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Β«Π·Π΅Π»Π΅Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΈΒ» ΠΈ ΠΎΠ½ΠΈ Π»ΠΈ Π² Java (Π² HotSpot JVM 7)?

"Π—Π΅Π»Π΅Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ" - это ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ управляСт Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина, Π° Π½Π΅ опСрационная систСма. Они Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ процСсса Π±Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ контСкста ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡŒΠ·Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ ядра. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ Π·Π΅Π»Π΅Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π»Π΅Π³Ρ‡Π΅, Ρ‡Π΅ΠΌ систСмныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ (Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ стСк Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌ ядра для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ). ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ тысячи Π·Π΅Π»Π΅Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Ρƒ систСмных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΅ΡΡ‚ΡŒ практичСскоС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΡ… количСство. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² случаС, Ссли Π·Π°Π΄Π°Ρ‡Π° Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° процСссорным Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, Π½ΠΎ выполняСт частый Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄. Π’ этом случаС Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ мСньшС, ΠΏΡ€ΠΈ этом программист ΠΈΠΌΠ΅Π΅Ρ‚ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния ΠΊΠΎΠ΄Π°.

НСт, Π² Java ΠΏΠΎΡ‚ΠΎΠΊΠΈ маппятся 1 Π² 1 Π½Π° систСмныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ.

Когда Π½Π°Ρ‡Π°Π»Π°ΡΡŒ Β«Multicore EraΒ»?

Π’ Π½Π°Ρ‡Π°Π»Π΅ 2000-Ρ… с появлСниСм процСссорорв сСрии POWER ΠΎΡ‚ IBM. Π—Π°Ρ‚Π΅ΠΌ Π² 2005 появились Pentium D ΠΈ AMD Athlon 64 X2. Бвязано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ частота процСссоров большС Π½Π΅ ΠΌΠΎΠ³Π»Π° расти ΠΈΠ·-Π·Π° физичСских ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΈ тСхнологичСских ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ½ΠΈΠΈ плотности транзисторов Π½Π° повСрхности кристалла. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠ°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ - The Free Lunch Is Over

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ β€” ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²? ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹*

ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² - ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΡŽ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π•Π΅ Π·Π°Π΄Π°Ρ‡Π° - Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ процСссорноС врСмя ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΡΡ Π² систСмС.

  • Заводится ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€;

  • Когда процСсс Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΎΠ½ добавляСтся Π² Π±ΡƒΡ„Π΅Ρ€;

  • Когда Π·Π°ΠΊΠ°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ - удаляСтся;

  • ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ процСсс с Π³ΠΎΠ»ΠΎΠ²Ρ‹ Π±ΡƒΡ„Π΅Ρ€Π°;

  • Π“ΠΎΠ»ΠΎΠ²Π° Π±ΡƒΡ„Π΅Ρ€Π° сдвигаСтся ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ процСссу;

  • ΠŸΡ€ΠΎΡ†Π΅ΡΡ выполняСтся свой ΠΊΠ²Π°Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ;

  • Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ процСсс прСрываСтся;

  • Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаСтся процСссу Π² Π³ΠΎΠ»ΠΎΠ²Π΅ Π±ΡƒΡ„Π΅Ρ€Π°

КакиС Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° одноядСрной машинС?

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ "практичСски ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ" Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ нСсколько Π·Π°Π΄Π°Ρ‡;

  • Π›ΡƒΡ‡ΡˆΠ°Ρ "ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ" систСм, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ΅Π½ быстрый ΠΎΡ‚Π²Π΅Ρ‚, Π° Π½Π΅ ΠΎΠ±Ρ‰Π΅Π΅ количСство Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹;

  • Π‘ΠΎΠ»Π΅Π΅ быстроС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ процСссорным Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Ρƒ нас Π΅ΡΡ‚ΡŒ n Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ I/O (Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· сСти) ΠΈ ΠΎΠ½ΠΈ Π½Π΅ связаны ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Π’ этом случаС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹. Если Π±Ρ‹ эти Π·Π°Π΄Π°Ρ‡ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎ ΠΌΡ‹ Π±Ρ‹ Ρ‚Ρ€Π°Ρ‚ΠΈΠ»ΠΈ процСссорноС врСмя Π½Π° Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ сСти.

Β«Π–Π΅Π»Π΅Π·ΠΎΒ»

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Flynn’s taxonomy, SISD/MISD/SIMD/MIMD? К ΠΊΠ°ΠΊΠΎΠΌΡƒ классу относятся CPU?

Ваксономия Π€Π»ΠΈΠ½Π½Π° - это классификация Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… инструкций ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

  • SISD - Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ систСмы с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ инструкций (типичиная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° для одноядСрных процСссоров).

  • MISD - Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ систСмы с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ инструкций (довольно рСдкая Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°).

  • SIMD - Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ систСмы с нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ инструкций (Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ процСссоры, GPU).

  • MIMD - Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ систСмы с нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ инструкций (распрСдСлСнныС систСмы).

ΠžΠ΄Π½ΠΎΡΠ΄Π΅Ρ€Π½Ρ‹Π΅ процСссоры относятся ΠΊ SISD систСмам, многоядСрныС процСссоры ΠΊ SIMD ΠΈΠ»ΠΈ MIMD. GPU являСтся SIMD систСмой, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ инструкции для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠ°-Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

РасскаТитС ΠΏΡ€ΠΎ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ кэшСй L1/L2/L3? Π§Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π»ΠΎ Π΅Π΅ появлСниС*

L1/L2/L3 - кэши Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ процСссор.

  • L1 - кэш Π½Π° ядрС процСссора с ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ доступа порядка 1 нс. Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 32 ΠšΠ‘.

  • L2 - Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΉ ΠΈ ΠΌΠ΅Π½Π΅Π΅ быстрый кэш. Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ доступа порядка 5 нс. Π Π°Π·ΠΌΠ΅Ρ€ порядка 256 ΠšΠ‘.

  • L3 - кэш Π½Π° процСссорС, ΠΎΠ±Ρ‰ΠΈΠΉ для всСх ядСр. Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ доступа порядка 20 нс. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достаточно большим (8-32 MB).

ПоявлСниС кэшСй Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΎ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСссора Π½Π°Ρ‡Π°Π»Π° становится Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС скорости доступа ΠΊ памяти. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Ρ… Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΠΏΠΎ доступу ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ· основной памяти (порядка 60 нс), производитСлями процСссоров Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ кэши Π½Π° процСссорах для быстрого выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ "горячими" Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Memory wall?

Memory wall - это Ρ‚Π΅Ρ€ΠΌΠΈΠ½, ΠΎΠΏΠΈΡΠ°Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… систСм ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ доступа ΠΊ памяти. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ частота процСссоров Π² 70-90-Π΅ Π³ΠΎΠ΄Ρ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π»Π°ΡΡŒ Π² 2 Ρ€Π°Π·Π° ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 2 Π³ΠΎΠ΄Π°, ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ доступа ΠΊ памяти Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π»ΡΡŒ с Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ систСмы Π² Ρ†Π΅Π»ΠΎΠΌ ΡƒΠΏΠΈΡ€Π°Π»Π°ΡΡŒ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ памяти, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ процСссоры Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° своСй ΠΏΠΎΠ»Π½ΠΎΠΉ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ мощности.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Memory Hierarchy?

Memory Hierarchy - Ρ‚Π΅Ρ€ΠΌΠΈΠ½ для описания ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ систСм хранСния Π΄Π°Π½Π½Ρ‹Ρ…. Π§Π΅ΠΌ Π½ΠΈΠΆΠ΅ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ, Ρ‚Π΅ΠΌ дСшСвлС Ρ†Π΅Π½Π° систСмы хранСния ΠΈ большС врСмя доступа ΠΊ Π½Π΅ΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ 4 уровня:

  • РСгистры ΠΈ кэши процСссора (ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ доступа порядка 100-500 Π“Π±/c)

  • ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ ΠΏΠ°ΠΌΡΡ‚ΡŒ (ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ доступа порядка 1-10 Π“Π±/c)

  • Диски (ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ доступа порядка 100-500 Мб/c)

  • Π’Ρ€Π΅Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° (ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ доступа порядка 10-100 Мб/c)

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Cache line? Π’ Π²ΠΈΠ΄Π΅ ΠΊΠ°ΠΊΠΈΡ… эффСктов проявляСтся?

Cache line - Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…(ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 64 Π±Π°ΠΉΡ‚), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссором ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. Когда процСссору Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ адрСсу ΠΈΠ· ΠΎΠΏΠ΅Ρ€Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, ΠΎΠ½ вмСсто 1 Π±Π°ΠΉΡ‚Π° Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ сразу Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΊΠ»Π°Π΄Π΅Ρ‚ этот Π±Π»ΠΎΠΊ Π² кэш. Вакая оптимизация Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² случаС, Ссли Π΄Π°Π½Π½Ρ‹Π΅, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ процСссор, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΡƒΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Π² кэшС ΠΈ процСссору Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΎΡ€ΠΎΠ³ΠΎΠΉ запрос Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ False sharing? ΠŸΠ»ΠΎΡ…ΠΎ это ΠΈΠ»ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ? Как с этим Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ?

False sharing - эффСкт ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π΅ связанныС с Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³ΠΎΠΌ, ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΎΠ΄Π½Ρƒ кэш-линию. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΊΠΎΠ³Π΄Π° измСняСтся ΠΎΠ΄Π½Π° ΠΈΠ· частСй Π΄Π°Π½Π½Ρ‹Ρ… Π² кэш-Π»ΠΈΠ½ΠΈΠΈ, вся линия инвалидируСтся. Π­Ρ‚ΠΎ ΠΏΠ»ΠΎΡ…ΠΎΠΉ эффСкт, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅ΡˆΠΈΠ½Π³ (thrashing) - ΠΏΠΎΡΡ‚ΠΎΡΠ½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈ ΠΈΠ½Π²Π°Π»ΠΈΠ΄Π°Ρ†ΡƒΡŽ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡ… кэша. НапримСр, часто Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΏΠ°Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½Ρƒ линию с часто записываСмыми. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи линия Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ· кэша вмСстС с часто Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, хотя сами Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ мСнялись. Π‘ΠΎΡ€ΠΎΡ‚ΡŒΡΡ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΏΠ°Π΄Π΄ΠΈΠ½Π³Π° (padding). Часто Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ Π΄Π»ΠΈΠ½Ρ‹ кэш-Π»ΠΈΠ½ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ². Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° вмСстС с Π½ΠΈΠΌΠΈ Π½Π° кэш-линию ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ "случайныС" Π΄Π°Π½Π½Ρ‹Π΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Memory padding?

Memory padding - это Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° выравнивая структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ³ΠΎ процСссором Ρ€Π°Π·ΠΌΠ΅Ρ€Π° слова. Она позволяСт Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ всСгда ΠΏΠΎΠΏΠ°Π΄ΡƒΡ‚ Π½Π° ΠΎΠ΄Π½Ρƒ кэш-линию ΠΈ Π·Π°ΠΉΠΌΡƒΡ‚ Π΅Π΅ экслюзивно. Π­Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚Ρ€Π΅ΡˆΠΈΠ½Π³Π° кэша, Π² случаС, Ссли Π½Π° линию ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π½Π΅ соотносящиСся Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Π΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Cache pollution? ΠŸΠ»ΠΎΡ…ΠΎ это ΠΈΠ»ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ? Как с этим Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ?

Cache pollution - эффСкт ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ, происходит Ρ‚Ρ€Π΅ΡˆΠΈΠ½Π³ кэшСй ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Если Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° находятся Π½Π° ΠΎΠ΄Π½ΠΎΠΉ кэш-Π»ΠΈΠ½ΠΈΠΈ, Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ‡Π΅Ρ€Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ 1-ΠΌΡƒ ΠΈ 2-ΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, кэш Π±ΡƒΠ΄Π΅Ρ‚ постоянно ΠΈΠ½Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎ ΠΏΠ»ΠΎΡ…ΠΎΠΉ эффСкт, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠΌΡƒ падСнию ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния Π±Π΅Π· Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ для программиста ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹. Π‘ΠΎΡ€ΠΎΡ‚ΡŒΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. ИдСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с "горячими" Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² кэшС ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Cache miss? ΠŸΠ»ΠΎΡ…ΠΎ это ΠΈΠ»ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ? Как с этим Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ?

Cache miss - ситуация, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Ρ‚ Π² кэшС. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС, это Π½Π΅ являСтся ΠΏΠ»ΠΎΡ…ΠΈΠΌ эффСктом, Ρ‚Π°ΠΊ Ссли Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·, Ρ‚ΠΎ ΠΎΠ½ΠΈ всС Ρ€Π°Π²Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² кэш. ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Ρ‹ часто ΡΠΏΠ΅ΠΊΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ ΠΎ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π°Ρ… доступа Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ вмСстС с Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ Π±Π»ΠΎΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ больший Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…, полагаясь Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для Π±Π»ΠΈΠ·ΠΊΠΎ Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΌΠ°Ρ…ΠΎΠ² Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠΌΠ°Ρ…ΠΎΠ² становится ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ ΠΈ кэш Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ эффСктивно ΠΏΡ€Π΅Π΄ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. Π‘ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠΌΠ°Ρ…Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ измСнСния располоТСния Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти (большая Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ), ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ‚Π΅Ρ€Π½ΠΎΠ² доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ (ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅ΡˆΠΈΠ½Π³Π°), Ρ‚ΡŽΠ½ΠΈΠ½Π³ΠΎΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° кэша.

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ SMP ΠΈ NUMA? Как это сказываСтся Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…?

SMP-систСмы ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½Ρƒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая распрСдСляСтся ΠΌΠ΅ΠΆΠ΄Ρƒ процСссорами. ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Ρ‹ ΠΎΠ±Ρ‰Π°ΡŽΡ‚ΡΡ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Ρ‡Π΅Ρ€Π΅Π· Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΡˆΠΈΠ½Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ NUMA-систСмах, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСссора Π΅ΡΡ‚ΡŒ своя локальная ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ локальная шина. Π­Ρ‚ΠΎ сильно сниТаСт Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π½Π° ΡˆΠΈΠ½Π°Ρ… Π² случаС Ссли процСссоры Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π°Π΄ нСзависимыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° NUMA-систСм (ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π»Π»ΠΎΠΊΠ°Ρ‚ΠΎΡ€ памяти, привязка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΊ процСссору), ΠΈΠ½Π°Ρ‡Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ систСмы Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΡƒΠΆΠ΅, Ρ‡Π΅ΠΌ SMP ΠΈΠ·-Π·Π° отсуствия Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, большой Ρ†Π΅Π½Ρ‹ (~100 нс) ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΈΠ· локальной памяти для процСссора.

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Multicore ΠΈ Multisocket?

  • Multicore - это ΠΎΠ΄ΠΈΠ½ процСссор с нСсколькими ядрами.

  • Multisocket - это нСсколько одноядСрных процСссоров.

Multisocket систСмы Π΄ΠΎΡ€ΠΎΠΆΠ΅, Ρ‡Π΅ΠΌ Multicore (Π½ΡƒΠΆΠ΅Π½ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ сокСт Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСссор. А ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСссор Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ являСтся Ρ‡ΠΈΠΏΠΎΠΌ). Они Π»ΡƒΡ‡ΡˆΠ΅Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, Ссли процСссоры сильно Π½Π΅ зависимы ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π° (ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…). Π’ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚Ρ€Π΅ΡˆΠΈΠ½Π³Π° L3-кэшСй, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρƒ процСссоров Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС Multicore систСмы Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΊ рСсурсам, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ всю Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ ядра/процСссора. ΠŸΡ€ΠΈ этом засчСт L3 кэша ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ с ядро Π½Π° ядро Π² multicore-процСссорах происходит быстрСС.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Thread affinity? МоТно Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² Java?

Thread affinity - это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ядру. Π­Ρ‚ΠΎ являСтся ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½Ρ‹Ρ… систСмах. Π•Π΅ Ρ†Π΅Π»ΡŒ - ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ "попадания" Π² кэш ΠΏΡ€ΠΈ доступС ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ. Бмысл ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·Ρ‹ ΠΈΠ· наблюдСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ΠΎ Π΅ΡΡ‚ΡŒ послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ прСрвСтся ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΊΠ²Π°Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π΅ΠΌΡƒ Π»ΡƒΡ‡ΡˆΠ΅ выполнится Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ ядрС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ скорСС всСго ΠΎΠ½ΠΎ ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² своСм кэшС. Из Java Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСльзя, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· JNA/JNI, Ссли извСстна цСлСвая ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Inter Thread Parallelism? Task Parallelism?

ЧСстно говоря, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ ΠΌΠ½Π΅ Π½Π΅ извСстны. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, имССтся Π²Π²ΠΈΠ΄Ρƒ hyper threading?

Π­Ρ‚ΠΎ тСхнология симуляции Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… процСссоров для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы засчСт дублирования Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСгистров. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ 2 ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° "Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅" процСссоры, ΠΈ ΠΊΠ»Π°Π΄Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² рСгистры. ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ ΠΆΠ΅ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ выполняСт инструкции ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ИдСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ†Π΅Π½Ρƒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², пСрСдавая сразу 2 ΠΏΠΎΡ‚ΠΎΠΊΠ° инструкций Π½Π° процСссор. ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€, имСя большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ инструкций, ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ большС спСкулятивных ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Branch Prediction?

Branch Prediction - это прСдсказаниС процСссором ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ выполнСния ΠΊΠΎΠ΄Π°. Π’Π°ΠΊ ΠΊΠ°ΠΊ соврСмСнныС процСссоры Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠΎΠ½Π²Π΅Π΅Ρ€ΠΎΠΌ ΠΈ пСрСходят ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ инструкции Π΄ΠΎ Π΅Π΅ выполнСния, Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ нСэффСктивно ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° опрСдСлится Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ условия. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ процСссоры спСкулятивно Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π²Π΅Ρ‚ΠΎΠΊ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, Π±Ρ‹Π»Π° Π΄ΠΎΠ³Π°Π΄ΠΊΠ° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π’ случаС, Ссли процСссор Π½Π΅ ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π²Π΅Ρ‚ΠΊΡƒ выполнСния, Ρ‚ΠΎ ΠΎΠ½ возвращаСтся Π½Π°Π·Π°Π΄ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΊΠΎΠ½Π²Π΅Π΅Ρ€ сначала.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Speculative Execution?

Speculative Execution - это оптимизация, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выполняСтся нСкоторая Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π΄ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ нСобходимости Π΅Π΅ выполнСния. ИдСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² наблюдСнии ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ условия Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Π½Π° ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‚ΠΊΡƒ, ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅Π΄ΠΊΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΊΠΎΠ΄Π° ошибки. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв опСрация Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. Если процСссор Π½Π΅ Π΄Π΅Π»Π°Π» Π±Ρ‹ спСкулятивноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΎΠ½ Π±Ρ‹ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ Π±Ρ‹Π» всСгда ΠΆΠ΄Π°Ρ‚ΡŒ выполнСния послСднСй ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ условиСм. А Ρ‚Π°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ сразу ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π²Π΅Ρ‚ΠΊΠ΅ с ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ, Π½Π΅ доТидаясь ΠΊΠΎΠ½Ρ†Π° выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ Ρ€Π΅Π΄ΠΊΠΎΠΌ случаС ошибки процСссор просто вСрнСтся ΠΊ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π²Π΅Ρ‚ΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибки.

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния программиста β€” ΠΌΠ°ΡˆΠΈΠ½Ρƒ с чСтырСхядСрным процСссором ΠΈ двумя двухядСрными процСссорами*

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, для программиста Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹. ОБ Π² ΠΎΠ±ΠΎΠΈΡ… случаях Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ 4 доступных процСссора. ЕдинствСнный случай - это Ссли имССтся 2 большиС нСзависимыС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… физичСских процСссорах, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚Ρ€Π΅ΡˆΠΈΠ½Π³Π° L1-L2 кэша.

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая дСмонстрируСт False sharing*

Π‘ΠΌ. false-sharing

Π‘Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ измСряСт ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² памяти. По ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π² отстуствиС ΠΏΠ°Π΄Π΄ΠΈΠ½Π³Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ эффСкт false sharing. Π’ΠΎ Π΅ΡΡ‚ΡŒ записи Π² ΠΏΠΎΠ»Π΅ y Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ кэш-линию ΠΈΠ½Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΉ ΠΈ вслСдствии Ρ‡Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅ x Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ ΠΈΠ· памяти, Π° Π½Π΅ ΠΈΠ· кэша.

Из Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ° Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² случаС располоТСния ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΉ кэш-Π»ΠΈΠ½ΠΈΠΈ пропускная ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠΉ Π² 3 Ρ€Π°Π·Π° Ρ…ΡƒΠΆΠ΅, Ρ‡Π΅ΠΌ Π² случаС, ΠΊΠΎΠ³Π΄Π° JVM Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅ x ΠΏΠΎ Π»ΠΈΠ½ΠΈΠΈ кэша.

c.g.a.b.FalseSharingBenchmark.contended:read      thrpt   10   60.870 Β±  5.394  ops/us
c.g.a.b.FalseSharingBenchmark.falseSharing:read   thrpt   10   19.164 Β±  5.159  ops/us

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая дСмонстрируСт Ρ€Π°Π·ΠΌΠ΅Ρ€ кэша L1

Π‘ΠΌ. l1-cache-size

К соТалСнию, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ кэша ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Ρ‘ΠΌ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒβ€¦β€‹

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая дСмонстрируСт Ρ€Π°Π·ΠΌΠ΅Ρ€ кэша L2

Π‘ΠΌ. l2-cache-size

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Ρ‘ΠΌ Π½Π°ΠΉΡ‚ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ.

Java Memory Model

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ частичный порядок?

Частичный порядок - это матСматичСскоС концСпция, которая описываСт ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ свойствами рСфлСксивности, антисиммСтричности ΠΈ транзитивности.

  • Π Π΅Ρ„Π»Π΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ ΠΊ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ, являСтся истинным.

  • ΠΠ½Ρ‚ΠΈΡΠΈΠΌΠΌΠ΅Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ симмСтрично. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ ΠΊ Π½Π΅ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ, помСнняными мСстами, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΎΠΆΠ½Ρ‹ΠΌ.

  • Π’Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ истинно для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² A ΠΈ B ΠΈ для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² A ΠΈ C, Ρ‚ΠΎ ΠΎΠ½ΠΎ истинно для Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² A ΠΈ C.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ частичного порядка являСтся ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ "Π±Ρ‹Ρ‚ΡŒ Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ".

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ happens-before?

ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ happens-before (происходит-Π΄ΠΎ) являСтся ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ΠΌ частичного порядка ΠΌΠ΅ΠΆΠ΄Ρƒ двумя опСрациями. Если ΠΎΠ΄Π½Π° опСрация происходит-Π΄ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Ρ‚ΠΎ Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²ΠΈΠ΄ΠΈΠΌ ΠΈ упорядочСн для Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ happens-before β€” это частичный порядок?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ удовлСтворяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ частичного порядка.

  • Π Π΅Ρ„Π»Π΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ‚ΡŒ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ самой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π²ΠΈΠ΄ΠΈΠΌ ΠΈ упорядочСн для Π½Π΅Π΅ самой.

  • ΠΠ½Ρ‚ΠΈΡΠΈΠΌΠΌΠ΅Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ. Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ A Π²ΠΈΠ΄ΠΈΠΌ ΠΈ упорядочСн для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ B, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ B Π±Ρ‹ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ ΠΈ Π½Π΅ упорядочСн для A.

Если Π±Ρ‹ B Π±Ρ‹Π»Π° Π±Ρ‹ Π²ΠΈΠ΄Π½Π° для A, это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ для Π΅Π΅ (A) локального Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ B ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° Π΄ΠΎ A. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ A Π²ΠΈΠ΄Π΅Π½ для B, Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ для Π΅Π΅ (B) локального Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ A ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° Π΄ΠΎ B. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ "ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» Π΄ΠΎ/Π±Ρ‹Π» Ρ€Π°Π½ΡŒΡˆΠ΅" Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½ΠΎ, ΠΈΠ· этого слСдуСт Ρ‡Ρ‚ΠΎ B ΠΏΡ€ΠΎΠΈΠ·ΡˆΠ»Π° Π΄ΠΎ B. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, B Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄Π½Π° для A.

  • Π’Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ. Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ A Π²ΠΈΠ΄ΠΈΠΌ ΠΈ упорядочСн для B ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ B Π²ΠΈΠ΄ΠΈΠΌ ΠΈ упорядочСн для C, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ A Π²ΠΈΠ΄ΠΈΠΌ ΠΈ упорядочСн для Π‘.

Π’Π°ΠΊ ΠΊΠ°ΠΊ A Π²ΠΈΠ΄Π½Π° для B, Ρ‚ΠΎ ΠΎΠ½Π° ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° Π΄ΠΎ B Π² Π΅Π΅ локальном Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’Π°ΠΊ ΠΊΠ°ΠΊ B Π²ΠΈΠ΄ΠΈΠΌΠ° для C, Ρ‚ΠΎ ΠΎΠ½Π° ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° Π΄ΠΎ C Π² Π΅Π΅ локальном Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ "ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» Π΄ΠΎ/Π±Ρ‹Π» Ρ€Π°Π½ΡŒΡˆΠ΅" Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½ΠΎ, Ρ‚ΠΎ ΠΈ опСрация A Π²ΠΈΠ΄ΠΈΠΌΠ° для C.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ data-race?

Data-race β€” это ситуация, ΠΊΠΎΠ³Π΄Π° нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ/ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Ρ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΠ΄Π½ΠΎΠΉ ячСйкой памяти, ΠΈ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Π² Π½Π΅Π΅ ΠΏΠΈΡˆΠ΅Ρ‚. Π’ этом случаС происходит "Π³ΠΎΠ½ΠΊΠ°". Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ чтСния Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²Ρ‹ΠΈΠ³Ρ€Π°Π΅Ρ‚ "Π³ΠΎΠ½ΠΊΡƒ" Π½Π° физичСском ΡƒΡ€ΠΎΠ²Π½Π΅.

КакиС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с volatile?

Π—Π°ΠΏΠΈΡΡŒ Π² volatile ΠΏΠΎΠ»Π΅ happens-before чтСния ΠΈΠ· volatile поля. БоотвСтствСнно, ΠΏΠΎΡ‚ΠΎΠΊ Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ· volatile поля Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ записи Π² это поля (Π° Ρ‚Π°ΠΊΠΆΠ΅ всСх ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… записСй Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅,измСнившСм это ΠΏΠΎΠ»Π΅). ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρƒ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρƒ ΠΏΠ΅Ρ€Π΅ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°Ρ‚ΡŒ инструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с volatile полями с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ инструкциями. Π’ΠΎ Π΅ΡΡ‚ΡŒ JMM Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ записи Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ A, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΈ Π΄ΠΎ записи Π² volatile-ΠΏΠΎΠ»Π΅, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΈ ΠΈ Π²ΠΈΠ΄ΠΈΠΌΡ‹ для ΠΏΠΎΡ‚ΠΎΠΊΠ° B, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ это ΠΏΠΎΠ»Π΅.

КакиС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с final?

Π—Π°ΠΏΠΈΡΡŒ Π² final ΠΏΠΎΠ»Π΅ (ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ², массив ΠΈΠ»ΠΈ ΠΈΠΌΠΌΡƒΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚) Π² конструкторС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сразу Π²ΠΈΠ΄ΠΈΠΌΠ° послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ конструктора. Π­Ρ‚ΠΎ позволяСт Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠΌΡƒΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ публикуСтся ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Π΄Π°ΠΆΠ΅ Π² присутствии Π³ΠΎΠ½ΠΊΠΈ, Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ синхронизации.

ВычислСниС hashCode Ρƒ java.lang.String ΠΈΠΌΠ΅Π΅Ρ‚ data race β€” Вас это Π½Π΅ ΠΏΡƒΠ³Π°Π΅Ρ‚?

НСт, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ hash Π² классС String ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int. JMM Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ запись Π² 32-Π±ΠΈΡ‚Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π² Π½Π΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ 0, Π»ΠΈΠ±ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ вычислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…ΡΡˆ-ΠΊΠΎΠ΄Π°. Π£ нас Π½Π΅Ρ‚ нСобходимости сразу ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ вычислСнный Ρ…ΡΡˆ-ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ являСтся всСго лишь ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ вычислСния. Если ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ Π² Π½Π΅ΠΌ 0, Ρ‚ΠΎ просто Π΅Ρ‰Π΅ Ρ€Π°Π· сдСлаСт вычислСниС. Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ видится Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π½Ρ‹ΠΌ компромиссом.

ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ смысл выраТСния Β«data race free ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° являСтся sequential consistentΒ».*

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° являСтся sequential consistent, Ссли Π΅Π΅ дСйствия Π½Π° всСх процСссорах Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ порядкС, ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ процСссорС Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ порядкС. Data race free ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‡Ρ‚Π΅Π½ΠΈΠΉ-записСй Π² ΠΎΠ΄Π½Ρƒ ячСйку памяти. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρƒ нас Π½Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ чтСниями ΠΈ записями, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΆΠ΅ процСсса ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ пСрСстановлСны ΠΊΠ°ΠΊ ΡƒΠ³ΠΎΠ΄Π½ΠΎ. ΠŸΡ€ΠΈ этом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ порядок Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡΡ, Π° пСрСстановки Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ эффСкт Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ процСссоры.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ordering, visibility, atomicity, happend-before, mutual exclusion Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ volatile?

Ordering - компилятору Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ инструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ инструкции Π΄ΠΎ volatile Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈΡΡŒ, Π° послС Π½Π΅Π³ΠΎ Π΅Ρ‰Π΅ Π½Π΅ Π½Π°Ρ‡Π°Π»ΠΈΡΡŒ.

Visibility - записи Π² volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²ΠΈΠ΄ΠΈΠΌΡ‹ для всСх ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‡Ρ‚Π΅Π½ΠΈΠΉ.

Atomicity - записи Π² volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ Π² нСзависимости ΠΎΡ‚ разрядности. Π’.Π΅ записи volatile long ΠΈ double поля всСгда Π±ΡƒΠ΄ΡƒΡ‚ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ "Π³ΠΎΠ»Ρ‹Ρ…" long ΠΈ double.

Happens-before - с практичСской Ρ‚ΠΎΡ‡Π½ΠΈ зрСния это комбинация видимости ΠΈ упорядочивания. ВсС записи Π² volatile поля ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ happens-before ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ чтСниям.

Mutual exclusion - volatile Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с volatile полями Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°. volatile Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ послСднюю запись Π² Π½Π΅Π΅, Π½ΠΎ Π½Π΅ засчСт Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ordering, visibility, atomicity, happend-before, mutual exclusion Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ synchronized?

Ordering - компилятору Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ инструкции Π² критичСской сСкции, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ synchronized с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ инструкциями. Π’ΠΎ Π΅ΡΡ‚ΡŒ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄ΠΎ Π²Ρ…ΠΎΠ΄Π° Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ ΠΈ Π½ΠΈ ΠΎΠ΄Π½Π° Π½Π΅ начинаСтся послС Π΅Π΅ окончания.

Visibility - записи Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ критичСской сСкции Π²ΠΈΠ΄ΠΈΠΌΡ‹ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‡Ρ‚Π΅Π½ΠΈΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ этой ΠΆΠ΅ критичСской сСкции.

Atomicity - synchronized ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΠ΅Ρ‚ критичСской ΡΠ΅ΠΊΡ†ΠΈΡŽ. ВсС дСйствия Π² критичСской сСкции Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ процСссом, поэтому ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ осущСствляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² критичСской сСкции.

Happens-before - Π²Ρ…ΠΎΠ΄ Π² synchronized Π±Π»ΠΎΠΊ создаСт ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ happens-before Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ ΠΈΠ· Π½Π΅Π³ΠΎ.

Mutual exclusion - synchronized создаСт ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ordering, visibility, atomicity, happend-before, mutual exclusion Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ AtomicInteger?

Π£ AtomicInteger Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Π½Π° ordering, visibility ΠΈ happens-before, ΠΊΠ°ΠΊ ΠΈ Ρƒ volatile, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ value Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ объявлСно ΠΊΠ°ΠΊ volatile.

Atomicity - Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Π² AtomicInteger Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹. ΠΡ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ достигаСтся засчСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° CAS. CAS-инструкции ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ячСйку памяти ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² случаС, Ссли состояниС ячСйки измСнилось Π²ΠΎ врСмя ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ случаС ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° выполняСтся ΠΏΠΎΠ²Ρ‚ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π΄ΠΎ Π΅Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния.

Mutual exclusion - AtomicInteger Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. НСсколько процСссов ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½.

Атомарно Π»ΠΈ ++ для volatile ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ?

НСт, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ++ прСдставляСт ΠΈΠ· сСбя 3 инструкции: Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΈ запись. volatile Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ записи (ΠΌΡ‹ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΡˆΡƒΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ поля), Π½ΠΎ Π½Π΅ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ 2 процСссам ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’ этом случаС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ "ΠΏΠΎΡ‚Π΅Ρ€ΡΠ½Π½ΡƒΡŽ запись".

Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ API, ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹/конструкции

Thread.getState() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ экзСмпляр Thread.State. КакиС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ значСния?

  • NEW - ΠΏΠΎΡ‚ΠΎΠΊ Π±Ρ‹Π» создан, Π½ΠΎ Π΅Ρ‰Π΅ Π½Π΅ стартовал;

  • RUNNABLE - ΠΏΠΎΡ‚ΠΎΠΊ выполняСтся. Π­Ρ‚ΠΎΡ‚ статус Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ выполняСт ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ всСго лишь Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ доступСн ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° исполнСниС;

  • WAITING - ΠΏΠΎΡ‚ΠΎΠΊ ΠΆΠ΄Π΅Ρ‚ Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π΅; ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π½Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² wait(), join() Π»ΠΈΠ±ΠΎ ΠΏΠ°Ρ€ΠΊΠΎΠ²ΠΊΠΎΠΉ Ρ‡Π΅Ρ€Π΅Π· LockSupport.park()

  • TIME_WAITING - ΠΏΠΎΡ‚ΠΎΠΊ ΠΆΠ΄Π΅Ρ‚ Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π΅ с Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠΌ; Π’Π΅ ΠΆΠ΅ самыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠΌ + sleep.

  • BLOCKED - ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π΅; ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π½Π΅Π³ΠΎ ΠΊΠΎΠ³Π΄Π° пытаСтся Π²ΠΎΠΉΡ‚ΠΈ Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ, Π½ΠΎ ΠΎΠ½Π° ΡƒΠΆΠ΅ занята Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

  • TERMINATED - ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

ΠžΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Thread.start() ΠΈ Thread.run()?

Thread.start() Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Thread.run() ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π² состояниС RUNNABLE ΠΈ запускаСт ΠΊΠΎΠ΄ нСзависимо ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’ случаС ΠΆΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° Thread.run() ΠΊΠΎΠ΄ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Π²Π°Π» этот ΠΌΠ΅Ρ‚ΠΎΠ΄. БСмантичСски эти 2 ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹: run ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ нСзависимо, Π° start Π·Π° поднятиС инфрастуктуры ΠΏΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ этой Π·Π°Π΄Π°Ρ‡ΠΈ.

Π§Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Thread.interrupt()?

ΠŸΠΎΡ‚ΠΎΠΊΡƒ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹Π·Π²Π°Π»ΠΈ этот ΠΌΠ΅Ρ‚ΠΎΠ΄, выставляСтся Ρ„Π»Π°Π³ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€Π΅Ρ€Π²Π°Π½. Код, ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡ Π² этом ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΌΠΎΠΆΠ΅Ρ‚ пСриодичСски ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ этот Ρ„Π»Π°Π³ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Если ΠΏΠΎΡ‚ΠΎΠΊ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° interrupt спал, ΠΆΠ΄Π°Π», Π±Ρ‹Π» Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π΅ ΠΈΠ»ΠΈ Π½Π° I/O(InterruptibleChannel), Ρ‚ΠΎ выбросится InterruptedException ΠΈ Ρ„Π»Π°Π³ прСрывания сбросится. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ InterruptedException, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ дСйствия ΠΏΠΎ бСзопасному Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ дальшС (ΠΏΡ€ΠΎΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ статус прСрывания ΠΈΠ»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ).

Π§Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Thread.stop()?

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Thread.stop ΠΏΠΎΡ‚ΠΎΠΊ отпускаСт всС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ Π΄Π΅Ρ€ΠΆΠ°Π», Π²Ρ‹ΠΊΠΈΠ΄Π°Π²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ThreadDeath ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Thread.stop()/destroy()/suspend()/resume() β€” deprecated?

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ нСбСзопасны. ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈ обязан ΠΎΡ‚ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ всС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎ врСмя Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ³ΠΎ обновлСния структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒΡΡ ΠΈ структура окаТСтся Π² ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½ΠΎΠΌ состоянии. Π­Ρ‚ΠΎ Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠΌΠΎ. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ΄Π΅ Π½ΡƒΠΆΠ½ΠΎ Π»ΠΎΠ²ΠΈΡ‚ΡŒ ThreadDeath, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈ ΠΏΡ€ΠΎΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ дальшС. Но Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅Π½, сильно услоТняСт ΠΊΠΎΠ΄ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ»ΠΎΡ…ΡƒΡŽ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒ убивания рСсурсов Π±Π΅Π· ΠΈΡ… очистки.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅ всС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΠΊΠΎΡ‡ΠΈΡ‚ΡŒ InterruptedException*

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя оТидания Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π΅

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя засыпания

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя Π·Π°Ρ…Π²Π°Ρ‚Π° ReentrantLock Ρ‡Π΅Ρ€Π΅Π· lockInterruptibly

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя оТидания Π² CountDownLatch Ρ‡Π΅Ρ€Π΅Π· await

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя оТидания Π² CyclicBarrier Ρ‡Π΅Ρ€Π΅Π· await

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя оТидания Π² Condition Ρ‡Π΅Ρ€Π΅Π· await

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π² Semaphore Ρ‡Π΅Ρ€Π΅Π· acquireUninterruptibly

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя получСния значСния Π² Future Ρ‡Π΅Ρ€Π΅Π· get

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя ΠΎΠ±ΠΌΠ΅Π½Π° значСнимя Π² Exchanger Ρ‡Π΅Ρ€Π΅Π· exchange

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с BlockingQueue

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ с I/O Ρ‡Π΅Ρ€Π΅Π· InterruptableChannel

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΏΠΎΡ‡Ρ‚ΠΈ любой Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ выбрасываСт это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π§Ρ‚ΠΎ ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² создаСт happend-before: Thread.sleep(), Thread.join(),Thread.yield(), Thread.start(), Thread.run(), Thread.isAlive(), Thread.getState()?

Happens-before ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Thread.start(), Thread.join() ΠΈ Thread.isAlive(). Thread.start() создаСт hb ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ дСйствиСм Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π° Thread.join() ΠΈ Thread.alive() ΠΌΠ΅ΠΆΠ΄Ρƒ послСдним дСйствиСм Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Thread.sleep() ΠΈ Thread.yeild()?

Π­Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ дСйствия.

  • Thread.sleep ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π² состояниС TIMED_WAITING ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π΄ΠΎ окончания Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сна.

  • Thread.yeild всСго лишь являСтся подсказкой ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΡƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠ²Π°Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΈ этом остаСтся Π² состоянии RUNNABLE. Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ JVM Π²ΠΎΠ»ΡŒΠ½Ρ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Thread.yeild() ΠΈ практичСская Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° довольно ΡΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°.

Π’ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Double Checked Locking? Как всС-Ρ‚Π°ΠΊΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ Π»Π΅Π½ΠΈΠ²Ρ‹ΠΉ синглСтон с Π΄Π΅ΡˆΠ΅Π²Ρ‹ΠΌ доступом?

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² DCL Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это нСбСзопасная ΠΈΠ΄ΠΈΠΎΠΌΠ°. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ придуманная ΠΊΠ°ΠΊ оптимизация ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ½Π° Π²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ синглтон Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ синглтоном. НапримСр, простой синглтон:

public class Singleton {

    private static Singleton instance;

    private String state;

    private Singleton(String state) {
        this.state = state;
    }

    public String getState(){
        return state;
    }

    public static Singleton getInstance() {
        if (instance === null) {
            synchronized (this) {
                if (instance === null) {
                    instance = new Singleton("I am the single one!");
                }
            }
        }
        return instance;
    }
}

Π’ этом ΠΊΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ нСсколько ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ:

  • Π’Π°ΠΊ ΠΊΠ°ΠΊ доступ ΠΊ instance Π½Π΅ синхронизирован, Ρ‚ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ этого поля. Оно публикуСтся Ρ‡Π΅Ρ€Π΅Π· Π³ΠΎΠ½ΠΊΡƒ. ΠŸΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ instance!=null ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ это ΠΏΠΎΠ»Π΅ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ сконструированным (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, state ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ null).

  • ЧтСния instance происходят Ρ‡Π΅Ρ€Π΅Π· Π³ΠΎΠ½ΠΊΡƒ. Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ условиС instance===null сработало Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² Π±Π»ΠΎΠΊΠ΅ return Π²Π΅Ρ€Π½Π΅Ρ‚ это ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΌ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ null.

МоТно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ holder-ΠΈΠ΄ΠΈΠΎΠΌΠΎΠΉ. Она Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π° счСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ класс Holder Π»Π΅Π½ΠΈΠ²ΠΎ грузится ΠΈ инициализуруСтся Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠΌ классов. Π”Π°Π»ΡŒΡˆΠ΅ доступ ΠΈΠ΄Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· synchronized, Π½ΠΎ Ρ‚Π°ΠΊ критичСская сСкция ΠΎΡ‡Π΅Π½ΡŒ короткая, JVM довольно Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

public class Singleton {

    private static class Holder {
        private static final Singleton INSTANCE = new Singleton("I am the single one!");
    }

    private String state;

    private Singleton(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Safe Publishing?

Safe Publishing - бСзопасная публикация. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΡ‚ΠΎ Π² этом заинтСрСсован.

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Safe Publishing ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ volatile?

Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ достаточно ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ volatile. Π’ этом случаС всС чтСния увидят ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ сконструированный послСдний записанный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Safe Publishing ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ synchronized?

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ бСзопасно ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ synchronized, Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС дСйствия с Π½ΠΈΠΌ Π² synchronized Π±Π»ΠΎΠΊΠ΅. ΠŸΠΎΡ‚ΠΎΠΊ, входящий Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ, всСгда ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ послСднСС ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Safe Publishing ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ AtomicBoolean?

Π£ AtomicBoolean Ρ‚ΠΎΡ‡Π½ΠΎ ΠΆΠ΅ такая сСмантика ΠΊΠ°ΠΊ ΠΈ Ρƒ volatile. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ бСзопасно ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‡Π΅Ρ€Π΅Π· AtomicBoolean, достаточно ΠΏΠ΅Ρ€Π΅Π΄ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сначала ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ AtomicBoolean ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π° послС измСнСния Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€?

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Java-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠΉΡ‚ΠΈ Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ, ΠΏΠΎΡ‚ΠΎΠΊΡƒ сначала Π½ΡƒΠΆΠ½ΠΎ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€. Если ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Ρ‚ΠΎ этот ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС BLOCKING. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· критичСской сСкции, ΠΎΠ½ отпускаСт ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ встроСнный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ оТидания ΠΈ пробуТдСния Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… условиях. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² wait-set ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ±ΡƒΠ΄ΠΈΡ‚ΡŒ Π΅Π³ΠΎ послС наступлСния условия. НаличиС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° позволяСт Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшниС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹, Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкции языка synchronized, которая ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

РасскаТитС ΠΎ взаимодСйствии synchronized/Object.wait()/.notify()/.notifyAll()

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ оТидания ΠΈ пробуТдСния. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ» ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ условиС для продолТСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ наступило (скаТСм, Π΄Π°Π½Π½Ρ‹Π΅ Π΅Ρ‰Π΅ Π½Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹). Π’ этом случаС хочСтся Π½Π΅ постоянно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ условиС (ΠΏΡ€ΠΈ этом отпуская ΠΈ захватывая ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ шанс ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ состояниС условия), Π° ΡƒΡΠ½ΡƒΡ‚ΡŒ, ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΡ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° условиС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ. Π­Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ достигаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² wait, notify ΠΈ notifyAll. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ» ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΈ вошСл Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡƒΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ synchronized, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ wait. Π’ этом случаС ΠΎΠ½ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² wait-set ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° ΠΈ отпустит ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€. ΠŸΡ€ΠΈ этом ΠΏΠΎΡ‚ΠΎΠΊ заблокируСтся ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² состояниС WAITING. Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΈ Π²ΠΎΠΉΡ‚ΠΈ Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ дСйствия ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ notify ΠΈΠ»ΠΈ notifyAll. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²Ρ‹Π·Π²Π°Π½, ΠΏΠΎΡ‚ΠΎΠΊ ΠΆΠ΄ΡƒΡ‰ΠΈΠΉ Π½Π° событиС, удаляСтся ΠΈΠ· wait-set ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС BLOCKING ΠΈ пытаСтся Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Π²Π°Π» notify освобоТдаСт ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС RUNNABLE. notify ΠΎΡ‚ notifyAll отличаСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ±ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² спискС оТидания, Π² Ρ‚ΠΎΠΆΠ΅ врСмя ΠΊΠ°ΠΊ послСдний ΠΏΡ€ΠΎΠ±ΡƒΠΆΠ΄Π°Π΅Ρ‚ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ. ΠŸΠΎΡ‡Ρ‚ΠΈ всСгда Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ всСгда Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ notifyAll, Ρ‚.ΠΊ. Π²Ρ‹Π·ΠΎΠ² этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π΄Π°Π΅Ρ‚ шанс всСм ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΈ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π² нСзависимости ΠΎΡ‚ количСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² спискС оТидания.

Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π° synchronized/Object.wait()/.notify()/.notifyAll()

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅ всС сцСнарии попадания Π² blocking-set встроСнного ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°*

  • ΠŸΠΎΡ‚ΠΎΠΊ пытаСтся Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΡƒΠΆΠ΅ Π΅Π³ΠΎ Π΄Π΅Ρ€ΠΆΠΈΡ‚

  • ΠŸΠΎΡ‚ΠΎΠΊ спит Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π΅ ΠΈ пробуТдаСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ notify() ΠΈΠ»ΠΈ notifyAll(), Π½ΠΎ ΠΏΠΎΠΊΠ° ΠΎΠ½ просыпался, Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ» ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅ всС сцСнарии Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· blocking-set встроСнного ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°

  • ΠŸΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Ρ€ΠΆΠ°Π» ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, отпустил Π΅Π³ΠΎ, выйдя ΠΈΠ· критичСской сСкции

  • Π’ ΠΊΠΎΠ΄Π΅ критичСской сСкции ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π±Ρ‹Π» Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ ΠΎΡ‚ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅ всС сцСнарии попадания Π² wait-set встроСнного ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°

  • ΠŸΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Ρ€ΠΆΠ°Π» ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, Π²Ρ‹Π·Π²Π°Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ wait Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅ всС сцСнарии Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· wait-set встроСнного ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°

  • Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Π΄Π΅Ρ€ΠΆΠ° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, Π²Ρ‹Π·Π²Π°Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ notify ΠΈΠ»ΠΈ notifyAll Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅

  • Если ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠΏΠ°Π» Π² список оТидания Π²Ρ‹Π·Ρ‹Π²ΠΎΠΌ wait c Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠΌ, Ρ‚ΠΎ ΠΏΠΎ истСчСнии Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊ проснСтся

  • ΠŸΠΎΡ‚ΠΎΠΊ, попавший Π² список оТидания, ΠΏΡ€Π΅Ρ€Π²Π°Π½ Π²Ρ‹Π·Ρ‹Π²ΠΎΠΌ Thread.interrupt

  • ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡΠ½ΡƒΡ‚ΡŒΡΡ Π±Π΅Π· Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ Π½Π° Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹. ОБ Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ это Π΄Π΅Π»Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎ называСтся spurious wakeup.

Различия ΠΌΠ΅ΠΆΠ΄Ρƒ Thread.isInterrupted() ΠΈ Thread.interrupted()?

Thread.isInterruped() являСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π° прСрывания ΠΈ Π½Π΅ измСняСт Π΅Π³ΠΎ. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Thread.interrupted() являСтся статичСским ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ устанавливаСт Ρ„Π»Π°Π³ Π² false.Π’Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ случай, ΠΊΠΎΠ³Π΄Π° слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄.

РасскаТитС ΠΎ ΠΈΠ΄ΠΈΠΎΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ проСктирования Private mutex

ИдСя Π² Ρ‚ΠΎΠΌ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит Π² сСбС Π² ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² синхронизации - Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ сСмафор ΠΈΠ»ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ критичСскиС сСкции. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ обязан Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ ΠΈ ΠΎΡ‚ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.

РасскаТитС ΠΎ ΠΈΠ΄ΠΈΠΎΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ проСктирования Spin lock/Busy waiting

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ситуации ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ условиС Π΅Ρ‰Π΅ Π½Π΅ наступило ΠΈ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΎΠ½ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания, пытаСтся ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅, провСряя условиС. ИдСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли условиС ΠΎΡ‡Π΅Π½ΡŒ быстро мСняСтся, Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π² user-mode ΠΈ ΠΆΠ΅Ρ‡ΡŒ Ρ†ΠΈΠΊΠ»Ρ‹ процСссора, Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² тяТСлый Ρ€Π΅ΠΆΠΈΠΌ оТидания. Если Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π΅ большая конкурСнция, Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы ΠΏΠΎ ΠΏΠΎΠ΄ΡŠΠ΅ΠΌΡƒ ΠΈ ΠΎΠΏΡƒΡΠΊΠ°Π½ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ быстрСС, тратя Π² ΠΎΠ±ΠΌΠ΅Π½ Π½Π° это процСссорныС рСсурсы.

РасскаТитС ΠΎ ΠΈΠ΄ΠΈΠΎΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ проСктирования backoff protocol (expotential backoff)

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ основываСтся Π½Π° наблюдСнии ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ раздСляСмый рСсурс ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ, Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ запросов ΡΠ²Π»ΡΡŽΡ‚ΡΡ "холостыми", Ρ‚.ΠΊ. Ρƒ рСсурса слишком большая ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ. Когда всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ рСсурс - Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ приходится ΠΎΠΏΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ запросы. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΠ½ΠΎΠ³ΠΎ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ тратится Π½Π° Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Одним ΠΈΠ· Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ являСтся backoff. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ послС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ засыпаСт Π½Π° случайный ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Если распрСдСлСниС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ сна Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅, Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ проснСтся - Π²Π΅Π»ΠΈΠΊΠ° Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ рСсурс Π±ΡƒΠ΄Π΅Ρ‚ свободСн. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ "рассасываСм" ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π° рСсурсС, назначая ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ своС врСмя ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π°. ΠŸΠΎΡ‚ΠΎΠΊΠΈ, Ρ‡ΡŒΡ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π΅Ρ‰Π΅ Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»Π°, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΆΠ΅Ρ‡ΡŒ процСссорныС Ρ†ΠΈΠΊΠ»Ρ‹ - спят. Expotential backoff - это ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΎΡ‚ΠΊΠ°Ρ‚Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ оТидания, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΎ случайно выбираСтся, увСличиваСтся Π² зависимости ΠΎΡ‚ количСства Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ. ИдСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ количСство ΠΎΡ‚ΠΊΠ°Π·ΠΎΠ² ΠΊΠ°ΠΊ эвристику для поиска ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ оТидания. Π§Π΅ΠΌ большС Π½Π΅ΡƒΠ΄Π°Ρ‡, Ρ‚Π΅ΠΌ ΡˆΠΈΡ€Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ.

Π§Ρ‚ΠΎ это Π·Π° свойство β€” Β«reentrancyΒ»?

Reentrancy (ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅) - это свойство Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ характСризуСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Ρ€ΠΆΠΈΡ‚ Π»ΠΎΠΊ, ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ Ρ€Π°Π·. Π’ΠΎ Π΅ΡΡ‚ΡŒ это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° самом сСбС. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ свойство Π² ситуации, ΠΊΠΎΠ³Π΄Π° Π»ΠΎΠΊ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ собой.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Β«poison messageΒ»?

Poison messsage - это сообщСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΈΠ·-Π·Π° ошибок (скаТСм, ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΠ²ΡˆΠ΅ΠΉΡΡ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ), Π½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡΠΈΠ΄Π΅Ρ‚ΡŒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сообщСния. Если ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π·Π°Π±ΡŒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΈΠΌΠΈ сообщСниями, Ρ‚ΠΎ ΠΎΠ½Π° пСрСстанСт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ сообщСния ΠΈ, фактичСски, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ обслуТиваниС. Для прСдотвращСния Ρ‚Π°ΠΊΠΈΡ… ситуаций Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ максимальноС количСство ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ доставки сообщСния.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Β«mutual exclusionΒ»? ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠ°ΠΊ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π² Java

Mutual exclusion - это трСбования выполнСния участка ΠΊΠΎΠ΄Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ процСссом/ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ этом случаС участок ΠΊΠΎΠ΄Π° называСтся критичСской сСкциСй. Π’ Java ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ synchronized Π±Π»ΠΎΠΊΠ°, ReentrantLock, сСмафора с Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΉ Π΄Π»ΠΈΠ½ΠΎΠΉ, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ Π² 1 элСмСнт, spinloop Π½Π° volatile Ρ„Π»Π°Π³Π΅. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΅Ρ‰Π΅ CAS (Π½ΠΎ Π² этом случаС ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π½Π΅ ΠΎΠ± участкС ΠΊΠΎΠ΄Π°, Π° ΠΎΠ± ячСйкС памяти).

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Β«condition waitingΒ»? ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠ°ΠΊ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π² Java

ЧСстно говоря, Π½Π΅ знаю Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°. ΠŸΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°ΡŽ, имССтся Π²Π²ΠΈΠ΄Ρƒ ситуация,ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ (скаТСм, ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°), ΠΎΠ½ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, подписываСтся Π½Π° Π½ΠΎΡ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, ΠΎΡ‚Π΄Π°Π΅Ρ‚ Π»ΠΎΠΊ ΠΈ ΠΆΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ° наступит условиС для продолТСния (появилось свободноС мСсто Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ). Π’ Java ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° wait/notify ΠΈΠ»ΠΈ класса Condition ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² await/signal.

java.util.concurrent: ΠŸΡƒΠ»Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Future

Различия Π² интСрфСйсах Runnable ΠΈ Callable

Π Π°Π·Π½ΠΈΡ†Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Callable Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Runnable Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄. Π’Π°ΠΊΠΆΠ΅ ΠΊΠΎΠ΄ Π² Callable ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ провСрямоС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π² Runnable этого Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ позволяСт. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π² нСпровСрямоС.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° ScheduledThreadPool ΠΏΠ΅Ρ€Π΅Π΄ java.util.Timer

  • МоТно Π·Π°Π΄Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для выполнСния Π·Π°Π΄Π°Ρ‡

  • НС ΡƒΠΌΠΈΡ€Π°Π΅Ρ‚ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ задания ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· TimeUnit.

  • РСкомСндуСтся для использования Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Java, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Timer считаСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ Java 5.

Говорят, Ρ‡Ρ‚ΠΎ Future/CompletableFuture β€” это ΠΌΠΎΠ½Π°Π΄Π°. Π§Ρ‚ΠΎ скаТСтС?

Если ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π΄ΠΎ нСвозмоТности, Ρ‚ΠΎ ΠΌΠΎΠ½Π°Π΄Π° - это структура, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² контСкстС выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ ΠΈ дальшС ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ ΠΊΠ°ΠΊ замСститСлСм Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния. Π£ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π΅ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ создания ΠΈ прСобразования Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ содСрТимым. Π­Ρ‚ΠΎ позволяСт программисту Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… мСстах сильно ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС. Он ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΌΠΎΠ½Π°Π΄ΠΎΠΉ ΠΊΠ°ΠΊ с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π½Π΅ имСя Π΅Π³ΠΎ прСдставлСния. Future Π½Π΅ являСтся классичСской ΠΌΠΎΠ½Π°Π΄ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ позволяСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ сСбя Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ обСщания выполнСния. МоТно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Future Ρ‚ΠΈΠΏΠΎΠΌ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π΅Ρ€Π΅Π· FutureTask). Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ CompletableFuture позволяСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ обСщания выполнСния Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Π’ Ρ‡Π΅ΠΌ прСимущСство ForkJoinPool Π½Π°Π΄ ThreadPoolExecutor?

ForkJoinPool Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² случаях, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π½Π° ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ work-stealing Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСм ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ "ΠΊΡ€Π°ΡΡ‚ΡŒ" Π·Π°Π΄Π°Ρ‡ΠΈ, созданныС Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. ThreadPoolExecutor этого Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚. Если Π·Π°Π΄Π°Ρ‡Π΅ Π½ΡƒΠΆΠ½ΠΎ сСбя Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ, Ρ‚ΠΎ всС Π΅Ρ‘ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ ситуации, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ, Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΡΡ‚Π°ΠΈΠ²Π°ΡŽΡ‚ Π±Π΅Π· Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Какая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ появилась Ρƒ ScheduledThreadPool Π² сравнСнии с ThreadPoolExecutor?

ScheduledThreadPoolExecutor позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρƒ ΠΈΠ»ΠΈ с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² scheduleAtFixedRate ΠΈΠ»ΠΈ scheduleWithFixedDelay ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ пСродичСскиС Π·Π°Π΄Π°Ρ‡ΠΈ. ThreadPoolExecutor запускаСт Π·Π°Π΄Π°Ρ‡ΠΈ сразу ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ доступны Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

Π’ Ρ‡Π΅ΠΌ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² sheduleAtFixedRate() ΠΎΡ‚ sheduleAtFixedDelay() класса SheduledThreadPool?

sheduleAtFixedRate Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ просто запускаСт Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρƒ. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя sheduleAtFixedDelay считаСт ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» оТидания послС окончания выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ фиксированный ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» запуска Π·Π°Π΄Π°Ρ‡, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ фиксированный ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ.

Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

java.util.concurrent: ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ

РасскаТитС ΠΎ шаблонС ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ проСктирования Producer/Consumer.

Π¨Π°Π±Π»ΠΎΠ½ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎ Π²ΠΈΠ΄Ρƒ ΠΈΡ… Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π° поставщиков ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ. ΠŸΠΎΡΡ‚Π°Π²Ρ‰ΠΈΠΊΠΈ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π½Π΅ ΠΎΠ±Ρ‰Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, вмСсто этого пСрСдавая Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±Ρ‰ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт нСзависимо Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ поставщиков ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π½Π΅ Π·Π½Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ ΠΎ Π΄Ρ€ΡƒΠ³Π΅, Π½ΠΎ Π·Π½Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ общСния. Π”Ρ€ΡƒΠ³ΠΎΠ΅ прСимущСство - Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ поставщиков ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° Ρ€Π°Π·Π½ΠΎΠΉ скорости: ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ΡŒ быстрого поставщика.

РасскаТитС ΠΎ шаблонС ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ проСктирования Master/Workers

Π¨Π°Π±Π»ΠΎΠ½ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° мастСра ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ…. ΠœΠ°ΡΡ‚Π΅Ρ€-ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅, создаСт Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΈΠ½ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ собираСт ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя, Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Ρ‡ΠΈ, Π½ΠΎ Π½Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ - подсчСт слов Π² Ρ„Π°ΠΉΠ»Π΅. ΠœΠ°ΡΡ‚Π΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊ Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» Π½Π° части, создаСт Ρ€Π°Π±ΠΎΡ‚Ρƒ для Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ количСство слов Π² участкС, Π° мастСр ΠΏΠΎΡ‚ΠΎΠΊ собираСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ подсчёта.

РасскаТитС ΠΎ шаблонС ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ проСктирования Pipes-and-Filters, SEDA

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ/ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ состояСния. Π’ мСсто этого ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π²Ρ…ΠΎΠ΄, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π΅Π³ΠΎ, ΠΈ Π²Ρ‹Π΄Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ достигаСтся многопоточная Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚ΡƒΡŽΡ‚ unix-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠ°ΠΊ grep, awk, sed, sort ΠΈ Ρ‚.Π΄.

SEDA - Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ этой ΠΈΠ΄Π΅ΠΈ Π² распрСдСлСнной срСдС. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сСрвисы ΠΎΠ±Ρ‰Π°ΡŽΡ‚ΡΡ Π½Π΅ Π½Π°ΠΏΡ€ΡŽΠΌΡƒΡŽ, Π° Ρ‡Π΅Ρ€Π΅Π· события посланныС Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π° стадиях. КаТдая стадия ΠΈΠΌΠ΅Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΠΈ засчёт слабой связности сСрвисов ΠΈ контроля пропускной способности сСрвиса Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

Π§Ρ‚ΠΎ Π² SynchronousQueue ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ для BlockingQueue

SynchronousQueue Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ, фактичСски это Π½Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π° "ΠΎΠ±ΠΌΠ΅Π½Π½ΠΈΠΊ": ΠΏΠΈΡˆΡƒΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ обязан ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π·Π°Π±Π΅Ρ€Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠ΅Ρ‚ΠΎΠ΄ size всСгда Π²Π΅Ρ€Π½Π΅Ρ‚ 0.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Β«Ρ€Π°Π½Π΄Π΅Π²ΡƒΒ»? ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ°ΠΊΠΈΡ… классов Π² Java Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ?

Β«Π Π°Π½Π΄Π΅Π²ΡƒΒ» - ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ синхронизации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π΄Π²ΡƒΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ ΠΎΠ±ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Один ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΆΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΡ… Π½Π΅ Π·Π°Π±Π΅Ρ€Π΅Ρ‚. Π’ Java ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Exchanger, SynchronousQueue, LinkedTransferQueue.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ TransferQueue НЕ BlockingQueue?

Π’ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ TransferQueue являСтся BlockingQueue, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ наслСдуСт этот интСрфСйс. Если вопрос ΠΏΡ€ΠΎ различия, Ρ‚ΠΎ TransferQueue позволяСт Π½Π΅ просто ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ элСмСнт Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠ°-поставщика ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π½Π΅ появится свободный ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ. Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ tryTransfer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π½Π΅ ΠΊΠ»Π°ΡΡ‚ΡŒ элСмСнт Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ссли Π½Π΅Ρ‚ свободного потрСбитСля.

About

An attempt to answer to the concurrency questions from a famous Habr blog post (in Russian)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages