μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- μ°λΆν¬db
- μλΉμ€ ν리미ν°λΈ
- well known ν¬νΈ
- λ°μ΄ν° μ μ‘
- ν°μ€ν 리μ±λ¦°μ§
- νν΄99
- 99ν΄λ½
- 그리λ μκ³ λ¦¬μ¦
- mariadb
- μ€λ λ
- μ€λ₯μ μ΄
- til
- IEEE 802
- git merge
- νλ‘μ΄λμμ
- i-type
- μ½λ©ν μ€νΈμ€λΉ
- leetcode
- μ€λΈμ
- reducible
- μ€λ₯κ²μΆ
- νλ μ ꡬ쑰
- tcp μΈκ·Έλ¨ΌνΈ
- λΉμ£ΌκΈ°μ νΈ
- tcp νλ‘ν μ½
- μ£ΌκΈ°μ νΈ
- xv6
- ν ν° λ²μ€
- μμλ²νΈ
- κ°λ°μμ·¨μ
- Today
- Total
UnfazedβοΈπ―
μ€λ λ μμ μ± Thread Safety λ³Έλ¬Έ
Thread safety
μ€λ λ μμ μ±μ μ¬λ¬ μ€λ λμ μν΄ λμμ μ€νλλ κ²½μ°μλ μκ³ λ¦¬μ¦μ΄λ μ½λ λΆλΆμ΄ μ¬λ°λ₯΄κ² λμν μ μλ μ±μ§μ λ§νλ€. μ¬λ¬ μ€λ λκ° λμμ μ½λλ₯Ό μ€νν΄λ λ°μ΄ν° μμμ΄λ μμμΉ λͺ»ν νλμ΄ λ°μνμ§ μλλ€λ©΄ μ€λ λμ μμ νλ€κ³ ν μ μλ€.
μ΄μ λ°ν΄, μ€λ λ μ€νμ μμλ νμ΄λ°μ λ°λΌ κ²°κ³Όκ° λ¬λΌμ§λ κ²½μ μνμ κ°μ λ¬Έμ κ° λ°μνλ€λ©΄ μ€λ λμ μμ νμ§ μλ€. μ€λ λμ μμ νμ§ μμ μ½λλ λμμ λλ λ©ν°μ€λ λ νκ²½μμ μμ νκ² μ¬μ©ν μ μκ² λλ€.
λ©ν°μ€λ λ νκ²½μμ count λ³μλ₯Ό μ¬μ©ν μμλ₯Ό 보μ.
0μΌλ‘ μ΄κΈ°νλ count λ³μκ° μκ³ 2κ°μ μ€λ λκ° 'increment()' λ©μλλ₯Ό λμμ νΈμΆνλ μν©μ μκ°ν΄ 보μ
public class Counter{
private int count = 0;
public void increment() {
count++;
}
public int getCount() {
return count;
}
}
κ²°λ‘ λΆν° λ§νλ©΄ ν΄λΉ ν΄λμ€λ λ©λ¦¬μ€ν λ νκ²½μμ μ€λ λ μμ νμ§ μλ€. μλ₯Ό λ€μ΄, λ μ€λ λκ° λμμ 'count'κ°μ μ½μμ λ κ°μ κ°μ μ»κ³ , λ λ€ ν΄λΉ κ°μ 1 μ¦κ°μν¨λ€λ©΄, μ€μ λ‘λ 2λ§νΌ μ¦κ°ν΄μΌ λμ§λ§ countκ° 1λ§ μ¦κ°νλ μν©μ΄ λ°μν μ μλ€.
μλ°μμλ λκΈ°ν(synchronized)λ₯Ό μ¬μ©ν΄μ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
public class ThreadSafeCounter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
κ° λ©μλμ 'synchronized' ν€μλλ₯Ό μΆκ°μν€λ©΄, ν΄λΉ μμ μ μ€μ§ νλμ μ€λ λλ§ ν΄λΉ λ©μλλ₯Ό μ€νν μ μκ² λλ€. λμμ μ κ·Όν μ μλ μν©μ΄ μμ΄λμ§ μκ² λλ―λ‘ μ΄μ ν΄λΉ ν΄λμ€λ μ€λ λμ μμ νλ€κ³ ν μ μλ€.
λ€λ§ 'synchronized'λ μ±λ₯ μ νκ° λ°μν μ μκΈ° λλ¬Έμ νμν μν©μλ§ μ¬μ©νλ κ²μ΄ κΆμ₯λλ€.
λ 볡μ‘ν μν©μμλ 'ReentrantLock', 'AtomicInteger' λ±κ³Ό κ°μ λμμ± μ μ΄ λ©μ»€λμ¦μ μ¬μ©νλ λ°©λ²λ κ³ λ €ν΄ λ³Ό μ μλ€.
'synchronized'ν€μλλ λ©μλ μ 체λ νΉμ λΈλ‘μ μ μ©ν μ μκ³ , 'synchronized' λΈλ‘μ΄λ λ©μλλ₯Ό λ²μ΄λλ©΄ μλμΌλ‘ μ κΈμ΄ ν΄μ λλ€λ κ°νΈν¨μ΄ μμ§λ§, μΈλ°ν 쑰건μ λ°λΌ μ κΈμ λκΈ°νκ±°λ ν΄μ νλ κΈ°λ₯μ λ΄μ₯νκ³ μμ§ μλ€.
ReentrantLockλ lock()κ³Ό unlock() λ©μλλ₯Ό μ¬μ©νμ¬ λ μΈλ°ν μ μ΄κ° κ°λ₯νλ°, λͺ μμ μΌλ‘ 'unlock()'νΈμΆμ ν΅ν΄ μλμΌλ‘ μ κΈμ ν΄μ ν΄μ£Όμ΄μΌ νλ€. μΈλ°ν μ μ΄λ₯Ό μν΄ 'Condition' μΈμ€ν΄μ€λ₯Ό μ¬μ©νμ¬ νΉμ 쑰건μμμ λκΈ° λ° μλ¦Όμ΄ κ°λ₯νλ€. λν, μ€λ λ λκΈ° μμλ₯Ό 보μ₯, μ κΈ μλ μ λκΈ° μκ° μ€μ , μ κΈ μν κ²μ¬ λ± μΆκ°μ μΈ κΈ°λ₯λ μ 곡νλ€.
Atomic ν΄λμ€
μλ°μμ 'Atomic' ν΄λμ€λ€μ μμμ μ°μ°μ ν΅ν΄ μ€λ λ μμ μ 보μ₯νλ€.
μμμ μ°μ°(atomic)μ΄λ μ°μ°μ΄ μ€κ° λ¨κ³ μμ΄ λκΉμ§ μνλλ κ²μ μλ―Ένλ€. μ¦, μ°μ° μ€ λ€λ₯Έ μ€λ λμκ² λ°©ν΄λ°μ§ μμ μ μκ² λλ€. μλ₯Ό λ€μ΄ 'AtomicInteger'μ 'incrementAndGet()'λ©μλλ λ³μμ κ°μ μμ νκ² μ¦κ°μν€κ³ , μ¦κ°λ κ°μ λ°ννλ€.
μΆκ°μ μΌλ‘ Collection ν΄λμ€λ€μμλ thread safeν ν΄λμ€μ μ€λ λμ μμ νμ§ μμ ν΄λμ€κ° μλ€. μλ₯Ό λ€μ΄ Vectorκ° μ€λ λμ μμ (thread safe)νκ³ ArrayListκ° μ€λ λμ μμ νμ§ μλ€.
μ¦, ArrayListλ μ¬λ¬ μ€λ λκ° λμμ κ°μ λ³κ²½νλ μν©μ μ·¨μ½ν μ μλ€.
λ§μ½ ArrayListλ₯Ό μ¬λ¬ μ€λ λμμ λμμ μμ μ ν΄λ μμ νκ² λ§λ€κ³ μΆλ€λ©΄ μλμ κ°μ΄ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
List list = Collections.synchronizedList(new ArrayList(...));
Vectorλ μλ°μ μ΄κΈ° λ²μ λΆν° μ 곡λ ν΄λμ€λ‘, λ΄λΆμ λͺ¨λ μ£Όμ λ©μλλ€μ΄ μ΄λ―Έ 'synchronized'λ‘ μ μΈλμ΄ μλ€. κ·Έλ¬λ λͺ¨λ λ©μλμ 'synchronized'λ₯Ό μ¬μ©νκΈ° λλ¬Έμ, vectorλ μλμ μΌλ‘ μ€λ²ν€λκ° μ»€μ μ€λ λ κ²½ν©μ΄ μ¬ν λ©ν° μ€λ λ νκ²½μμ μ±λ₯ μ νκ° λ°μν μ μλ€.
Collections.synchronizedListλ νμν λΆλΆμλ§ λκΈ°νλ₯Ό μ μ©ν μκΈ° λλ¬Έμ, μ΄λ¬ν μ€λ²ν€λλ₯Ό μ€μΌ μ μλ€. λ°λΌμ λ³λ ¬μ²λ¦¬μ κ΄λ ¨λ μ±λ₯ μ΅μ νκ° νμν κ²½μ° λ±, νμ₯μ± μΈ‘λ©΄μμ vector μ¬μ©λ³΄λ€ λ μ 리νλ€.