[Concurrency] volatile ν€μλ (Java, C#)
volatileμ Java, C# λ±μμ λμμ± μ½λλ₯Ό μμ±ν λ μ¬μ©λλ μ£Όμ ν€μλ μ€ νλλ€.
C/C++μλ volatile ν€μλκ° μμ§λ§, μ©λλ μλ¦¬κ° λ¬λΌμ μ£Όμ λμμ± κ΅¬ν μλ¨μΌλ‘ μ¬μ©λμ§ μλλ€λ κ²μ μ μνλ€. νΌλνμ§ μμμΌ νλ€.
κ·Έλ¦¬κ³ κ½€ λ§μ μ¬λλ€μ΄ μ°©κ°νλκ² μλλ°, μ΄κ±΄ μ§μ μ μΌλ‘ μ€λ λμΈμ΄νλ₯Ό μ 곡νλκ² μλλΌ μ€λ λμΈμ΄νλ₯Ό ꡬνν μ μλ 쑰건 μ€ νλλ₯Ό μ 곡νλ κ²μ΄λ€.
μ¬κΈ°μλ Javaλ₯Ό κΈ°μ€μΌλ‘ volatileμ΄ λμνλ μ리μ μ€λ λ κ° λκΈ°νλ₯Ό ꡬννλ λ°©λ²μ λ€λ€λ³Έλ€.
μ΄κ² μ νν 무μμΈκ°?
μ¬μ€ μ΄κ±΄ μ€λ λμ μ§μ μ μΈ μ°κ΄μ΄ μλ μμλ μλλ€.
ν΄λΉ λ³μμ κ°μ μ½μλ νμ "λ©λͺ¨λ¦¬(RAM)"μμ μ½μ΄μ€κ³ , μμλλ‘ μ°μ°νλλ‘ κ°μ νλ ν€μλλ€.
volatile ν€μλλ₯Ό μ¬μ©νμ§ μμΌλ©΄, μ»΄νμΌλ¬λ λ³μλ₯Ό μ½μλ μΊμμμ μ½μ΄μ¬ μ μλ ννλ‘ μ½λλ₯Ό μμ±νλ€.
https://nesoy.github.io/articles/2018-06/Java-volatile
κ·Έ μ΄μ λ λΉμ°ν λΉ λ₯΄κΈ° λλ¬Έμ΄λ€.
μ΄κ² μ€λ λ κ° λκΈ°νλ₯Ό λ§μΉλ μ£Όλ² μ€ νλλ€.
κ°μ λ³κ²½νλλΌλ κ·Έκ² μΊμμ λ°μλλ λλ μ΄ λλ¬Έμ λ€λ₯Έ μ€λ λμμ μλͺ»λ μ κ°μ μ½μ μ μκΈ° λλ¬Έμ΄λ€.
volatileμ μ΄λ¬ν μ΅μ νλ₯Ό μ κ±°νλ€.
κ²λ€κ° μ»΄νμΌλ¬λ μ΅μ ν κ³Όμ μ€μ Reorderingμ΄λΌλ κ³Όμ μ μννκ³€ νλ€.
μ½λμμ μμ±ν μ°μ° μμλ₯Ό λ©λλ‘ λ€μ§μ μ μλ€λ κ²μ΄λ€.
https://hyojun.tistory.com/entry/LeetCode-143-Reorder-List-Java
μ΄κ±°λ μ±λ₯ μ΅μ νλ₯Ό μν΄μ μνλλλ°, μ±κΈμ€λ λμμλ λ¬Έμ μμ§λ§ λ©ν°μ€λ λ νκ²½μμλ μλͺ»λ μ°μ° κ²°κ³Όλ₯Ό μ΄λν μ μλ€.
κ·Έλμ volatileμ μ΄λ° reorderingμ΄ λ°μνμ§ μλλ‘ λ°©μ§νλ€.
μ©λ
μλ¬΄νΌ μμμ μΈκΈν μ΅μ νλ€μ λ°©μ§νκΈ° λλ¬Έμ, volatileλ‘ μ μΈλ λ³μλ λ©ν°μ€λ λ 곡μ μ κ΄λ ¨ν΄μ 보μ₯μ μ’ κ°μ§ μ μλ€.
νμ μ΅μ μ κ°μ μ½μ΄μ€κ² νκΈ° λλ¬Έμ λͺ¨λ μ€λ λκ° μ΅μ κ°μ μ€μκ°μΌλ‘ μ°Έμ‘°νκ² ν μ μλ€λ κ²μ΄λ€.
κ·Έλμ volatile λ³μλ νλμ μ€λ λκ° writeλ₯Ό νκ³ , Nκ°μ μ€λ λκ° readλ₯Ό νλ μν©μμλ μμ νκ² μ¬μ©ν μ μλ€.
νμ§λ§ λμμ μ¬λ¬κ°μ threadκ° writeλ₯Ό μλν μ μλ μν©μ λν΄μλ λμνμ§ λͺ»ν¨μ μ μνλ€.
μμ : κ°μ§ Lock λ§λ€μ΄λ³΄κΈ°
μ§μ μ½λλ₯Ό μμ±ν΄μ volatileμ΄ μ΄λ»κ² λμνλμ§ μμλ³΄κ² λ€.
μλλ μλ¬΄λ° λκΈ°ν μλ¨λ μμ΄ Lockμ ꡬνν κ°λ¨ν ν΄λμ€λ€.
κ·Έλ₯ lock boolean κ° νλ κ°μ Έλ€κ° κΈ°λ€λ¦¬κ³ λ€μ΄κ°κ³ νλ κ°λ¨ν μ½λλ§ μμ±ν΄λ¨λ€.
κ·Έλ¦¬κ³ μ κ±Έ κ°μ Έλ€κ° λκΈ°ν λΉμ€λ¬΄λ¦¬νκ² νλ©΄μ 곡μ λ³μμ μ κ·Όνλ € νλ©΄
λ§€μ° λμ νλ₯ λ‘ λ°λλ½μ κ±Έλ €μ νλ‘κ·Έλ¨μ΄ μ€λ¨λ κ²μ΄λ€.
μμ μΈκΈνλ μ΄μ λ€λ‘ μΈν΄μ μ€λ λ μΊμκ° λ¨κ³ , μμκ° κΌ¬μ΄κΈ° λλ¬Έμ΄λ€.
μ΄μ volatileλ‘ λ°κΏλ³΄μ.

κ·Έλ¬λ©΄ μ΄μ μμ μ¬νμ΄ λ€λ₯Έ μ€λ λμμμ μ κ·Όμμλ λ°λ‘ λ°μλκΈ° λλ¬Έμ, λ°λλ½μ΄ λ°μνλ λ¬Έμ μ체λ ν΄κ²°μ΄ λλ€.
λ€λ§ μ΄κ±Έλ‘ μ λλ‘ λ λ½μ λ§λ€ μλ μκΈ° λλ¬Έμ ν¬κ² μλ―Έμλ μ½λλ μλκΈ΄ νλ€.
κΈ°λκ°μΈ 50000λ³΄λ€ ν¨μ¬ μμ κ°μ΄ λμ¨κ±΄, μ¬λ¬ μ€λ λκ° λμμ writeλ₯Ό νλ©΄μ λμ μ μ λ₯Ό νκΈ° λλ¬Έμ΄λ€.
μμμ μΈκΈνλ―μ΄ volatileμ 1κ°μ μ€λ λλ§μ΄ writeλ₯Ό μλν λ μ ν¨νκ² μ¬μ©ν μ μλ κΈ°λ₯μ΄λ€.
Lock κ°μ κ°λ ₯ν λμμ±μ ꡬνν λλ μ¬μ©ν μ μμ§λ§, ν μ€λ λκ° μμ μ λλΈ λ€μ κ²°κ³Όλ₯Ό λ€λ₯Έ μ€λ λμ λ°λ‘λ°λ‘ ν΅μ§ν νμκ° μμ λ μ μ©ν κΈ°λ₯μ΄λ€.
μμ μ½λ
/*
* This source file was generated by the Gradle 'init' task
*/
package app.src.main.java.org.example;
import java.util.ArrayList;
class FakeLock {
boolean locked = false;
public void lock() {
while (locked) {
// wait...
}
locked = true;
}
public void unlock() {
locked = false;
}
}
public class App {
static int sharedCounter = 0;
public static void main(String[] args) {
FakeLock lock = new FakeLock();
System.out.println("Starting threads...");
var threads = new ArrayList<Thread>();
for (int i = 0; i < 5; i++) {
var thread = new Thread(() -> {
for (int j = 0; j < 10000; j++) {
lock.lock();
sharedCounter++;
lock.unlock();
}
});
threads.add(thread);
thread.start();
}
for (var thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Counter value: " + sharedCounter);
}
}μ°Έμ‘°
https://stackoverflow.com/questions/106591/what-is-the-volatile-keyword-useful-for