JavaRush/Java Π±Π»ΠΎΠ³/Java Developer/Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ сСмафором
Автор
АлСксандр ΠœΡΠ΄Π΅Π»Π΅Ρ†
Π ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π² CodeGym

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ сСмафором

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ Java Developer
участников
ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Π˜Π·ΡƒΡ‡Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° JavaRush, Ρ‚Ρ‹ часто встрСчал понятия Β«ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΒ» ΠΈ Β«ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Β». БмоТСшь сСйчас, Π±Π΅Π· подглядывания ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Π΅ΠΌ ΠΎΠ½ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ? :) Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ сСмафором - 1Если смог β€” ΠΌΠΎΠ»ΠΎΠ΄Π΅Ρ†! Если ΠΆΠ΅ Π½Π΅Ρ‚ (Π° Ρ‡Π°Ρ‰Π΅ всСго Ρ‚Π°ΠΊ ΠΈ Π±Ρ‹Π²Π°Π΅Ρ‚) β€” Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΠΎΠ½ΡΡ‚ΠΈΡ Β«ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΒ» ΠΈ Β«ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Β» Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ связаны ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, читая Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΈ смотря Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ многопоточности Π½Π° Π²Π½Π΅ΡˆΠ½ΠΈΡ… рСсурсах Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅, Ρ‚Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅ΡˆΡŒΡΡ с Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ понятиСм β€” «сСмафор». Π•Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Ρ‚ΠΎΠΆΠ΅ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ схоТ с ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ разбСрСмся с этими трСмя Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°ΠΌΠΈ, рассмотрим нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΈ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ упорядочим Π² Π³ΠΎΠ»ΠΎΠ²Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Π΅ΠΌ ΠΆΠ΅ ΠΎΠ½ΠΈ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ :)

ΠœΡŒΡŽΡ‚Π΅ΠΊΡ

ΠœΡŒΡŽΡ‚Π΅ΠΊΡ β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Он Β«ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½Β» ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π² Java β€” это Ρ‚Ρ‹ ΡƒΠΆΠ΅ знаСшь :) НСваТно, ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒΡΡ Π»ΠΈ Ρ‚Ρ‹ стандартными классами ΠΈΠ»ΠΈ создал собствСнныС классы, скаТСм, Cat ΠΈ Dog: Ρƒ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² всСх классов Π΅ΡΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. НазваниС Β«ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΒ» происходит ΠΎΡ‚ английского Β«MUTual EXclusionΒ» β€” Β«Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅Β», ΠΈ это ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Как ΠΌΡ‹ ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€ΠΎΡˆΠ»Ρ‹Ρ… Π»Π΅ΠΊΡ†ΠΈΠΉ, Π·Π°Π΄Π°Ρ‡Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° β€” ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ врСмя Π±Ρ‹Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΠ΅ΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Β«ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с Ρ‚ΡƒΠ°Π»Π΅Ρ‚ΠΎΠΌΒ». Когда Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ‚ΡƒΠ°Π»Π΅Ρ‚, ΠΎΠ½ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ Π΄Π²Π΅Ρ€ΡŒ Π½Π° Π·Π°ΠΌΠΎΠΊ. Π’ΡƒΠ°Π»Π΅Ρ‚ выполняСт Ρ€ΠΎΠ»ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π—Π°ΠΌΠΎΠΊ Π½Π° Π΄Π²Π΅Ρ€ΠΈ Ρ‚ΡƒΠ°Π»Π΅Ρ‚Π° β€” Ρ€ΠΎΠ»ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°, Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈΠ· людСй снаруТи β€” Ρ€ΠΎΠ»ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π—Π°ΠΌΠΎΠΊ Π½Π° Π΄Π²Π΅Ρ€ΠΈ β€” ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Ρ‚ΡƒΠ°Π»Π΅Ρ‚Π°: ΠΎΠ½ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ. Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ сСмафором - 2Π˜Π½Ρ‹ΠΌΠΈ словами, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ врСмя ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ±Ρ‰ΠΈΠΌΠΈ рСсурсами. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (людСй) ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ занятым рСсурсам Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌΠΈ. Π£ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π΅ΡΡ‚ΡŒ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… особСнностСй. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° состояния β€” «свободСн» ΠΈ «занят». Π­Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹: ΠΌΠΎΠΆΠ½ΠΎ провСсти ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈ с Π±ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ true/false ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ систСмой счислСния 1/0. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, состояниями нСльзя ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. Π’ Java Π½Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ Π±Ρ‹ явно Π²Π·ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ статус. Π˜Π½Ρ‹ΠΌΠΈ словами, Ρ‚Ρ‹ Π½Π΅ моТСшь ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ°:
Object myObject = new Object();
Mutex mutex = myObject.getMutex();
mutex.free();
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° нСльзя. ΠŸΡ€ΡΠΌΠΎΠΉ доступ ΠΊ Π½Π΅ΠΌΡƒ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ Java-ΠΌΠ°ΡˆΠΈΠ½Ρ‹. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ срСдств языка.

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ β€” это Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ «надстройка» Π½Π°Π΄ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ. ЀактичСски ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ β€” это Β«Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΉΒ» для программиста кусок ΠΊΠΎΠ΄Π°. Говоря ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ΅ Ρ€Π°Π½Π΅Π΅, ΠΌΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...какая-Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°, доступная для всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

       synchronized (obj) {

           //Π»ΠΎΠ³ΠΈΠΊΠ°, которая ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ доступна Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°
       }
   }
}
Π’ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ словом synchronized, происходит Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° нашСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° obj. Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π·Π°Ρ…Π²Π°Ρ‚-Ρ‚ΠΎ происходит, Π½ΠΎ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ обСспСчиваСтся Β«Π·Π°Ρ‰ΠΈΡ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΒ»? ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΏΡ€ΠΈ Π²ΠΈΠ΄Π΅ слова synchronized ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π²Π½ΡƒΡ‚Ρ€ΡŒ Π±Π»ΠΎΠΊΠ°? Π—Π°Ρ‰ΠΈΡ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ создаСт ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€! ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ слово synchronized Π² нСсколько ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… кусков ΠΊΠΎΠ΄Π°. Π•Ρ‰Π΅ Ρ€Π°Π· вСрнСмся ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ doSomething() ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠΌ Π΅Π³ΠΎ:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...какая-Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°, доступная для всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

       //Π»ΠΎΠ³ΠΈΠΊΠ°, которая ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ доступна Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°
       synchronized (obj) {

           /*Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ
           Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°*/
           obj.someImportantMethod();
       }
   }
}
Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Β«ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌΒ» нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ компилятор ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ этот ΠΊΠΎΠ΄:
public class Main {

