[Java] λκΈ°ν - synchronizedμ volatile, Atomic Classμ λνμ¬.
0.πΆλ€μ΄κ°λ©°
μλ° μ€λ λμ λν΄ κ³΅λΆνλ€ λκΈ°ν κ΄λ ¨ κ°λ λ€μ μκ² λμκ³ μ΄ λΆλΆμ μ²μ μ νμ λ νΌλμ€λ¬μΈ μ λλ‘ ν·κ°λ Έμ΅λλ€,, κ° ν€μλμ λν΄ μ κ² κ°λ€κ°λ λ€μ 보면 ν·κ°λ¦¬λ κ·Έλ° μν©μ΄ λ°λ³΅λμμ΅λλ€.
λ§μ λ΄μ©μ κΈμ 보λ€κ° effective javaμ λμ¨ λμμ± κ΄λ ¨ μ±ν°κ° κ°μ₯ λμμ΄ λλ κ² κ°μ μ΄λ₯Ό λΆλΆμ μΌλ‘ μΈμ©νλ©° κ΄λ ¨ κ°λ λ€μ λν΄ κΈμ μ¨λ³΄λ € ν©λλ€. κ° κ°λ μ μμΈν λ΄μ©μ΄λ μ¬μ©λ²μ λν΄μλ μλ£λ€μ΄ λ§μ μ κΈμμλ λ€λ£¨μ§ μμ κ²μ΄κ³ μ κ° ν·κ°λ Έλ μΈ κ°λ κ°μ μ°¨μ΄λ₯Ό νμ© μμλ₯Ό μ¬μ©ν΄ μκ°ν΄λ³ΌκΉ ν©λλ€.
1.π«synchronized
synchronized ν€μλλ λ©μλλ λΈλ‘μ ν λ²μ ν μ€λ λλ§ μννλλ‘ λ³΄μ₯ν΄μ€λλ€. λκΈ°νμ λνμ μΈ κΈ°λ₯μΈ λ°°νμ μ€νμ΄μ£ . νμ§λ§ λκΈ°νμλ μ¬μ€ λ κ°μ§ κΈ°λ₯μ΄ μμ΅λλ€.
- λ°°νμ μ€ν(μμμ±)μ 보μ₯νλ€.
- ν μ€λ λκ° λ§λ λ³νλ₯Ό λ€λ₯Έ μ€λ λμμ νμΈν μ μκ² ν΄μ€λ€.(μ€λ λ κ° ν΅μ , κ°μμ±)
λ λ²μ§Έ κΈ°λ₯μ΄ λ―μ€μλ μμ΅λλ€. VisibilityλΌκ³ λ λΆλ¦¬λ κ°λ μΈλ° μ΄λ μ€λ λ μ¬μ΄μ μμ μ μΈ ν΅μ μ μν΄ κΌ νμν©λλ€.
μ½λλ₯Ό μ΄ν΄λ³΄λλ‘ νμ£ .
import java.util.concurrent.TimeUnit;
public class Test {
private static boolean stop;
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
int i = 0;
while(!stop)
i++;
});
t.start();
TimeUnit.SECONDS.sleep(1);
stop = true;
}
}
μ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄ 1μ΄κ° μ§λ λ€ stop = trueλ‘ λ°λμ΄ νλ‘κ·Έλ¨μ΄ μ’ λ£λ μ μμ κ² κ°μ΅λλ€.
νμ§λ§ μ€νμμΌλ³΄λ©΄ μμλλ‘ μλνμ§ μμ£ .. μμΈμ λ°λ‘ λκΈ°ν λλ¬Έμ λλ€.
stopμ λ°κΎΈλ 건 main μ€λ λμΈλ° μΈμ μ―€μμμΌ t μ€λ λκ° λ°λ stopμ visible ν μ§ λͺ¨λ¦ λλ€. μ΄μΈμλ JVMμ μ½λ μ΅μ νλ‘ μΈν΄ μκ°κ³Ό λ€λ₯΄κ² μ½λκ° λ³κ²½λ μλ μμ΅λλ€. λ°λΌμ μλμ κ°μ μ½λλ‘ λκΈ°ν μ²λ¦¬λ₯Ό ν΄μ£Όμ΄μΌ ν©λλ€.
import java.util.concurrent.TimeUnit;
public class Test {
private static boolean stop;
private static synchronized void requestStop(){
stop = true;
}
private static synchronized boolean isStop(){
return stop;
}
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
int i = 0;
while(!isStop())
i++;
});
t.start();
TimeUnit.SECONDS.sleep(1);
requestStop();
}
}
λ°λ λΆλΆμ 6 ~ 12 λΌμΈκ³Ό whileμ 쑰건문, 23 λΌμΈμ λλ€. stop νλλ₯Ό λ€λ£¨λ λ©μλλ₯Ό λκΈ°ννλ©΄ μνλ κ²°κ³Όλ₯Ό μ»μ μ μκ² λμ£ .
requestStopλ©μλμ isStopλ©μλλ μ¬μ€ λκΈ°ν μμ΄λ μμμ μΌλ‘ λμν©λλ€.
λ°λΌμ μ μμλ λκΈ°νμ κΈ°λ₯ λ λ²μ§ΈμΈ μ€λ λ κ° ν΅μ μ μν΄ λκΈ°ν μ²λ¦¬λ₯Ό ν μμλΌκ³ λ³Ό μ μμ΅λλ€.
2.π»volatile
synchronized ν€μλλ μλΉν λΉμ©μ΄ λλ μ½λμ λλ€. λͺ¨λ μ½μ΄κ° ν΄λΉ λ©λͺ¨λ¦¬λ₯Ό μΌκ΄λκ² λ°λΌλ³΄λ μ§μ°μκ°μ΄ λ©ν° μ½μ΄ νκ²½μμ κ΅μ₯ν λλΉμ λλ€. λν synchronized ν€μλλ κ°μ λ¨Έμ μ μ΅μ νλ λ°©ν΄νμ£ .
λ°λΌμ λκΈ°ν λͺ©μ μ€ μ€λ λ κ°μ ν΅μ λ§μ΄ λͺ©μ μ΄λΌλ©΄ volatile ν€μλλ₯Ό κ³ λ €ν΄λ³Ό μ μμ΅λλ€. volatile ν€μλλ₯Ό λ³μ μμ λΆμ΄κ² λλ©΄ μ½μ΄λ§λ€ μλ μΊμκ° μλ λ©λͺ¨λ¦¬μμ μ§μ μ½κ³ μλλ€. λ°λΌμ volatile ν€μλλ νμ κ°μ₯ μ΅κ·Όμ κΈ°λ‘λ κ°μ μ½κ² λ¨μ 보μ₯ν©λλ€. λ°°νμ μνκ³Όλ κ΄λ ¨μ΄ μμ§λ§ λ§μ΄μ£ .(longμ΄λ doubleμ κ²½μ° volatile ν€μλκ° μμμ±μ 보μ₯νκΈ°λ ν¨.) λν volatile ν€μλλ lock-free νκΈ° λλ¬Έμ μ±λ₯λ©΄μμλ λμ± μ’μ΅λλ€.
μμμ μκ°ν μ½λλ λ°°νμ μνκ³Όλ λ±ν κ΄λ ¨μ΄ μμΌλ volatile ν€μλλ‘ λ°κΏλ³΄κ² μ΅λλ€.
import java.util.concurrent.TimeUnit;
public class Test {
private static volatile boolean stop;
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
int i = 0;
while(!stop)
i++;
});
t.start();
TimeUnit.SECONDS.sleep(1);
stop = true;
}
}
μμ κ°μ΄ μμ ν΄μ£Όλ©΄ μνλ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
νμ§λ§ volatile ν€μλλ λ°°νμ μΈ μν, μμμ μΈ μνκ³Όλ κ±°λ¦¬κ° μ’ μμ΅λλ€. λ§μ½ lock-free νλ©΄μ μμμ μΈ μνμ νκ³ μΆλ€λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ?
3.πAtomic Class
java.util.concurrent.atomic ν¨ν€μ§μλ lock-free νλ©΄μλ thread-safe ν κΈ°λ₯μ μ§μνλ ν΄λμ€λ€μ΄ μμ΅λλ€. μ΄λ¦λΆν° μμμ±μ 보μ₯ν κ²λ§ κ°λ€μ. AtomicLong, AtomicInterger Class λ±μ΄ atomic packageμ μλ λνμ μΈ ν΄λμ€μ λλ€.
Atomic Classλ€μ μ΄λ»κ² lock-free νλ©΄μλ μμμ±μ 보μ₯ν κΉμ? κ΄λ ¨ κ°λ μΈ CAS μκ³ λ¦¬μ¦μ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
# CAS(Compare And Swap) μκ³ λ¦¬μ¦
CAS μκ³ λ¦¬μ¦μ λμ μ리λ λ€μκ³Ό κ°μ΅λλ€.
- μΈμλ‘ κΈ°μ‘΄ κ°κ³Ό λ³κ²½ν κ°μ μ λ¬νλ€.
- κΈ°μ‘΄ κ°μ΄ νμ¬ λ©λͺ¨λ¦¬κ° κ°μ§κ³ μλ κ°κ³Ό κ°λ€λ©΄ λ³κ²½ν κ°μ λ°μνλ©° trueλ₯Ό 리ν΄νλ€.
- κΈ°μ‘΄ κ°μ΄ νμ¬ λ©λͺ¨λ¦¬κ° κ°μ§κ³ μλ κ°κ³Ό λ€λ₯΄λ€λ©΄ κ°μ λ°μνμ§ μκ³ falseλ₯Ό 리ν΄νλ€.
μ λμ μ리λ₯Ό 보면 λλ μλ¬Έμ΄ μμ κ²μ λλ€. κΈ°μ‘΄ κ°κ³Ό νμ¬ λ©λͺ¨λ¦¬κ° κ°μ§κ³ μλ κ°μ΄ λ€λ₯Έ μν©μ΄ μλ?λΌκ³ μκ°ν μ μμ΅λλ€. Atomicμ λ°°νμ μΈ μ€νμ lockμ κ±°λ λ°©μμ μ¬μ©νμ¬ λ³΄μ₯νμ§ μμ΅λλ€. λ°λΌμ μ€λ λ Aκ° κ³΅μ λ³μμ λν΄ κ³μ°μ νκ³ λ©λͺ¨λ¦¬μ λ°μνλ €λλ° κ·Έ μ¬μ΄μ λ€λ₯Έ μ€λ λκ° κ³΅μ λ³μλ₯Ό λ³κ²½ν κ²½μ°κ° μμ μ μμ΅λλ€. μ΄λ μ€λ λ Aλ μμ μ κ³μ° κ°μ λ©λͺ¨λ¦¬μ λ°μνλ©΄ μ λ©λλ€. μ΅μ κ°μ΄ μλ κ±Έ κ°μ§κ³ κ³μ°ν μ μ΄ λκΈ° λλ¬Έμ΄μ£ . λ°λΌμ falseλ₯Ό λ°νν κ²½μ° λ¬΄ν 루νλ₯Ό ν΅ν΄ κ³μ°μ λ€μ μμν©λλ€.
μμ κ°μ λ°©μμΌλ‘ Atomic Typeμ λκΈ°νμ λ κ°μ§ κΈ°λ₯μ λͺ¨λ μ 곡ν΄μ€λλ€.
4.π¨λκ°λ©°
μλ°μ λκΈ°ν μ²λ¦¬μ λν΄ κ³΅λΆνλ©΄μ κ°μ₯ λμμ΄ λλ λ¬Έμ₯μ "λκΈ°νλ λ κ°μ§ κΈ°λ₯μ μ 곡νλ€."μμ΅λλ€. μ΄κ²μ΄ μ 리λμ΄μμ§ μμ μνμμ μ¬λ¬ κΈλ€μ μ΄ν΄λ³΄λ κ° λ°©μμ μ₯λ¨μ μ λ¬Όλ‘ , λ°©μλ§λ€ μ΄λ€ μ°¨μ΄κ° μκ³ μ΄λ»κ² νμ©ν΄μΌ ν μ§λ κ°μ΄ μ μ μμ΅λλ€.
ν΄λΉ λ¬Έμ₯μ μ μ΄ν΄λ³΄μκ³ λκΈ°ν μ²λ¦¬ λ°©μμ λν΄ μ’ λ μμ보μ λ€λ©΄ λμμ΄ λμ€ κ² κ°μ΅λλ€.
λν μλ°μ λμμ± μ²λ¦¬λ κΉμ΄ λ€μ΄κ°λ©΄ λμμ΄ κ³΅λΆν΄μΌ ν κ² κ°λ€λ μκ°μ νμ΅λλ€. λμμ± μ²λ¦¬νλ λ°©μλ λ€μνλ©° μ£Όμν΄μΌ ν μ , λ€μν λμμ± μ νΈλ¦¬ν° λ± λ°©λν λ΄μ©μ΄ μμ΄ μΆν νμνλ€κ³ μκ°μ΄ λ€ λ κΉμ΄ 곡λΆν΄λ³΄κ³ λ€μ μ 리ν΄λ³΄λλ‘ νκ² μ΅λλ€.