μ€λμ λ©ν°μ€λ λ νκ²½μμ λ°μνλ λνμ μΈ λ¬Έμ μ€ νλμΈ κ²½μ μνμ λν΄ μμ보μ β
1 . π€ΌββοΈ κ²½μ μνλ ? ( Race Condition )
- λ©ν°μ€λ λ νκ²½μμλ μ¬λ¬ μ€λ λκ° λμμ κ°μ μμ ( λ©λͺ¨λ¦¬, νμΌ , DB λ± )μ μ κ·Όν μ μλ€.
- μ΄λ μ€ν μμμ λ°λΌ κ²°κ³Όκ° λ¬λΌμ§λ μν©μ κ²½μ μν ( Race Condition )λΌκ³ λΆλ₯Έλ€.
- μ¦ β λκ° λ¨Όμ μ€νλλμ λ°λΌ νλ‘κ·Έλ¨ κ²°κ³Όκ° λ¬λΌμ§ μ μλ μμΈ‘ λΆνμ μνμΈ κ²μ΄λ€.
- μ΄λ νλ‘κ·Έλ¨μ μμ μ±κ³Ό μΌκ΄μ±μ κΉ¨λ¨λ¦¬λ λνμ μΈ λ©ν°μ€λ λ λ¬Έμ μ΄λ€.
2 . π€·ββοΈ κ²½μ μνκ° λ°μνλ μμΈμ ?
- 곡μ μμ : μ¬λ¬ μ€λ λκ° λμμ μ½κ³ μ°κΈ°λ₯Ό μνν κ²½μ° μν λΆμΌμΉκ° λ°μν μ μλ€.
- λΉμμμ μ°μ° : x = x + 1κ³Ό κ°μ λ¨μ μ°μ°λ μ¬μ€μ μ½κΈ° -> κ³μ° -> μ°κΈ°λΌλ 3λ¨κ³λ₯Ό κ±°μ³μ λλμ΄ μ€νλκΈ° λλ¬Έμ΄λ€.
- μ€μΌμ€λ¬μ λΆνμ€μ± : μ΄λ€ μ€λ λκ° μΈμ CPUλ₯Ό μ μ ν μ§ μμΈ‘ λΆκ°λ₯νκΈ° λλ¬Έμ΄λ€.
- μ μ ν λκΈ°νμ λΆμ¬ : Lock, Mutex, Semaphore κ°μ λκΈ°ν μ₯μΉκ° μκ±°λ μλͺ» μ¬μ©λ κ²½μ°
3 . π©π»βπ« λνμ μΈ EX
public void withdraw(int amount) {
if (balance >= amount) {
balance = balance - amount;
}
}
- μ€λ λ Aκ° balance >= amount κ²μ¬ ν, μμ§ balanceλ₯Ό κ°±μ νκΈ° μ μ
μ€λ λ Bλ κ°μ κ²μ¬λ₯Ό ν΅κ³Ό -> λλ€ κ°μ μΆκΈμ μ§ν
- κ²°κ³Όμ μΌλ‘ μμ‘μ΄ μμκ° λκ±°λ μ€μ λ³΄λ€ λ§μ΄ λΉ μ Έλκ°λ λ¬Έμ κ° λ°μνλ€.
4 . π§ββ κ²½μ μν ν΄κ²° μ λ΅
4 - 1 . λκΈ°ν ( Synchronization )
- Lock / Synchroized λΈλ‘
- ν λ²μ νλμ μ€λ λλ§ κ³΅μ μμμ μ κ·Όνλλ‘ μ ν
- EX
public synchronized void withdraw(int amount) {
if (balance >= amount) {
balance = balance - amount;
}
}
- ReentrantLock ( λͺ
μμ Lock μ μ΄ )
- λ μΈλ°ν Lock μ μ΄ κ°λ₯ ( νμμμ, 쑰건 λκΈ° λ± μ§μ )
4 - 2 . μμμ μ°μ°
- AtomicInteger, AtomicLong κ°μ μμμ ν΄λμ€ μ¬μ©
- λ΄λΆμ μΌλ‘ CAS(Compare-And-Swap) μκ³ λ¦¬μ¦μ ν΅ν΄ λκΈ°ν λ¬Έμ λ₯Ό ν΄κ²°
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();
4 - 3 . λΆλ³ κ°μ²΄ νμ©
- λ³κ²½ κ°λ₯ν μνλ₯Ό 곡μ νμ§ μκ³ , μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ λ°©μ
- ex : String ν΄λμ€λ λΆλ³ κ°μ²΄μ΄λ―λ‘ μ€λ λ Safeβ
4 - 4 . μ€λ λ λ‘컬 λ³μ
- κ° μ€λ λλ§λ€ λ
립μ μΈ λ³μλ₯Ό μ μ§νμ¬ κ³΅μ μ체λ₯Ό νΌν¨
- Ex : ThreadLocal μ¬μ©
4 - 5 . λ³ν μ μ΄( Concurrency Control) κΈ°λ²
- μΈλ§ν¬μ΄(Semaphore) : λμμ μ κ·Ό κ°λ₯ν μ€λ λ μλ₯Ό μ ν
- ReadWriteLock : μ½κΈ° μ€λ λλ λμ νμ©, μ°κΈ° μ€λ λλ λ¨λ
νμ©
- λ°μ΄ν°λ² μ΄μ€ νΈλμμ
: DBμ°¨μμμ λμμ± μ μ΄ ( ACID 보μ₯ )
4 - 6 . Concurrent 컬λ μ
- ConcurrentHashMap, CopyOnWriteArrayList λ±μ λ΄λΆμ μΌλ‘ λμμ± μ μ΄κ° μ μ©λ 컬λ μ
- μ§μ synchronizedλ₯Ό κ±Έμ§ μμλ μμ ν λ³λ ¬ μ κ·Ό κ°λ₯
π λ§λ¬΄λ¦¬
κ²½μ μνλ λ©ν°μ€λ λ νλ‘κ·Έλλ°μμ νΌν μ μλ κ³Όμ μ΄λ€ β
λͺ¨λ μν©μ νλμ μ λ΅μ μμΌλ©°, 곡μ μμμ νΉμ±κ³Ό μ°κΈ° λΉλ, μ±λ₯ μꡬμ¬νμ λ°λΌ
μ μ ν λκΈ°ν μ λ΅μ μ ννλ κ²μ΄ μ€μνλ€. π€
μ€λ μμλ³Έ κ²μ ν λλ‘ λ¬Έμ μν©μ λ§λ λκΈ°ν μ λ΅μ μ ννκ³ , λΆνμν λκΈ°νλ νΌνλ©΄μ μ΄λ₯Ό μΆ©λΆν μ μ΄ν΄λ³΄μ. π―