   private Object obj = new Object();

   public void doSomething() throws InterruptedException {

       //...какая-Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°, доступная для всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

       //Π»ΠΎΠ³ΠΈΠΊΠ°, которая ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ доступна Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°:

       /*Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° занят -
       любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ (ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ»), спит*/
       while (obj.getMutex().isBusy()) {
           Thread.sleep(1);
       }

       //ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠ°ΠΊ занятый
       obj.getMutex().isBusy() = true;

       /*Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ
       Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°*/
       obj.someImportantMethod();

       //ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
       obj.getMutex().isBusy() = false;
   }
}
ΠŸΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, нСнастоящий. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Java-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ происходит Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ Java-ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Однако этот псСвдокод Π΄Π°Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ происходит с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ° synchronized ΠΈ ΠΊΠ°ΠΊ компилятор ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ это слово Π² нСсколько Β«Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ…Β» для программиста ΠΊΠΎΠΌΠ°Π½Π΄. По сути, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ Π² Java Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ слова synchronized. Π’Π΅ΡΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ появился вмСсто слова synchronized Π² послСднСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, β€” это ΠΈ Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€.

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ слово, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ‚Ρ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π΅ΡˆΡŒΡΡ ΠΏΡ€ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ многопоточности β€” «сСмафор». Π”Π°Π²Π°ΠΉ разбСрСмся Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅, ΠΈ Ρ‡Π΅ΠΌ ΠΎΠ½ отличаСтся ΠΎΡ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ β€” это срСдство для синхронизации доступа ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ рСсурсу. Π•Π³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ создании ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° синхронизации ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ счСтчик. Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°ΠΌ, сколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу. Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ сСмафором - 3Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ Π² Java прСдставлСны классом Semaphore. ΠŸΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²-сСмафоров ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ конструкторы:
Semaphore(int permits)
Semaphore(int permits, boolean fair)
Π’ конструктор ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ:
  • int permits β€” Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎ, сколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу;

  • boolean fair β€” для установлСния порядка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ. Если fair = true, доступ прСдоставляСтся ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π΅Π³ΠΎ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π»ΠΈ. Если ΠΆΠ΅ ΠΎΠ½ Ρ€Π°Π²Π΅Π½ false, порядок Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования сСмафоров β€” Π·Π°Π΄Π°Ρ‡Π° ΠΎΠ± ΠΎΠ±Π΅Π΄Π°ΡŽΡ‰ΠΈΡ… философах.
Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ сСмафором - 4
ΠœΡ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ упростим Π΅Π΅ условия, для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ 5 философов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΎΠ±Π΅Π΄Π°Ρ‚ΡŒ. ΠŸΡ€ΠΈ этом Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ стол, ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π·Π° Π½ΠΈΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ. Наша Π·Π°Π΄Π°Ρ‡Π° β€” Π½Π°ΠΊΠΎΡ€ΠΌΠΈΡ‚ΡŒ всСх философов. Никто ΠΈΠ· Π½ΠΈΡ… Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ Π³ΠΎΠ»ΠΎΠ΄Π½Ρ‹ΠΌ, ΠΈ ΠΏΡ€ΠΈ этом ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Β«Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΒ» Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡΠ΅ΡΡ‚ΡŒ Π·Π° стол (ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ deadlock). Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ наш класс философа:
class Philosopher extends Thread {

