item 84 hyowon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
νλ‘κ·Έλ¨μ λμμ μ€λ λ μ€μΌμ€λ¬μ κΈ°λμ§ λ§λΌ
μ°Έκ³ ) Javaμμ λ€μ€μμ μ μ²λ¦¬νκΈ° μν λ°©λ²λ€
(- Executor Framework
- μΉ΄μ΄νΈλ€μ΄λμΉ(CountDownLatch) & μ¬μ΄ν΄λ¦λ°°λ¦¬μ΄(CyclicBarrier)
- ForkJoin νλ μμ
μμ
μ΄ λΆλ¦¬λμ§ μλ κ²½μ° : βExecutorβ
β κ°μ₯ λ§μ΄ μ¬μ©νλ νν
μμ
μ΄ λΆλ¦¬λλ κ²½μ° : βμΉ΄μ΄νΈλ€μ΄λμΉβ or βν¬ν¬μ‘°μΈβ
β λ§μ μμ λ°μ΄ν° μ λ ¬, μ΅λ, μ΅μκ° μ°Ύλ κ²½μ°, λ§μ μμ λ°μ΄ν°λ₯Ό ν©μ°νλ κ²½μ°, λ€νΈμμ μ€μΊνλ κ²½μ° λ±
μμ μ΄ λΆλ¦¬λ μλ μκ³ μλ μλ μλ λ¨κ³κ° μλ μμ : βμ¬μ΄ν΄λ¦λ°°λ¦¬μ΄β
JVMλ§λ€ λ€λ₯Έ μ€λ λ μ€μΌμ₯΄λ§ μ μ±
μ€λ λ μ€μΌμ₯΄λ§ μ μ± μ μ΄μ체μ λ§λ€ λ€λ₯Ό μ μμ΄ μ΄λ€ JVMμμλ μλκ° λ λΉ¨λΌμ§ μλ, μ΄λ€ JVMμμλ ν¨κ³Όκ° μμ μλ, μ΄λ€ JVMμμλ λ λλ €μ§ μλ μλ€.
κ·Έλ¬λ νΉμ μ€λ λκ° λ€λ₯Έ μ€λ λλ€κ³Ό λΉκ΅ν΄ CPU μκ°μ μΆ©λΆν μ»μ§ λͺ»ν΄ κ°μ ν λμκ°λ νλ‘κ·Έλ¨μ 보λλΌλ Thread.yield() (λ€λ₯Έ μ€λ λμκ² μ€νμνλ₯Ό μ보νκ³ μμ μ μ€λΉμνκ° λλ€.)λ₯Ό μ¬μ©ν΄ λ¬Έμ λ₯Ό κ³ μ³λ³΄λ €λ μ νΉμ λ¨μ³λ΄μ.
κ²°λ‘ μ μΌλ‘, μ νμ±μ΄λ μ±λ₯μ΄ μ€λ λ μ€μΌμ₯΄λ¬μ μν μ λ¬λ¦° νλ‘κ·Έλ¨μ΄λΌλ©΄ λ€λ₯Έ νλ«νΌμ μ΄μνκΈ° μ΄λ ΅λ€.
κ²¬κ³ νκ³ λΉ λ¦Ώνκ³ μ΄μμ± μ’μ νλ‘κ·Έλ¨μ μμ±νλ κ°μ₯ μ’μ λ°©λ²
- μ€ν κ°λ₯ν μ€λ λμ νκ· μ μΈ μλ₯Ό νλ‘μΈμ μλ³΄λ€ μ§λμΉκ² λ§μμ§μ§ μλλ‘ νλ€.
- μ€ν μ€λΉκ° λ μ€λ λλ€μ 맑μ μμ μ μλ£ν λκΉμ§ κ³μ μ€νλλλ‘ λ§λ€μ. (κ·ΈλμΌ μ€λ λ μ€μΌμ€λ¬κ° κ³ λ―Όν κ±°λ¦¬κ° μ€μ΄λ λ€.)
μ¬κΈ°μ μ€ν κ°λ₯ν μ€λ λμ μμ μ 체 μ€λ λ μλ₯Ό ꡬλΆνμλ©΄
μ 체 μ€λ λ μ β₯ μ€ν κ°λ₯ν μ€λ λ μ
μ€ν κ°λ₯ν μ€λ λ β λκΈ° μ€μΈ μ€λ λ
μ€ν κ°λ₯ν μ€λ λ μλ₯Ό μ κ² μ μ§νλ κΈ°λ²
- κ° μ€λ λκ° μμ μ μλ£ν νμλ λ€μ μΌκ±°λ¦¬κ° μκΈΈ λκΉμ§ λκΈ°νλλ‘ νλ€.
- μ€λ λλ λΉμ₯ μ²λ¦¬ν΄μΌ ν μμ μ΄ μλ€λ©΄ μ€νλΌμλ μ λλ€. μ€νμ(Executor) νλ μμν¬λ₯Ό μλ‘ λ€λ©΄, μ€λ λ ν ν¬κΈ°λ₯Ό μ μ ν μ€μ νκ³ μμ μ μ§§κ² μ μ§νλ€. λ¨, λ무 짧μΌλ©΄ μμ μ λΆλ°°νλ λΆλ΄μ΄ μ€νλ € μ±λ₯μ λ¨μ΄λ¨λ¦΄ μλ μλ€.
- μ€λ λλ μ λ λ°μ λκΈ°(busy waiting) μνκ° λμ΄μ μλλ€.
- CountDownLatchλ? (https://dev.re.kr/52)
public class SlowCountDownLatch extends Thread {
private int count;
public SlowCountDownLatch(int count) {
if (count < 0)
throw new IllegalArgumentException(count + "< 0 ");
this.count = count;
}
public void await() {
// !!!!!!!!!!!!!!!!!!!!!!!!!
while (true) {
synchronized (this) {
if (count == 0)
return;
}
}
// !!!!!!!!!!!!!!!!!!!!!!!!!
}
public synchronized void countDown() {
if (count != 0)
count--;
}
}