πΠΡΠΈΠ³Π»Π°ΡΠ°Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠΉ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ Β«ΠΡΠ°Ρ Π’ΠΎΠ½Π³ ΡΠΈΡΠ°Π΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄Β», ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ°ΡΡΡΠΌΠΈ ΠΈΠ· ΡΠ΅ΡΠΈΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΠΏΠ»Π°Π²Π°ΡΡ Π² ΠΎΠΊΠ΅Π°Π½Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π±ΡΠ°ΡΠΎΠΌ Π’ΠΎΠ½Π³ΠΎΠΌ.
(ΡΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π½Π° Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎΠΌ ΡΠΊΡΠ°Π½Π΅ ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½Π°)
ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°
(1) Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ CountDownLatch?
(2) ΠΠ°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΅ΡΡΡ Ρ CountDownLatch?
(3) Π ΠΊΠ°ΠΊΠΈΡ ΡΡΠ΅Π½Π°ΡΠΈΡΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ CountDownLatch?
(4) ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ΅Ρ CountDownLatch?
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
CountDownLatch ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ ΠΊΠ°ΠΊ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΡΡΠ΅ΡΠ°, Π½ΠΎ ΡΡΠΎ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π΅ΡΠΎΡΠ½ΡΠΌ, Π΅Π³ΠΎ ΡΠΌΡΡΠ» Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
ΠΠ±ΡΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ CountDownLatch Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° Thread.join(), ΠΎΠΆΠΈΠ΄Π°Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ.
ΡΡΡΡΠΊΡΡΡΠ° ΠΊΠ»Π°ΡΡΠ°
![CountDownLatch](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-0543032bdcfb33a96adc98a6f62a942402fb59961dcced7cd82710170dcff0c89f43c666.png)
CountDownLatch ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΊΠ»Π°ΡΡ Sync, Ρ Π½Π΅Π³ΠΎ Π½Π΅Ρ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎΠ³ΠΎ/Π½Π΅ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ.
Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ CountDownLatch Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Serializable, ΠΏΠΎΡΡΠΎΠΌΡ Π΅Π³ΠΎ Π½Π΅Π»ΡΠ·Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ.
ΠΠ½Π°Π»ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ°
private static final class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 4982264981922014374L;
// δΌ ε
₯εε§ζ¬‘ζ°
Sync(int count) {
setState(count);
}
// θ·εθΏε©η欑ζ°
int getCount() {
return getState();
}
// ε°θ―θ·εε
±δΊ«ι
protected int tryAcquireShared(int acquires) {
// 注ζοΌθΏιstateηδΊ0ηζΆεθΏεηζ―1οΌδΉε°±ζ―θ―΄countεδΈΊ0ηζΆεθ·εζ»ζ―ζε
// stateδΈηδΊ0ηζΆεθΏεηζ―-1οΌδΉε°±ζ―countδΈδΈΊ0ηζΆεζ»ζ―θ¦ζι
return (getState() == 0) ? 1 : -1;
}
// ε°θ―ιζΎι
protected boolean tryReleaseShared(int releases) {
for (;;) {
// stateηεΌ
int c = getState();
// ηδΊ0δΊοΌεζ ζ³ειζΎδΊ
if (c == 0)
return false;
// ε°countηεΌε1
int nextc = c-1;
// εεζ΄ζ°stateηεΌ
if (compareAndSetState(c, nextc))
// εδΈΊ0ηζΆεθΏεtrueοΌθΏζΆδΌε€ιει’ζιηηΊΏη¨
return nextc == 0;
}
}
}
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ tryAcquireShared() ΠΈ tryReleaseShared() ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
ΠΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π²ΡΡ Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½Ρ.
ΠΠ΅ΡΠΎΠ΄ ΡΡΡΠΎΠΈΡΠ΅Π»ΡΡΡΠ²Π°
public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΠΉΡΠΈ ΡΡΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ.
ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ()
// java.util.concurrent.CountDownLatch.await()
public void await() throws InterruptedException {
// θ°η¨AQSηacquireSharedInterruptibly()ζΉζ³
sync.acquireSharedInterruptibly(1);
}
// java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly()
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
// ε°θ―θ·ειοΌε¦ζε€±θ΄₯εζι
if (tryAcquireShared(arg) < 0)
doAcquireSharedInterruptibly(arg);
}
ΠΠ΅ΡΠΎΠ΄ await()Β β ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π‘Π½Π°ΡΠ°Π»Π° ΠΎΠ½ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ±ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. Π ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΡΠ΄Π°ΡΠΈ ΠΎΠ½ Π²ΠΎΠΉΠ΄Π΅Ρ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ AQS ΠΈ Π²ΡΡΠ°Π½Π΅Ρ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄Π»Ρ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΡ.
Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡ Π²ΡΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ Sync, ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π΅ ΡΠ°Π²Π½ΠΎ 0, tryAcquireShared() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ -1, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ await(), Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Ρ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅ΡΡΠΈΠΊ Π½Π΅ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ Π΄ΠΎ 0. .
ΠΠ΅ΡΠΎΠ΄ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΡΡΠ΅ΡΠ°()
// java.util.concurrent.CountDownLatch.countDown()
public void countDown() {
// θ°η¨AQSηιζΎε
±δΊ«ιζΉζ³
sync.releaseShared(1);
}
// java.util.concurrent.locks.AbstractQueuedSynchronizer.releaseShared()
public final boolean releaseShared(int arg) {
// ε°θ―ιζΎε
±δΊ«ιοΌε¦ζζεδΊοΌε°±ε€ιζιηηΊΏη¨
if (tryReleaseShared(arg)) {
doReleaseShared();
return true;
}
return false;
}
ΠΠ΅ΡΠΎΠ΄ countDown() ΡΠ½ΠΈΠΌΠ΅Ρ ΠΎΠ±ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΡΠΎ Π΅ΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ² Π±ΡΠ΄Π΅Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΎ Π½Π° 1.
Π ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π²ΡΡΠ΅ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ TRERELEasshared () Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠΈΠ½ΡΡ 1, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ True, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ Π΄ΠΎ 0, Π½Π° ΡΡΠΎΡ ΡΠ°Π· ΠΏΡΠΎΠ±ΡΠ΄ΡΡ ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ doReleaseShared() ΠΏΡΠΎΠ±ΡΠΆΠ΄Π°Π΅Ρ ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅.
Π‘Π»ΡΡΠ°ΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΈΠΌΠΈΡΠΈΡΡΠ΅ΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΈ 5 Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΆΠ΄Π΅ΠΌ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, Π½Π°ΡΠΈΠ½Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ 5 Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΆΠ΄Π΅ΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ 5 Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ, ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π±Π»ΠΎΠΊ-ΡΡ Π΅ΠΌΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
![CountDownLatch](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-dedb0a7f55c7d8ca528abf5889ee663cf529c3b37b858807c0e95aae27fc0656a7b94dcd.png)
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ ΡΡΠΎΡ ΠΊΠΎΠ΄:
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
new Thread(()->{
try {
System.out.println("Aid thread is waiting for starting.");
startSignal.await();
// do sth
System.out.println("Aid thread is doing something.");
doneSignal.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
// main thread do sth
Thread.sleep(2000);
System.out.println("Main thread is doing something.");
startSignal.countDown();
// main thread do sth else
System.out.println("Main thread is waiting for aid threads finishing.");
doneSignal.await();
System.out.println("Main thread is doing something after all threads have finished.");
}
}
ΠΡΠΎΡ ΠΊΠΎΠ΄ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ Π½Π° Π΄Π²Π΅ ΡΠ°ΡΡΠΈ:
ΠΠ΅ΡΠ²ΡΠΉ ΡΠ΅Π³ΠΌΠ΅Π½Ρ, ΡΠΈΠ³Π½Π°Π» 5 Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ Π·Π°ΠΏΡΡΠΊΠ°, ΡΠΈΠ³Π½Π°Π», ΠΈΡΠΏΡΡΠΊΠ°Π΅ΠΌΡΠΉ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠ·ΡΠ²Π°Π΅Ρ 5 ΠΌΠ΅ΡΠΎΠ΄ startSignal.await(), ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠΉ ΡΠΈΠ³Π½Π°Π»Π° Π·Π°ΠΏΡΡΠΊΠ°, Π³Π»Π°Π²Π½ΠΎΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ, Π²ΡΠ·ΠΎΠ² startSignal.countDown () ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎ Π½Π°ΡΠ°Π»Π΅ ΡΠ°Π±ΠΎΡΡ.
ΠΠΎ Π²ΡΠΎΡΠΎΠΌ Π°Π±Π·Π°ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΡΠΈΠ³Π½Π°Π»Π° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ 5 Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π° ΡΠΈΠ³Π½Π°Π» Π²ΡΠ΄Π°Π΅ΡΡΡ 5 Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ doneSignal.await() Π΄Π»Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° 5 Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π·Π°Π²Π΅ΡΡΠ°ΡΡ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ ΠΠ΅ΡΠΎΠ΄ doneSignal.countDown() ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΈΠ³Π½Π°Π» Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΡΠΈΠ³Π½Π°Π» Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ 5, ΠΎΠ½ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π°Π΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π΄Π»Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ.
Π‘ΡΠΌΠΌΠΈΡΠΎΠ²Π°ΡΡ
(1) CountDownLatch ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΠΆΠ΄Π°ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ;
(2) CountDownLatch ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΠΎΠ±ΡΠ΅ΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ AQS;
(3) ΠΠΎΠ³Π΄Π° CountDownLatch ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΡΡΠ΅ΡΠΎΠ²;
(4) ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π° countDown() ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ Π½Π° 1;
(5) await () ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π·Π°ΠΌΠΎΠΊ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΠ°Π΅ΡΡΡ Π·Π΄Π΅ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ AQS Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ 1;
(6) ΠΠΎΠ³Π΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ count (ΡΠΎ Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ) ΡΠΌΠ΅Π½ΡΡΠΈΡΡΡ Π΄ΠΎ 0, ΠΏΠΎΡΠΎΠΊΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½Ρ (ΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ await() Π΄Π»Ρ Π²Ρ ΠΎΠ΄Π° Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ);
ΠΏΠ°ΡΡ Π°Π»ΡΠ½ΡΠ΅ ΡΠΉΡΠ°
(1) ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ΅Ρ CountDownLatch?
A: ΠΠΎΠ³Π΄Π° ΠΌΡ ΠΈΠ·ΡΡΠ°Π»ΠΈ Semaphore ΡΠ°Π½ΡΡΠ΅, ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ, ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Π΅Π³ΠΎ Π»ΠΈΡΠ΅Π½Π·ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π² Π»ΡΠ±ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ.Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ CountDownLatch Π² Π»ΡΠ±ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ? ΠΡΠ²Π΅Ρ β Π½Π΅Ρ, ΠΎΠ½ Π½Π΅ Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ (ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΡΠΌΠ΅Π½ΡΡΠ°ΡΡ) ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·, Π·Π° ββΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΎΠ±ΠΌΠ°Π½Π°.
(2) ΠΠΎΡΠ΅ΠΌΡ CountDownLatch ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠ±ΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ?
ΠΡΠ²Π΅Ρ: ΠΌΡ ΠΈΠ·ΡΡΠΈΠ»ΠΈ ΡΠ΅ΠΆΠΈΠΌ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ AQS, ΠΊΠΎΠ³Π΄Π° ΡΠ°Π½Π΅Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ ReentrantReadWriteLock. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΠΊΡΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠΌ ΠΊΠ°ΠΊ ΠΌΡΡΡΠ΅ΠΊΡ, ΡΠΎΠ³Π΄Π° Π²ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ±ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠΏΠ°ΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ AQS Π΄Π»Ρ ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ. this ΠΠΎΠ³Π΄Π° ΠΌΡΡΡΠ΅ΠΊΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ, ΠΎΠ½ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π°Π΅Ρ ΡΡΠΈ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄ΡΡΠ³ΠΈΠΌ.ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠ΅ΡΠΌΠΈΠ½ Π·Π΄Π΅ΡΡ Β«ΠΏΡΠΎΠ±ΡΠΆΠ΄Π°Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄ΡΡΠ³ΠΈΠΌΒ», ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠΌ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ.
ΠΡΡΠ°ΡΠΈ Π³ΠΎΠ²ΠΎΡΡ, Π²Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΠ΅? ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² CountDownLatchβs await() ΠΌΠΎΠ³ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·, ΠΏΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²Ρ ΠΎΠ΄ΠΈΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ AQS Π΄Π»Ρ ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ. .ΠΡΠ»ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΡΡΡΠ΅ΠΊΡ.ΠΡΡΡΠ΅ΠΊΡΡ ΡΠ²Π»ΡΡΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠΌΠΈ ΡΡΠ΅Π΄ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°Π·Π±ΡΠΆΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½.ΠΠ΅Ρ Π³Π°ΡΠ°Π½ΡΠΈΠΈ, ΡΡΠΎ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅ΡΡΠΈΠΊ ΡΠΌΠ΅Π½ΡΡΠΈΡΡΡ Π΄ΠΎ 0, Π²ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, Π²ΡΠ·Π²Π°Π²ΡΠΈΠ΅ ΠΠ΅ΡΠΎΠ΄ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ() Π΄Π»Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·Π±ΡΠΆΠ΅Π½.
(3) Π ΡΠ΅ΠΌ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ CountDownLatch ΠΈ Thread.join()?
ΠΡΠ²Π΅Ρ: Thread.join() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅. ΠΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ CountDownLatch ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ. ΠΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄ countDown() ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°. ., Π±ΠΎΠ»ΡΡΠ΅ Π³ΠΈΠ±ΠΊΠΎΡΡΠΈ.
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅
1,ΠΡΠΊΡΡΡΠΈΠ΅ ΡΠ΅ΡΠΈΠΈ java-ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΡΡΠ²ΡΡ ΠΏΡΠΈΡΠ΅Π΄Π°Π½ΠΈΠΉ
2,ΠΠ΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΌΠ΅ΡΡΠ²ΠΎΠ³ΠΎ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Java
3.JMM (ΠΌΠΎΠ΄Π΅Π»Ρ ΠΏΠ°ΠΌΡΡΠΈ Java) ΠΈΠ· ΠΌΠ΅ΡΡΠ²ΠΎΠΉ ΡΠ΅ΡΠΈΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Java
4.ΠΠ΅ΡΡΡΠΎΠΉΡΠΈΠ²ΡΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΌΠ΅ΡΡΠ²ΠΎΠΉ ΡΠ΅ΡΠΈΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Java
5.Π‘ΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΌΠ΅ΡΡΠ²ΠΎΠΉ ΡΠ΅ΡΠΈΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Java
7.ΠΠ°ΡΠ°Π»ΠΎ AQS Π² ΡΠ΅ΡΠΈΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Java
10.ReentrantLock VS ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π² ΡΠ΅ΡΠΈΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ java
12.ΠΠ½Π°Π»ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° ΡΠ΅ΡΠΈΠΈ Dead Java Synchronization
ΠΠΎΠ±ΡΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΡ ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΡΠ΅ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ Β«ΠΡΠ°Ρ Π’ΠΎΠ½Π³ ΡΠΈΡΠ°Π΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄Β», ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΡΡΠ°ΡΠ΅ΠΉ ΠΈΠ· ΡΠ΅ΡΠΈΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΠΏΠ»Π°Π²Π°ΡΡ Π² ΠΎΠΊΠ΅Π°Π½Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Ρ Π±ΡΠ°ΡΠΎΠΌ Π’ΠΎΠ½Π³ΠΎΠΌ.
![qrcode](https://s3.timeweb.com/newworld58-e1e8f297-7d39-4eff-9f5d-42281e40a914/UnderSkyWeb-eb033bd4b9089752d34eb5fab88fd138564ed962a587f3c0afffff444f364dc7d47a8385.jpg)