   private Semaphore sem;

   // ΠΏΠΎΠ΅Π» Π»ΠΈ философ
   private boolean full = false;

   private String name;

   Philosopher(Semaphore sem, String name) {
       this.sem=sem;
       this.name=name;
   }

   public void run()
   {
       try
       {
           // Ссли философ Π΅Ρ‰Π΅ Π½Π΅ Π΅Π»
           if (!full) {
               //Π—Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ Ρƒ сСмафора Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
               sem.acquire();
               System.out.println (name + " садится Π·Π° стол");

               // философ Сст
               sleep(300);
               full = true;

               System.out.println (name + " ΠΏΠΎΠ΅Π»! Он Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·-Π·Π° стола");
               sem.release();

               // философ ΡƒΡˆΠ΅Π», освободив мСсто Π΄Ρ€ΡƒΠ³ΠΈΠΌ
               sleep(300);
           }
       }
       catch(InterruptedException e) {
           System.out.println ("Π§Ρ‚ΠΎ-Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ!");
       }
   }
}
А Π²ΠΎΡ‚ ΠΊΠΎΠ΄ для запуска нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:
public class Main {

   public static void main(String[] args) {

       Semaphore sem = new Semaphore(2);
       new Philosopher(sem,"Π‘ΠΎΠΊΡ€Π°Ρ‚").start();
       new Philosopher(sem,"ΠŸΠ»Π°Ρ‚ΠΎΠ½").start();
       new Philosopher(sem,"ΠΡ€ΠΈΡΡ‚ΠΎΡ‚Π΅Π»ΡŒ").start();
       new Philosopher(sem,"ЀалСс").start();
       new Philosopher(sem,"ΠŸΠΈΡ„Π°Π³ΠΎΡ€").start();
   }
}
ΠœΡ‹ создали сСмафор со счСтчиком 2, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ: ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° философа. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°, вСдь наш класс Philosopher унаслСдован ΠΎΡ‚ Thread! ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ acquire() ΠΈ release() класса Semaphore ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Π΅Π³ΠΎ счСтчиком Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. ΠœΠ΅Ρ‚ΠΎΠ΄ acquire() Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° доступ ΠΊ рСсурсу Ρƒ сСмафора. Если счСтчик > 0, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ прСдоставляСтся, Π° счСтчик ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° 1. ΠœΠ΅Ρ‚ΠΎΠ΄ release() «освобоТдаСт» Π²Ρ‹Π΄Π°Π½Π½ΠΎΠ΅ Ρ€Π°Π½Π΅Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² счСтчик (ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ счСтчик Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ сСмафора Π½Π° 1). Π§Ρ‚ΠΎ ΠΆΠ΅ Ρƒ нас получится ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹? РСшСна Π»ΠΈ Π·Π°Π΄Π°Ρ‡Π°, Π½Π΅ пСрСдСрутся Π»ΠΈ наши философы, оТидая своСй ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ? :) Π’ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄ Π² консоль ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ: Π‘ΠΎΠΊΡ€Π°Ρ‚ садится Π·Π° стол ΠŸΠ»Π°Ρ‚ΠΎΠ½ садится Π·Π° стол Π‘ΠΎΠΊΡ€Π°Ρ‚ ΠΏΠΎΠ΅Π»! Он Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·-Π·Π° стола ΠŸΠ»Π°Ρ‚ΠΎΠ½ ΠΏΠΎΠ΅Π»! Он Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·-Π·Π° стола ΠΡ€ΠΈΡΡ‚ΠΎΡ‚Π΅Π»ΡŒ садится Π·Π° стол ΠŸΠΈΡ„Π°Π³ΠΎΡ€ садится Π·Π° стол ΠΡ€ΠΈΡΡ‚ΠΎΡ‚Π΅Π»ΡŒ ΠΏΠΎΠ΅Π»! Он Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·-Π·Π° стола ΠŸΠΈΡ„Π°Π³ΠΎΡ€ ΠΏΠΎΠ΅Π»! Он Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·-Π·Π° стола ЀалСс садится Π·Π° стол ЀалСс ΠΏΠΎΠ΅Π»! Он Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ·-Π·Π° стола Π£ нас всС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ! И хотя ЀалСсу ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΎΠ±Π΅Π΄Π°Ρ‚ΡŒ Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡ΠΊΡƒ, Π΄ΡƒΠΌΠ°ΡŽ, ΠΎΠ½ Π½Π° нас Π½Π΅ Π² ΠΎΠ±ΠΈΠ΄Π΅ :) Π’Ρ‹ ΠΌΠΎΠ³ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сходство ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ ΠΈ сСмафором. Π£ Π½ΠΈΡ…, Π² ΠΎΠ±Ρ‰Π΅ΠΌ-Ρ‚ΠΎ, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ рСсурсу. Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ сСмафором - 5Π Π°Π·Π½ΠΈΡ†Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ, Π° Π² случаС с сСмафором ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ счСтчик ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΈ доступ ΠΊ рСсурсу ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сразу нСсколько ΠΈΠ· Π½ΠΈΡ…. И это Π½Π΅ просто случайноС сходство :) На самом Π΄Π΅Π»Π΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ β€” это одномСстный сСмафор. Π’ΠΎ Π΅ΡΡ‚ΡŒ, это сСмафор, счСтчик ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ установлСн Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ 1. Π•Π³ΠΎ Π΅Ρ‰Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Β«Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ сСмафором», ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ счСтчик ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 2 значСния β€” 1 («свободно») ΠΈ 0 («занято»). Π’ΠΎΡ‚ ΠΈ всС! Как видишь, всС оказалось Π½Π΅ Ρ‚Π°ΠΊΠΈΠΌ ΡƒΠΆ ΠΈ Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌ :) Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Ρ‚Ρ‹ Π·Π°Ρ…ΠΎΡ‡Π΅ΡˆΡŒ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΌΡƒ многопоточности ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅, Ρ‚Π΅Π±Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² понятиях. Π”ΠΎ встрСчи Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡƒΡ€ΠΎΠΊΠ°Ρ…!
ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ (101)
  • популярныС
  • Π½ΠΎΠ²Ρ‹Π΅
  • старыС
Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ
Olexandr
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 29
1 апрСля, 12:40
ΠžΡ‚Π»ΠΈΡ‡Π½Π°Ρ лСкция, всС ΠΏΠΎ ΠΏΠΎΠ»ΠΎΡ‡ΠΊΠ°ΠΌ!
Ислам
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 33
22 фСвраля, 22:38
Π’Π΅ΡΡŒΠΌΠ° полСзная лСкция которая раскрываСт эти понятия Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΈ интСрСснСй.
Abubakar Web Java Developer Π² Google
28 дСкабря 2023, 10:36
отличная лСкция
АндрСй
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 43
16 дСкабря 2023, 03:40
ΠΎΠ³ΠΎ
obj.getMutex().isBusy() = true;
Миша Π ΠΈΡ‡
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 33
25 октября 2023, 09:03
ΠœΡŒΡŽΡ‚Π΅ΠΊΡ (одномСстный сСмафор) - Ρ„Π»Π°Π³ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΎΠ±ΡŒΠ΅ΠΊΡ‚Π° (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°) ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ - скрытая Π»ΠΎΠ³ΠΈΠΊΠ° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈ сСмафора которая исполняСтся JVM Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ - Ρ„Π»Π°Π³ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΎΠ±ΡŒΠ΅ΠΊΡ‚Π° (количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ±ΡŒΠ΅ΠΊΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ).
ivan Π΄Π²ΠΎΡ€Π½ΠΈΠΊ
11 сСнтября 2023, 13:52
рСбята ΠΊΡƒΠΏΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ видСокурс (Π½Π΅ алишСв. слишком ΠΌΠ°Π»ΠΎ ΠΈΠ½Ρ„Ρ‹). Π±Π΅Π· Π½Π΅Π³ΠΎ тяТСло ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΠΈΡˆΠ΅Ρ‚ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отучился Π±Π΅Π· видСокурса ΠΈ ΡƒΠΆΠ΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ» нСсколько видСокурсов
Denis Odesskiy Full Stack Developer
26 мая 2023, 19:29
ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΠ΅ΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Β«ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с Ρ‚ΡƒΠ°Π»Π΅Ρ‚ΠΎΠΌΒ».
Π’Π°ΠΊ?
package com.javalerning.example.myownexample02;

