Concurrent - jeongyeonKimm/be-was GitHub Wiki

Concurrent

java.util.concurrent

Java 5์—์„œ ์ถ”๊ฐ€๋œ ํŒจํ‚ค์ง€๋กœ, ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ์ œ๊ณต

  • Locks: ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค ์ œ๊ณต
  • Atomic: ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด์žˆ๋Š” ๋ณ€์ˆ˜ ์ œ๊ณต
  • Executors: ์Šค๋ ˆ๋“œ ํ’€ ์ƒ์„ฑ, ์Šค๋ ˆ๋“œ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ, Task ๋“ฑ๋ก๊ณผ ์‹คํ–‰ ๋“ฑ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌ
  • Queue: thread-safeํ•œ FIFO ํ ์ œ๊ณต
  • Synchronizers: ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์˜ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” 5๊ฐœ์˜ ํด๋ž˜์Šค ์ œ๊ณต(Semaphore, CountDownLatch, CyclicBarrier, Phaser, Exchanger)

java.util.concurrent.locks

์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์œ„ํ•œ 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 ๊ฐ์ฒด ๋ฐ˜ํ™˜
๐Ÿ’ก Synchronized vs. Lock
  • 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 ๊ตฌ๋ฌธ์ด ์ถ”๊ฐ€๋จ์œผ๋กœ์จ ์ฝ”๋“œ๊ฐ€ ๋œ ๊ฐ„๊ฒฐํ•ด์ง

CountDownLatch

ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…๋“ค์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋™๊ธฐํ™” ์žฅ์น˜

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-07-17 แ„‹แ…ฉแ„’แ…ฎ 5 40 33
  1. ์ƒ์„ฑํ•  ๋•Œ 1 ์ด์ƒ์˜ count๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ
  2. await()๋ฅผ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐ ์ƒํƒœ์— ๋“ค์–ด๊ฐ
  3. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ countDown() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด count์˜ ๊ฐ’์ด 1์”ฉ ๊ฐ์†Œ
  4. await() ํ•จ์ˆ˜๋Š” countDown() ๋ฉ”์†Œ๋“œ๊ฐ€ ์ฒ˜์Œ ์„ค์ •ํ•œ count ๋งŒํผ ํ˜ธ์ถœ๋˜์–ด count์˜ ๊ฐ’์ด 0์ด ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ–ˆ๋‹ค๊ฐ€ 0์ด ๋˜์—ˆ์„ ๋•Œ ๋Œ€๊ธฐ ์ƒํƒœ ํ•ด์ œ
  5. 0์ด ๋œ latch๋Š” ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€
โš ๏ธ **GitHub.com Fallback** โš ๏ธ