Arthur's Blog
λμμ± λ¬Έμ λ₯Ό μ μ΄νλ λ°©λ² λ³Έλ¬Έ
π μ μ
λ©ν° μ€λ λ νκ²½μμ μ¬λ¬ μ€λ λκ° λμμ νλμ μμμ 곡μ ν λ λμμ± λ¬Έμ , λ°λλ½ λ± μ¬λ¬ λ¬Έμ κ° λ°μνλ€. ν΄λΉ λ¬Έμ μ€ λμμ± λ¬Έμ λ₯Ό μ μ΄νλ λ°©λ²μ μμ보μ.
1οΈβ£ μμμ μ κΈ
νλμ μ€λ λκ° ν΄λΉ λ©μλλ₯Ό μ€ννκ³ μμ λ λ€λ₯Έ μ€λ λκ° ν΄λΉ λ©μλλ₯Ό μ€ννμ§ λͺ»νκ³ λκΈ°νκ² νλ λ°©λ². μ κΈμ λ©μλ, λ³μμ κ° κ° κ±Έ μ μλ€.
π μμ
class Count {
private int count;
public synchronized int view() {
return count++;
}
}
μμ μμ λ λ©μλ μ κΈμ΄λ€.
class Count {
private Integer count;
public int view() {
synchronized (this.count) {
return count++;
}
}
}β
2οΈβ£ λͺ μμ μ κΈ
synchronized ν€μλ μμ΄ λͺ μμ μΌλ‘ ReentrantLockμ μ¬μ©νλ μ κΈ.
μ΄μ체μ μμ μκ³μμκ³Ό λΉμ·ν λλμ΄λ€.
π μμ
public class CountingTest {
public static void main(string[] args) {
Count count = new Count();
for (int i = 0; i < 100; i++) {
new Thread() {
public void run() {
for(int j = 0; j < 1000; j++) {
count.getLock().lock();
System.out.println(count.view());
count.getLock().unlock();
}
}
}.start();
}
}
}
class Count {
private int count = 0;
private Lock lock = new ReentrantLock();
public int view() {
return count++;
}
public Lock getLock() {
return lock;
}
}
3οΈβ£ volatile
μ€λ λλ€μ΄ μμμ read, writeλ₯Ό μ§νν λ νμ λ©λͺ¨λ¦¬μ μ κ·Όνμ§ μλλ€. μ±λ₯μ ν₯μμ μν΄ CPU μΊμ€μ κ°μ μ μ₯νκΈ° λλ¬Έμ ν΄λΉ κ°μ΄ λ©λͺ¨λ¦¬μ μ μ₯λ μ€μ κ°κ³ νμ μΌμΉνλμ§ λ³΄μ₯ν μ μλ€.
λ©μΈ λ©λͺ¨λ¦¬μ μ μ₯λ μ€μ μμμ κ°μ λ³Ό μ μλ κ°λ μ μμμ κ°μμ±μ΄λΌκ³ λΆλ₯Έλ€.
volatileμ μμ κ°μ CPU μΊμ μ¬μ©μ λ§λλ€. λ³μμ volatile ν€μλλ₯Ό λΆμ¬μ£Όλ©΄ ν΄λΉ λ³μλ μΊμμ μ μ₯λλ λμμμ μ μΈλλ€. μΊμ μ¬μ©μΌλ‘ μΈν ν μ΄ν° λΆμΌμΉλ₯Ό λ§λλ€.
4οΈβ£ Concurrent
Atomic~~μ κ°μ ν΄λμ€λ λ¨μν μ¦κ°μ°μ°μ λ©μλλ‘ μ 곡ν΄μ€λ€. ν΄λΉ ν΄λμ€μ λ©μλλ λ΄λΆμ μΌλ‘ Thread-safeνκ² κ΅¬μ‘°νλμ΄ μλ€.
Concurrent~~μ κ°μ 컬λμ λ€μ λ½μ μ¬μ©ν λ λ°μνλ μ±λ₯ μ νλ₯Ό μ΅μνμΌλ‘ λ§λ€μ΄λμλ€.
'Language > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
JUnit ν μ€νΈλ Threadλ₯Ό μ¬μ¬μ©νλ€. (1) | 2024.06.06 |
---|---|
Randomκ³Ό SecureRandom μ°¨μ΄ (0) | 2023.06.29 |
μμμμ @Builder μ¬μ©νκΈ° (0) | 2023.06.26 |