import java.util.ArrayList;
import java.util.List;
/*
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с Ρ‚ΡƒΠ°Π»Π΅Ρ‚ΠΎΠΌ
 */
public class Main {
    private static final Sortire SORTIRE = new Sortire();

    public static void main(String[] args) {
        SufferingMan.createAndStartThread();
    }

    private static void defecate() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ignored) {
        }
    }

    private static void waitingsQueues() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ignored) {
        }
    }

//Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… класса Sortire, Π½ΡƒΠΆΠ½Π° синхронизация,
//Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠŸΠ΅Ρ‚Ρ ΠΈ Вася Π½Π΅ оказались вмСстС Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ‚ΡƒΠ°Π»Π΅Ρ‚Π΅:
    private static class Sortire {
        private Thread thread;

        public Thread getSortireStatus() {
            return thread;
        }

        private synchronized void setSortireStatus(Thread thread) {
            this.thread = thread;
        }

        private synchronized boolean trySetSortireIsFree(Thread thread) {
            if (this.thread == null) {
                this.thread = thread;
                return true;
            }
            return false;
        }
    }
Denis Odesskiy Full Stack Developer
26 мая 2023, 19:29
private static class SufferingMan implements Runnable {
        private final String name;
        private final Thread thread;

        private SufferingMan(String name) {
            this.name = name;
            thread = new Thread(this, name);
        }

