Synchronized, Volatile - springscomin/be-was GitHub Wiki

Synchronized

였직 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ ν•΄λ‹Ή λΈ”λŸ­μ— μ ‘κ·Όν•  수 μžˆλ„λ‘ 보μž₯. (λͺ¨λ‹ˆν„°, 락 방식 μ‚¬μš©)

  • Race Condition을 ν”Όν•˜κΈ° μœ„ν•¨
  • Block λ˜λŠ” λ©”μ„œλ“œμ— 뢙일 수 있음.

example

// A Class used to send a message
class Sender {
    public void send(String msg) {
        System.out.println("Sending\t" + msg);
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            System.out.println("Thread  interrupted.");
        }
        System.out.println("\n" + msg + "Sent");
    }
}

class ThreadedSend extends Thread {
    private String msg;
    Sender sender;

    ThreadedSend(String m, Sender obj) {
        msg = m;
        sender = obj;
    }

    public void run() {
        // μ‹€ν–‰κ²°κ³Ό μ˜ˆμΈ‘ν•΄λ³΄κΈ°
        withSynchronized();
//        withOutSynchronized();

    }

    private void withSynchronized() {
        synchronized (sender) {
            sender.send(msg);
        }
    }

    private void withOutSynchronized() {
        sender.send(msg);
    }
}

// Driver class
class SyncDemo {
    public static void main(String args[]) {
        Sender send = new Sender();
        ThreadedSend S1 = new ThreadedSend(" Hi ", send);
        ThreadedSend S2 = new ThreadedSend(" Bye ", send);

        S1.start();
        S2.start();

        try {
            S1.join();
            S2.join();
        } catch (Exception e) {
            System.out.println("Interrupted");
        }
    }
}

Reference

Volatile

the volatile keyword is essentially lock-free and hence the most lightweight means of providing thread safety.

λ©€ν‹° μŠ€λ ˆλ“œμ—μ„œ λ™μ‹œμ— μ ‘κ·Όν•  수 μžˆλŠ” λ°μ΄ν„°μ˜ 경우 μΊμ‹œλ‘œ 인해 데이터 뢈일치 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.(μΊμ‹œ 이후 λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ 값을 λ³€κ²½ ν–ˆμ„ λ•Œ 데이터 뢈일치 λ°œμƒ)

volatile ν•„λ“œλŠ” μ‹€ν–‰ 쀑인 CPU μ½”μ–΄ μΊμ‹œμ— μΊμ‹œν•˜μ§€ μ•Šκ³ , λͺ¨λ“  읽기 μ“°κΈ° μž‘μ—…μ„ 메인 λ©”λͺ¨λ¦¬μ— 직접 μˆ˜ν–‰ν•œλ‹€.

β†’ volatile field에 μ ‘κ·Όν•˜λŠ” λͺ¨λ“  μŠ€λ ˆλ“œλŠ” λ™μΌν•œ 값을 얻을 수 μžˆλ‹€.

Reference

Cache Coherence

곡유 λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ λ‹€λ₯Έ μΊμ‹œ 곡간을 κ°–λŠ” λ©€ν‹° ν”„λ‘œμ„Έμ„œ μ‹œμŠ€ν…œμ—μ„œ, ν•˜λ‚˜μ˜ 곡유 데이터에 λŒ€ν•œ λ§Žμ€ 볡제본이 생길 수 μžˆλ‹€.

λ§Œμ•½ 데이터가 바뀐닀면, λ³΅μ œλ³Έλ“€λ„ λ°μ΄ν„°μ˜ λ³€ν™”λ₯Ό λ°˜μ˜ν•΄μ•Ό ν•œλ‹€.

β‡’ Cache CoherenceλŠ” 곡유 λ°μ΄ν„°μ˜ λ³€ν™”κ°€ λ°”λ‘œ μ „νŒŒλ  수 μžˆλ„λ‘ ν•΄μ•Όν•œλ‹€λŠ” 원칙을 μ˜λ―Έν•œλ‹€.