Concurrent - jeongyeonKimm/be-was GitHub Wiki
Java 5์์ ์ถ๊ฐ๋ ํจํค์ง๋ก, ๋๊ธฐํ๊ฐ ํ์ํ ์ํฉ์์ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ ํธ๋ฆฌํฐ ํด๋์ค ์ ๊ณต
- Locks: ์ํธ ๋ฐฐ์ ๋ฅผ ์ฌ์ฉํ ์ ์๋ ํด๋์ค ์ ๊ณต
- Atomic: ๋๊ธฐํ๊ฐ ๋์ด์๋ ๋ณ์ ์ ๊ณต
- Executors: ์ค๋ ๋ ํ ์์ฑ, ์ค๋ ๋ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ, Task ๋ฑ๋ก๊ณผ ์คํ ๋ฑ์ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌ
- Queue: thread-safeํ FIFO ํ ์ ๊ณต
- Synchronizers: ํน์ํ ๋ชฉ์ ์ ๋๊ธฐํ๋ฅผ ์ฒ๋ฆฌํ๋ 5๊ฐ์ ํด๋์ค ์ ๊ณต(Semaphore, CountDownLatch, CyclicBarrier, Phaser, Exchanger)
์ํธ ๋ฐฐ์ ๋ฅผ ์ํ Lock API ์ ์
java์ synchronized ๋ธ๋ก ์ฌ์ฉํ์ ๋์ ๋์ผํ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋์
๋ด๋ถ์ ์ผ๋ก synchronized๋ฅผ ์ฌ์ฉํด ๊ตฌํ๋์์ผ๋ฉฐ, synchronized๋ฅผ ๋์ฑ ์ ์ฐํ๊ณ ์ ๊ตํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ
package java.util.concurrent.locks;
import java.util.concurrent.TimeUnit;
public interface Lock {
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long var1, TimeUnit var3) throws InterruptedException;
void unlock();
Condition newCondition();
}- Interface
- Lock: ๊ณต์ ์์์ ํ๋ฒ์ ํ ์ค๋ ๋๋ง read, write ๊ฐ๋ฅ
- ReadWriteLock: ๊ณต์ ์์์ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๊ฐ read ๊ฐ๋ฅ, write๋ ํ๋ฒ์ ํ ์ค๋ ๋๋ง ๊ฐ๋ฅ
- Condition: Object ํด๋์ค์ monitor method์ธ wait โ await, notify โ signal, notifyAll โ signalAll ๋์ฒด
- Interface ๊ตฌํ์ฒด
- ReentrantLock: Lock์ ๊ตฌํ์ฒด / ์๊ณ์์ญ์ ์์ ์ง์ ๊ณผ ์ข ๋ฃ ์ง์ ์ง์ ๋ช ์ ๊ฐ๋ฅ
- ReentrantReadWriteLock: ReadWriteLock์ ๊ตฌํ์ฒด
-
lock()- Lock ์ธ์คํด์ค์ ์ ๊ธ ๊ฑธ์ด๋
- ์ด๋ฏธ ์ ๊ฒจ์๋ ์ํ๋ผ๋ฉด ์ ๊ธ์ ๊ฑธ์ด๋ ์ค๋ ๋๊ฐ unlock()์ ํธ์ถํ ๋๊น์ง ์คํ ๋นํ์ฑํ
-
lockInterruptibly()- ํ์ฌ ์ค๋ ๋๊ฐ interrupted ์ํ๊ฐ ์๋ ๋ Lock ์ธ์คํด์ค์ ์ ๊ธ ๊ฑธ์ด๋
- ํ์ฌ ์ค๋ ๋๊ฐ interrupted ์ํ์ด๋ฉด InterruptedException ๋ฐ์
-
tryLock()- ์ฆ์ Lock ์ธ์คํด์ค์ ์ ๊ธ์ ์๋ํ๊ณ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ boolean ํ์ ์ผ๋ก ๋ฐํ
-
unlock()- Lock ์ธ์คํด์ค์ ์ ๊ธ ํด์
-
newCondition()- ํ์ฌ Lock ์ธ์คํด์ค์ ์ฐ๊ฒฐ๋ Condition ๊ฐ์ฒด ๋ฐํ
- fairness(๊ณต์ ์ฑ): ๋ชจ๋ ์ค๋ ๋๊ฐ ์์ ์ ์์ ์ ์ํํ ๊ธฐํ๋ฅผ ๊ณตํํ๊ฒ ๊ฐ๋ ๊ฒ
- Synchronized๋ ๊ณต์ ์ฑ ์ง์ X
- ReentrantLock์ ๊ณต์ /๋ถ๊ณต์ ์ค์ ๊ฐ๋ฅ
- ๊ณต์ ํ lock์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ฒฝ์์ด ๋ฐ์ํ์ ๋ ๊ฐ์ฅ ์ค๋ซ๋์ ๊ธฐ๋ค๋ฆฐ ์ค๋ ๋์๊ฒ lock ์ ๊ณต
- lock์ ์์ฒญํ๋ ์๊ฐ ๊ฐ๊ฒฉ์ด ๊ธด ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๋น๊ต์ ์ฑ๋ฅ์ด ์ฐ์ํ ๋ถ๊ณต์ ๋ฐฉ์ ์ฌ์ฉ
- synchronized๋ ๋ธ๋ก ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋์ ๋ฉ์๋ ์์์ ์๊ณ ์์ญ์ ์์๊ณผ ๋์ด ์์ด์ผ ํจ
- Lock์ lock(), unlock()์ผ๋ก ์์๊ณผ ๋์ ๋ช ์ํ๊ธฐ ๋๋ฌธ์ ์๊ณ ์์ญ์ ์ฌ๋ฌ ๋ฉ์๋์ ๋๋ ์ ์์ฑ ๊ฐ๋ฅ
- synchronized๋ ๋๊ธฐํ๊ฐ ํ์ํ ๋ธ๋ญ์ synchronized{}๋ก ๊ฐ์ธ lock์ ๊ฒ. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฒฝ์ ์ํ์ ์์ ๋ ์ด๋ค ์ค๋ ๋๊ฐ ์ง์ ๊ถ์ ํ๋ํ ์ง ์์ ๋ณด์ฅ X โ ์์์ ์ธ(implicit) lock
- Lock์ lock()-unlock() ๋ฉ์๋๋ฅผ ํธ์ถํจ์ผ๋ก์จ ์ด๋ค ์ค๋ ๋๊ฐ ๋จผ์ ๋ฝ์ ํ๋ํ๊ฒ ๋ ์ง ์์๋ฅผ ์ง์ ํ ์ ์์ โ ๋ช ์์ ์ธ(explicit) lock
- Lock์ ์ธ์คํด์ค ํ๊ฐ ์ด์์ Condition ์ง์ ๊ฐ๋ฅ. lockInterruptibly(), tryLock() ๊ฐ์ ํธ๋ฆฌํ ์ ์ด ๋ฉ์๋ ์ฌ์ฉํ ์ ์๊ณ , lock ํ๋์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ค๋ ๋์ ๋ชฉ๋ก์ ๊ฐํธํ๊ฒ ํ์ธ ๊ฐ๋ฅ
- synchronized๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ก ์๊ณ ์์ญ์ ์ง์ ํ ์ ์์. lock์ ํด์ ํ์ง ์์ ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฐ๋ฅ์ฑ ์์
- Lock์ ์ฌ์ฉํ ๊ฒฝ์ฐ import์ try-catch-finally ๊ตฌ๋ฌธ์ด ์ถ๊ฐ๋จ์ผ๋ก์จ ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํด์ง
ํ๋ ์ด์์ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋์์ ์ํ๋๋ ์์ ๋ค์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ ์ ์๋๋ก ํ๋ ๋๊ธฐํ ์ฅ์น
- ์์ฑํ ๋ 1 ์ด์์ count๋ฅผ ์ธ์๋ก ๋ฐ์
- await()๋ฅผ ํธ์ถํ ์ค๋ ๋๋ ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ
- ๋ค๋ฅธ ์ค๋ ๋์์ ์์ ์ด ์๋ฃ๋ ๋ countDown() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด count์ ๊ฐ์ด 1์ฉ ๊ฐ์
- await() ํจ์๋ countDown() ๋ฉ์๋๊ฐ ์ฒ์ ์ค์ ํ count ๋งํผ ํธ์ถ๋์ด count์ ๊ฐ์ด 0์ด ๋ ๋๊น์ง ๋๊ธฐํ๋ค๊ฐ 0์ด ๋์์ ๋ ๋๊ธฐ ์ํ ํด์
- 0์ด ๋ latch๋ ์ฌ์ฌ์ฉ ๋ถ๊ฐ