        @Override
        public void run() {
            boolean isAlreadyDefecated = false; //устанавливаСм Π±ΡƒΠ»Π΅Π²Ρ‹ΠΉ Ρ„Π»Π°Π³
            while (!isAlreadyDefecated) { //ΠΈ Π² Ρ†ΠΈΠΊΠ»Π΅ провСряСм
                if (SORTIRE.trySetSortireIsFree(thread)) { //Ссли сортир занят Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ (ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ), Ρ‚ΠΎ ΠΎΠ½:
                    System.out.println(name + " Π·Π°ΡˆΡ‘Π» Π² Ρ‚ΡƒΠ°Π»Π΅Ρ‚ ΠΈ справляСт Π½ΡƒΠΆΠ΄Ρƒ");
                    defecate(); //справляСт Π½ΡƒΠΆΠ΄Ρƒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ 2000 мс, ΠΈ:
                    System.out.println(name + " Π²Ρ‹ΡˆΠ΅Π» ΠΈΠ· Ρ‚ΡƒΠ°Π»Π΅Ρ‚Π°");
                    isAlreadyDefecated = true; //Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ устанавливаСм Ρ„Π»Π°Π³, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ΄Ρƒ справили
                    SORTIRE.setSortireStatus(null); //ΠΈ освобоТдаСм Ρ‚ΡƒΠ°Π»Π΅Ρ‚
                } else if (!thread.equals(SORTIRE.getSortireStatus())) {
//ΠΈΠ½Π°Ρ‡Π΅, Ссли ΠΏΠΎΡ‚ΠΎΠΊ (наш Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ) Π΄Ρ‘Ρ€Π³Π°Π΅Ρ‚ Π΄Π²Π΅Ρ€ΡŒ Ρ‚ΡƒΠ°Π»Π΅Ρ‚Π°, Π° Ρ‚Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°, Ρ‚ΠΎ:
                    System.out.println(name + " ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚");
                    waitingsQueues(); //ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ 2000 мс
                }
            }
        }

