• Stars
    star
    169
  • Rank 223,798 (Top 5 %)
  • Language
    Java
  • License
    Creative Commons ...
  • Created almost 10 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

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

ΠžΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° 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, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π½Π΅ ΠΊΠ»Π°ΡΡ‚ΡŒ элСмСнт Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ссли Π½Π΅Ρ‚ свободного потрСбитСля.