곡μ λλ λ³λ κ°λ₯ν μνλ λμμ±μ΄ κ°μ λ λ λ¬Έμ λ₯Ό μ΄λν μ μλ€. λ³κ²½ κ°λ₯ν 곡μ κ°μ²΄μ λν μμΈμ€κ° μ λλ‘ κ΄λ¦¬λμ§ μμΌλ©΄ μμ© νλ‘κ·Έλ¨μμ λμμ± μ€λ₯κ° λ°μν μ μλ€. μ€λμ λμμ± λ¬Έμ μ λμ μμΈμ€λ₯Ό μ²λ¦¬νκΈ° μν Atomic λ³μλ₯Ό 곡λΆν΄λ³΄κ² λ€.
νμ€ μΈκ³μ μΌμ λμμ± λ¬Έμ μ λΉλμ΄ ννν΄λ³΄μ. ν΅μ₯μ΄ νλ μκ³ λ μ¬λμ΄ 1000μμ© μ κΈμ νλ€κ³ κ°μ ν΄λ³΄μ.
ν΅μ₯μλ 1000μμ΄ μ΄λ―Έ λ€μ΄μμκ³ μ¬λ 2λͺ μ΄ κ°κ° 1000μμ© μ κΈμ νλ€. λΉμ°ν ν΅μ₯μ μμ‘μ 3000μμ΄ λλ€κ³ μκ°λλ€. νμ§λ§ κ·Έλ μ§ μμ μλ μλ€.
μ¬μ€ λνκΈ° μ°μ°μ μ»΄ν¨ν°μμ λ΄λΆμ μΌλ‘ κ°μ μ½κ³ μ¦κ°μν€κ³ λ€μ μ λ°μ΄νΈμ κ³Όμ μ΄λ€. μμ°¨μ μΌλ‘ μ¬λ1μ΄ 1000μμ μ κΈνκ³ λ€μμ μ¬λ2κ° μ κΈμ νλ©΄ κΈ°λνλλ‘ 3000μμ΄ μ μ₯λ κ²μ΄λ€. κ·Έλ°λ° μ¬λ1κ³Ό μ¬λ2κ° λμμ ν΅μ₯μ μ κ·Όν μλ μλ€. κ·Έλ κ² λλ©΄ λλ€ κΈ°μ‘΄ μμ‘μΈ 1000μμ μ½μ κ²μ΄κ³ λ μ¬λ λͺ¨λ ν΅μ₯μ 2000μμ μ°κ² λμ΄ μλͺ»λ κΈμ‘μ΄ ν΅μ₯μ λ€μ΄κ°λ κ²μ΄λ€.
μΆκΈμ ν λλ λ§μ°¬κ°μ§λ€. ν΅μ₯μ 1000μμ΄ μλλ° μ¬λ1μ΄ 1000μ μΆκ·Όνλ©΄ ν΅μ₯μ λ¨μ μμ‘μ 0μμ΄ λλ€. κ·Έ λ€μ μ¬λ2κ° 1000μμ μΆκΈνλ €κ³ νλ©΄ ν΅μ₯μ λμ΄μ λ¨μ μμ‘μ΄ μκΈ° λλ¬Έμ μΆκΈμ ν μ μλ€. κ·Έλ°λ° λ μ¬λμ΄ λμμ ν΅μ₯μ μ κ·Όνλ€λ©΄ λ μ¬λ λͺ¨λ λ¨μ μμ‘μ΄ 1000μμΈ κ²μ νμΈνκ³ κ°μ 1000μμ μΆκΈμ ν μ μλ μλͺ»λ μν©μ΄ μΌμ΄λκ² λλ€.
μ½λλ‘ κ΅¬νμ ν΄λ³΄μλ€. Bank ν΄λμ€μλ μμ‘μ νμνλ balance λ³μκ° μλ€. κ·Έλ¦¬κ³ increment λ©μλλ ν΅μ₯μ κΈ°μ‘΄ μμ‘μ 1000μμ λν΄μ£Όλ μ κΈ μν λ©μλμ΄λ€.
public class Bank {
private int balance; // μμ‘
public int increment() {
return balance += 1000;
}
public int getBalance() {
return balance;
}
}
μ€λ λ 2κ°λ₯Ό μμ±νκ³ κ°κ° Bankμ increment λ©μλλ₯Ό 100λ² μ€ννμ¬ 1000μμ 100λ² μ κΈνλλ‘ ν μ€νΈνλ€. 1000μμ 100λ² μ κΈνλ©΄ 10λ§μμ΄κ³ , μ€λ λκ° 2κ°κ° κ°κ° 100λ² μ κΈνλ―λ‘ ν΅μ₯μ μμΈ μ΅μ’ μμ‘μ 20λ§μμΌλ‘ μμμ΄ λ κ²μ΄λ€. κ·Έλ₯ forλ¬Έλ§ λ리면 μκ°λ³΄λ€ κ±°μ μ¬λ°λ₯Έ κ°λ§ λμμ Thread.sleep(100)μ μ€κ°μ λ£μ΄λ΄€λ€.
public class Test01 {
public static void main(String[] args) throws InterruptedException {
Bank bank = new Bank();
int threadCount = 2;
CountDownLatch latch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
new Thread(() -> {
for (int j = 1; j <= 100; j++) {
System.out.println(Thread.currentThread().getName() + " " + bank.increment() +"μ");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
latch.countDown();
}).start();
}
latch.await();
System.out.println("total = " + bank.getBalance());
}
}
κ²°κ³Όλ λ§€λ² λ¬λμ§λ§ 20λ§μκ³Ό μ€μ°¨κ° ν΄λλ μλμ κ°μ΄ 172000μμ΄ λμ€κΈ°λ νλ€.
Thread-0 164000μ
Thread-1 165000μ
Thread-1 166000μ
Thread-0 166000μ
Thread-0 168000μ
Thread-1 167000μ
Thread-0 169000μ
Thread-1 170000μ
Thread-0 171000μ
Thread-1 172000μ
total = 172000
μ΄μ κ°μ΄ λ μ€λ λκ° κ°μ κ°μ λμμ μ κ·Όνλ κ²½μ°κ° λ°μνλ€.