        //Π€Π°Π±Ρ€ΠΈΠΊΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π² Ρ‚ΡƒΠ°Π»Π΅Ρ‚ (ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²):
        private static void createAndStartThread() {
            List<String> listNames = new ArrayList<>() {
                {
                    add("Вася");
                    add("ΠŸΠ΅Ρ‚Ρ");
                    add("Коля");
                }
            };
            for (String name : listNames) {
                SufferingMan man = new SufferingMan(name);
                man.thread.start();
            }
        }
    }
}
ivan Π΄Π²ΠΎΡ€Π½ΠΈΠΊ
10 апрСля 2023, 15:54
Π’ Java ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово synchronized ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обСспСчСния Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ критичСской сСкции ΠΊΠΎΠ΄Π° Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово synchronized ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ с Π±Π»ΠΎΠΊΠΎΠΌ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, ΠΈ ΠΎΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для синхронизации. Π’ Java ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ - это синхронизационный конструкт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ассоциирован с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Java ΠΈΠΌΠ΅Π΅Ρ‚ встроСнный ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для синхронизации доступа ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΈ полям этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Когда ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² синхронизированный Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, связанный с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ - это синхронизационный ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΠ±Ρ‰ΠΈΡ… рСсурсов ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ доступа Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π’ Java ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово synchronized ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для обСспСчСния Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‡Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ - это синхронизационный ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для управлСния доступом ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу. Π’ Java класс Semaphore ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСмафоров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для контроля доступа ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ рСсурсам нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово synchronized ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡƒ. Оно Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сСмафор Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π½ΠΎ сСмафор ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса Semaphore Π² Java.
Evgeny Balanda
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 37
8 апрСля 2023, 18:37
Π‘Ρ‚Ρ€Π°Π½Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² "Ѐилософия Java" Π‘Ρ€ΡŽΡΠ° ЭккСля (4 ΠΈΠ·Π΄Π°Π½ΠΈΠ΅) Π΄Π°ΡŽΡ‚ опрСдСлСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚: ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ - это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ - Ρ„Π»Π°Π³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ рСсурс Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½: > Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ сопСрничСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² фактичСски всС ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Π΅ схСмы ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ доступ ΠΊ Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡŒΠΌ рСсурсам. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ доступ ΠΊ раздСляС­мому рСсурсу Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡Π°. Π§Π°Ρ‰Π΅ всСго это выполняСтся ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΠΎ этому Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρƒ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄Π°Π΅Ρ‚ эффСкт Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (mutual exclusion), этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ (mutex). > ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ простой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Π²Π°ΠΌ Π½Π΅ придСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ для Π½Π΅Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°). Когда Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ любой синхронизированный (synchronized) ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΈ ΠΏΠΎΠΊΠ° этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ Π½Π΅ снимСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ синхронизированныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹.
Gans Electro
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 50
8 мая 2023, 18:55
Π’ΠΈΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊ ΠΈ Π΅ΡΡ‚ΡŒ ssssssergeenkov Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 29 10 апрСля, 21:54 Π’ Java ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово synchronized ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обСспСчСния Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ критичСской сСкции ΠΊΠΎΠ΄Π° Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово synchronized ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ с Π±Π»ΠΎΠΊΠΎΠΌ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, ΠΈ ΠΎΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для синхронизации. Π’ Java ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ - это синхронизационный конструкт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ассоциирован с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Java ΠΈΠΌΠ΅Π΅Ρ‚ встроСнный ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для синхронизации доступа ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΈ полям этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Когда ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² синхронизированный Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, связанный с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠœΡŒΡŽΡ‚Π΅ΠΊΡ - это синхронизационный ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΠ±Ρ‰ΠΈΡ… рСсурсов ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ доступа Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π’ Java ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово synchronized ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для обСспСчСния Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‡Ρ‚ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ - это синхронизационный ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для управлСния доступом ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу. Π’ Java класс Semaphore ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСмафоров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для контроля доступа ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ рСсурсам нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово synchronized ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡƒ. Оно Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сСмафор Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π½ΠΎ сСмафор ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса Semaphore Π² Java.
ivan Π΄Π²ΠΎΡ€Π½ΠΈΠΊ
11 сСнтября 2023, 13:53
приятно Ρ‡Ρ‚ΠΎ мСня Ρ†ΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‚) спустя ΠΏΠΎΠ»Π³ΠΎΠ΄Π° ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ я написал всС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ
Виктория
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 111
24 фСвраля 2023, 11:27
Из ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² поняла большС, Ρ‡Π΅ΠΌ ΠΈΠ· Π»Π΅ΠΊΡ†ΠΈΠΉ. Вялікі дзякуй усім