ΠΡΠΈΠ²Π΅Ρ!
ΠΠ·ΡΡΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ Π½Π° JavaRush, ΡΡ ΡΠ°ΡΡΠΎ Π²ΡΡΡΠ΅ΡΠ°Π» ΠΏΠΎΠ½ΡΡΠΈΡ Β«ΠΌΡΡΡΠ΅ΠΊΡΒ» ΠΈ Β«ΠΌΠΎΠ½ΠΈΡΠΎΡΒ». Π‘ΠΌΠΎΠΆΠ΅ΡΡ ΡΠ΅ΠΉΡΠ°Ρ, Π±Π΅Π· ΠΏΠΎΠ΄Π³Π»ΡΠ΄ΡΠ²Π°Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠΈΡΡ, ΡΠ΅ΠΌ ΠΎΠ½ΠΈ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ? :)
ΠΡΠ»ΠΈ ΡΠΌΠΎΠ³ β ΠΌΠΎΠ»ΠΎΠ΄Π΅Ρ! ΠΡΠ»ΠΈ ΠΆΠ΅ Π½Π΅Ρ (Π° ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ°ΠΊ ΠΈ Π±ΡΠ²Π°Π΅Ρ) β Π½Π΅ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ.
ΠΠΎΠ½ΡΡΠΈΡ Β«ΠΌΡΡΡΠ΅ΠΊΡΒ» ΠΈ Β«ΠΌΠΎΠ½ΠΈΡΠΎΡΒ» Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΡΠΈΡΠ°Ρ Π»Π΅ΠΊΡΠΈΠΈ ΠΈ ΡΠΌΠΎΡΡΡ Π²ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ Π½Π° Π²Π½Π΅ΡΠ½ΠΈΡ
ΡΠ΅ΡΡΡΡΠ°Ρ
Π² ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅, ΡΡ ΡΡΠΎΠ»ΠΊΠ½Π΅ΡΡΡΡ Ρ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ
ΠΎΠΆΠΈΠΌ ΠΏΠΎΠ½ΡΡΠΈΠ΅ΠΌ β Β«ΡΠ΅ΠΌΠ°ΡΠΎΡΒ».
ΠΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΡΠΎΠΆΠ΅ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΡΡ
ΠΎΠΆ Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΎΠΌ ΠΈ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠΌ. ΠΠΎΡΡΠΎΠΌΡ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Ρ ΡΡΠΈΠΌΠΈ ΡΡΠ΅ΠΌΡ ΡΠ΅ΡΠΌΠΈΠ½Π°ΠΌΠΈ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΈ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΠΌ Π² Π³ΠΎΠ»ΠΎΠ²Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΡΠ΅ΠΌ ΠΆΠ΅ ΠΎΠ½ΠΈ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π° ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ :)
ΠΡΡΡΠ΅ΠΊΡ
ΠΡΡΡΠ΅ΠΊΡ β ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠ½ Β«ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½Β» ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² Java β ΡΡΠΎ ΡΡ ΡΠΆΠ΅ Π·Π½Π°Π΅ΡΡ :) ΠΠ΅Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡΡ Π»ΠΈ ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π» ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ, ΡΠΊΠ°ΠΆΠ΅ΠΌ,Cat
ΠΈ Dog
: Ρ Π²ΡΠ΅Ρ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π²ΡΠ΅Ρ
ΠΊΠ»Π°ΡΡΠΎΠ² Π΅ΡΡΡ ΠΌΡΡΡΠ΅ΠΊΡ.
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ Β«ΠΌΡΡΡΠ΅ΠΊΡΒ» ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΎΡ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ Β«MUTual EXclusionΒ» β Β«Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅Β», ΠΈ ΡΡΠΎ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΎΡΡΠ°ΠΆΠ°Π΅Ρ Π΅Π³ΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΠ°ΠΊ ΠΌΡ ΠΈ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡΠΎΡΠ»ΡΡ
Π»Π΅ΠΊΡΠΈΠΉ, Π·Π°Π΄Π°ΡΠ° ΠΌΡΡΡΠ΅ΠΊΡΠ° β ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ, ΡΡΠΎΠ±Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π±ΡΠ» ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
ΠΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΠ΅ΠΉ ΠΌΡΡΡΠ΅ΠΊΡΠ° Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ Β«ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΡΡΠ°Π»Π΅ΡΠΎΠΌΒ».
ΠΠΎΠ³Π΄Π° ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ Π·Π°Ρ
ΠΎΠ΄ΠΈΡ Π² ΡΡΠ°Π»Π΅Ρ, ΠΎΠ½ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ ΠΈΠ·Π½ΡΡΡΠΈ Π΄Π²Π΅ΡΡ Π½Π° Π·Π°ΠΌΠΎΠΊ.
Π’ΡΠ°Π»Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΎΠ»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠ°ΠΌΠΎΠΊ Π½Π° Π΄Π²Π΅ΡΠΈ ΡΡΠ°Π»Π΅ΡΠ° β ΡΠΎΠ»Ρ ΠΌΡΡΡΠ΅ΠΊΡΠ°, Π° ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈΠ· Π»ΡΠ΄Π΅ΠΉ ΡΠ½Π°ΡΡΠΆΠΈ β ΡΠΎΠ»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ².
ΠΠ°ΠΌΠΎΠΊ Π½Π° Π΄Π²Π΅ΡΠΈ β ΠΌΡΡΡΠ΅ΠΊΡ ΡΡΠ°Π»Π΅ΡΠ°: ΠΎΠ½ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π²Π½ΡΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ.
ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΎΠ±ΡΠΈΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ. ΠΠΎΠΏΡΡΠΊΠΈ Π΄ΡΡΠ³ΠΈΡ
ΠΏΠΎΡΠΎΠΊΠΎΠ² (Π»ΡΠ΄Π΅ΠΉ) ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π·Π°Π½ΡΡΡΠΌ ΡΠ΅ΡΡΡΡΠ°ΠΌ Π±ΡΠ΄ΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΡΠΌΠΈ.
Π£ ΠΌΡΡΡΠ΅ΠΊΡΠ° Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΠΆΠ½ΡΡ
ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ.
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π²Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ β Β«ΡΠ²ΠΎΠ±ΠΎΠ΄Π΅Π½Β» ΠΈ Β«Π·Π°Π½ΡΡΒ».
ΠΡΠΎ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° ΡΠ°Π±ΠΎΡΡ: ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈ Ρ Π±ΡΠ»Π΅Π²ΡΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ 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
Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, β ΡΡΠΎ ΠΈ Π΅ΡΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡ.
Π‘Π΅ΠΌΠ°ΡΠΎΡ
ΠΡΠ΅ ΠΎΠ΄Π½ΠΎ ΡΠ»ΠΎΠ²ΠΎ, Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΡΡ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΡΡΡΡ ΠΏΡΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΠΌ ΠΈΠ·ΡΡΠ΅Π½ΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ β Β«ΡΠ΅ΠΌΠ°ΡΠΎΡΒ». ΠΠ°Π²Π°ΠΉ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ ΡΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅, ΠΈ ΡΠ΅ΠΌ ΠΎΠ½ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ° ΠΈ ΠΌΡΡΡΠ΅ΠΊΡΠ°. Π‘Π΅ΠΌΠ°ΡΠΎΡ β ΡΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡ-ΡΠΎ ΡΠ΅ΡΡΡΡΡ. ΠΠ³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ΅ΡΡΠΈΠΊ. Π‘ΡΠ΅ΡΡΠΈΠΊ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π°ΠΌ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΌΡ ΡΠ΅ΡΡΡΡΡ. Π‘Π΅ΠΌΠ°ΡΠΎΡΡ Π² Java ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΠΊΠ»Π°ΡΡΠΎΠΌSemaphore
.
ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²-ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ:
Semaphore(int permits)
Semaphore(int permits, boolean fair)
Π ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ:
int permits
β Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ°. Π’ΠΎ Π΅ΡΡΡ ΡΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠ±ΡΠ΅ΠΌΡ ΡΠ΅ΡΡΡΡΡ;boolean fair
β Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΊΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄ΠΎΡΡΡΠΏ. ΠΡΠ»ΠΈfair
= true, Π΄ΠΎΡΡΡΠΏ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ Π² ΡΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ΠΈ Π΅Π³ΠΎ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π»ΠΈ. ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΎΠ½ ΡΠ°Π²Π΅Π½ false, ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π±ΡΠ΄Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ ΠΏΠΎΡΠΎΠΊΠΎΠ².
ΠΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΏΡΠΎΡΡΠΈΠΌ Π΅Π΅ ΡΡΠ»ΠΎΠ²ΠΈΡ, Π΄Π»Ρ Π»ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ.
ΠΡΠ΅Π΄ΡΡΠ°Π²Ρ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ 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).
Π§ΡΠΎ ΠΆΠ΅ Ρ Π½Π°Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ? Π Π΅ΡΠ΅Π½Π° Π»ΠΈ Π·Π°Π΄Π°ΡΠ°, Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π΅ΡΡΡΡΡ Π»ΠΈ Π½Π°ΡΠΈ ΡΠΈΠ»ΠΎΡΠΎΡΡ, ΠΎΠΆΠΈΠ΄Π°Ρ ΡΠ²ΠΎΠ΅ΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ? :)
ΠΠΎΡ ΠΊΠ°ΠΊΠΎΠΉ Π²ΡΠ²ΠΎΠ΄ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ:
Π‘ΠΎΠΊΡΠ°Ρ ΡΠ°Π΄ΠΈΡΡΡ Π·Π° ΡΡΠΎΠ»
ΠΠ»Π°ΡΠΎΠ½ ΡΠ°Π΄ΠΈΡΡΡ Π·Π° ΡΡΠΎΠ»
Π‘ΠΎΠΊΡΠ°Ρ ΠΏΠΎΠ΅Π»! ΠΠ½ Π²ΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ·-Π·Π° ΡΡΠΎΠ»Π°
ΠΠ»Π°ΡΠΎΠ½ ΠΏΠΎΠ΅Π»! ΠΠ½ Π²ΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ·-Π·Π° ΡΡΠΎΠ»Π°
ΠΡΠΈΡΡΠΎΡΠ΅Π»Ρ ΡΠ°Π΄ΠΈΡΡΡ Π·Π° ΡΡΠΎΠ»
ΠΠΈΡΠ°Π³ΠΎΡ ΡΠ°Π΄ΠΈΡΡΡ Π·Π° ΡΡΠΎΠ»
ΠΡΠΈΡΡΠΎΡΠ΅Π»Ρ ΠΏΠΎΠ΅Π»! ΠΠ½ Π²ΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ·-Π·Π° ΡΡΠΎΠ»Π°
ΠΠΈΡΠ°Π³ΠΎΡ ΠΏΠΎΠ΅Π»! ΠΠ½ Π²ΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ·-Π·Π° ΡΡΠΎΠ»Π°
Π€Π°Π»Π΅Ρ ΡΠ°Π΄ΠΈΡΡΡ Π·Π° ΡΡΠΎΠ»
Π€Π°Π»Π΅Ρ ΠΏΠΎΠ΅Π»! ΠΠ½ Π²ΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ·-Π·Π° ΡΡΠΎΠ»Π°
Π£ Π½Π°Ρ Π²ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ! Π Ρ
ΠΎΡΡ Π€Π°Π»Π΅ΡΡ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΎΠ±Π΅Π΄Π°ΡΡ Π² ΠΎΠ΄ΠΈΠ½ΠΎΡΠΊΡ, Π΄ΡΠΌΠ°Ρ, ΠΎΠ½ Π½Π° Π½Π°Ρ Π½Π΅ Π² ΠΎΠ±ΠΈΠ΄Π΅ :)
Π’Ρ ΠΌΠΎΠ³ Π·Π°ΠΌΠ΅ΡΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡ
ΠΎΠ΄ΡΡΠ²ΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠΌ ΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌ.
Π£ Π½ΠΈΡ
, Π² ΠΎΠ±ΡΠ΅ΠΌ-ΡΠΎ, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅: ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡ-ΡΠΎ ΡΠ΅ΡΡΡΡΡ.
Π Π°Π·Π½ΠΈΡΠ° ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΌΡΡΡΠ΅ΠΊΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π·Π°Ρ
Π²Π°ΡΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ, Π° Π² ΡΠ»ΡΡΠ°Π΅ Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ΅ΡΡΠΈΠΊ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΈ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅ΡΡΡΡΡ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ· Π½ΠΈΡ
. Π ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ ΡΡ
ΠΎΠ΄ΡΡΠ²ΠΎ :)
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΌΡΡΡΠ΅ΠΊΡ β ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠΌΠ΅ΡΡΠ½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ. Π’ΠΎ Π΅ΡΡΡ, ΡΡΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΡΡΠ΅ΡΡΠΈΠΊ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ 1. ΠΠ³ΠΎ Π΅ΡΠ΅ Π½Π°Π·ΡΠ²Π°ΡΡ Β«Π΄Π²ΠΎΠΈΡΠ½ΡΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠΌΒ», ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΅Π³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ 2 Π·Π½Π°ΡΠ΅Π½ΠΈΡ β 1 (Β«ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΒ») ΠΈ 0 (Β«Π·Π°Π½ΡΡΠΎΒ»).
ΠΠΎΡ ΠΈ Π²ΡΠ΅! ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΡ, Π²ΡΠ΅ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π½Π΅ ΡΠ°ΠΊΠΈΠΌ ΡΠΆ ΠΈ Π·Π°ΠΏΡΡΠ°Π½Π½ΡΠΌ :) Π’Π΅ΠΏΠ΅ΡΡ, Π΅ΡΠ»ΠΈ ΡΡ Π·Π°Ρ
ΠΎΡΠ΅ΡΡ ΠΈΠ·ΡΡΠΈΡΡ ΡΠ΅ΠΌΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π² ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅, ΡΠ΅Π±Π΅ Π±ΡΠ΄Π΅Ρ ΡΡΡΡ ΠΏΡΠΎΡΠ΅ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² ΠΏΠΎΠ½ΡΡΠΈΡΡ
. ΠΠΎ Π²ΡΡΡΠ΅ΡΠΈ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΡΡΠΎΠΊΠ°Ρ
!