Intro
๋ฉํฐ์ค๋ ๋ฉ์ ์ค์ํ๋ค. ํ ํ๋ก์ธ์ค ๋ด์์ ์ฌ๋ฌ ์์ ์ ๋์์ ์คํํด์ ์์คํ ์์์ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์๊ณ , ์ฒ๋ฆฌ ์ฑ๋ฅ๊ณผ ์๋ต์ฑ์ ํฅ์์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ, ๋ฐ์ดํฐ์ ๊ฐ๋ณ์ฑ(Mutability)์ ์ค์ํ๋ค. ํ๋ก๊ทธ๋จ์ด ๋์ํ๋ฉด์ ์ํฉ์ ๋ฐ๋ผ ์ํ๊ฐ ๋ณํํ๋๊ฒ ์ผ๋ฐ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง! ๋ฉํฐ์ค๋ ๋ฉ ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋๋ฅผ ์๊ฐํด๋ณด์.
๋ง์ฝ ์ด๋ค ๋ณ์ a์ ๊ฐ์ Thread-1, Thread-2๊ฐ ๋์์ ๋ณ๊ฒฝํ๋ค๋ฉด?
์๋ก ๋ค๋ฅธ ์์ ์ ์ฝ์ด์ ๋ณ๊ฒฝํ๊ณ ์ผ๋๋ฐ, ๊ทธ ๊ฐ์ด ๋ฎ์ด์ฐ์ฌ์ง๋ค๋ฉด?
๋ฏฟ์ ์ ์๋ ๋ฐ์ดํฐ๋ฐ์ ๋จ์ง ์๊ฒ ๋๊ฒ ์ง....
๊ทธ๋ผ ์ด์ ์ค๋ ๋ ์์ ์ฑ(Thread safety)์ด๋ผ๋ ์ฉ์ด์ ์๋ฏธ๋ถํฐ ์์๋ณด์.
์ด ๋ง์ "์ค๋ ๋๊ฐ ์์ ํ๋ค" ๋ผ๋ ๋ป์ด ์๋๋ผ, "์ค๋ ๋์ ๋์์ผ๋ก๋ถํฐ ํ๋ก๊ทธ๋จ์ด ์์ ํ๋ค"๋ผ๋ ๋ป์ด๋ค.
ํ์ด์ ์ค๋ช ํ์๋ฉด, ๋ฉํฐ์ค๋ ๋ ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์์ ๋์ํ๋ ํ๋ก๊ทธ๋จ์ด ์๊ธฐ์น ๋ชปํ ๋์์ด๋ ๊ฒฝ์ ์กฐ๊ฑด, ๋ฐ์ดํฐ ์์ ์์ด ์ ์์ ์ผ๋ก ์์ ์ด ์งํ๋๊ณ ์์ ๋ Thread-safe ํ๋ค ๋ผ๊ณ ํํํ๋ค.
์ง๊ธ๋ถํฐ, Java ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ์ค์ผ๋ก ์ด๋ป๊ฒ ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ ์ ์๋์ง์ ๋ํด ์ต๋ํ ๊น๊ณ ์์ธํ ์์๋ณด๋ ค๊ณ ํ๋ค.
โ๊ฒฝ์ ์กฐ๊ฑด์ด๋?
2๊ฐ ์ด์์ ํ๋ก์ธ์ค๋ ์ค๋ ๋๊ฐ ๊ณต์ ์์(๋ณ์, ๋ฉ๋ชจ๋ฆฌ ๋ฑ)์ ๋์์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋, ์ ๊ทผํ๋ ์์์ ๋ฐ๋ผ ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ์ํฉ์ ๋งํ๋ค.
์ด๋ฌํ ์ํฉ์ด ๋ฐ์ํ๋ฉด ์์ธกํ ์ ์๋, ์๋ชป๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ํ์ด ์์ด ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ํตํด ํด๊ฒฐํด์ผ ํ๋ค.
๐ ์์ธํ ๋ด์ฉ์ ์ง๋ ํฌ์คํ ์ฐธ๊ณ
์ค๋ ๋ ์์ ์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
ํ๋ก๊ทธ๋จ์ ๊ท๋ชจ๊ฐ ์ปค์ง ์๋ก ํน์ ๋ณ์๊ฐ ์ฌ๋ฌ ์ค๋ ๋์์ ์ ๊ทผ๋๊ณ ์๋์ง ํ์ ํ๋ ๊ฒ์กฐ์ฐจ ๊ฐ๋จํ์ง ์์ ์ ์๋ค.
๋ค๋ฆ๊ฒ ๊ณ ์น๊ธฐ๋ ์ฝ์ง ์์ผ๋ ... ๋ฐ๋ผ์ ์ด๊ธฐ ์ค๊ณ ์์ ๋ถํฐ ์์์ ์ผ๋ก ์ค๋ ๋ ์์ ํ๊ฒ ์ค๊ณํ๋ ๊ฒ์ด ์ ๋ง ์ค์ํ๋ค!
์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด์๋, ๊ฒฝ์ ์กฐ๊ฑด์ด ๋ฐ์ํ๋ฉด ์๋๋ค.
๊ฒฝ์ ์กฐ๊ฑด์ ํผํ๋ ๋ฐฉ๋ฒ์ ๊ด์ ์ ๋ฐ๋ผ ๋ ๊ฐ์ง๋ก ๋๋ ๋ณผ ์ ์๋ค.
1. ๊ณต์ ์ํ ํผํ๊ธฐ
์ผ๋จ ๊ณต์ ์ํ๋ฅผ ํผํ ์ ์๋ค๋ฉด ์ต๋ํ ํผํ์๋ ๊ฒ์ด๋ค.
์ค๋ ๋ ๊ฐ์ ๊ณต์ ๋๋ ์์์ ์ต์ํํ๊ณ , ์ ๋ง ํ์ํ ๊ฒฝ์ฐ์๋ง ๋๊ธฐํ๋ฅผ ์ ์ฉํด์ผ ํ๋ค.
๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ๋ฐฉ๋ฒ๋ค์ด ์๋์ง ์์๋ณด์.
1) ์ํ ์ ๋ณด๋ฅผ ์ ์ ๋ณ์ ๋์ ์ง์ญ ๋ณ์์ ์ ์ฅํ๋ค.
์ค๋ ๋๋ ๊ฐ๊ฐ ๋ณ๋์ ์คํ ์์ญ์ ๊ฐ์ง๋ฉฐ, ์ง์ญ ๋ณ์๋ ์ด ๊ณต๊ฐ์ ์ ์ฅ๋๋ค.
๋ฐ๋ผ์, ์ง์ญ ๋ณ์๋ก ์ ์ธ๋ ๊ฒฝ์ฐ ํด๋น ๋ณ์๋ ์ค๋ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ธ ๋ณต์ฌ๋ณธ์ ๊ฐ์ง๊ฒ ๋์ด ์ค๋ ๋ ๊ฐ์ ๊ณต์ ๋์ง ์๋๋ค. ์ด์ ๋ฐ๋ผ ๊ฒฝ์ ์กฐ๊ฑด์ด ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก ์ค๋ ๋ ์์ ์ด ์์ฐ์ค๋ฝ๊ฒ ํ๋ณด๋๋ค.
2) ThreadLocal ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
ThreadLocal์ ๊ฐ ์ค๋ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ธ ๋ณ์๋ฅผ ์ ์ฅ·๊ด๋ฆฌํ ์ ์๋๋ก ์๋ฐ์์ ์ ๊ณตํ๋ ํด๋์ค์ด๋ค. ์ผ๋ฐ ์ง์ญ ๋ณ์๋ ์ ์ธ๋ ์ค์ฝํ๋ฅผ ๋ฒ์ด๋๋ฉด ํ์ฉํ ์ ์์ง๋ง, ThreadLocal์ ์ฌ์ฉํ๋ฉด ํน์ ์ค๋ ๋๊ฐ ์คํํ๋ ๋ชจ๋ ์ฝ๋ ๋ฒ์์์ ๋์ผํ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
Thread ๋ด๋ถ์๋ ๊ฐ ์ค๋ ๋๋ณ๋ก ํ๋์ฉ ThreadLocalMap ์ธ์คํด์ค๊ฐ ์กด์ฌํ๋ค. ์ด ThreadLocalMap์ ํด๋น ์ค๋ ๋์ ์ ์ฅ์ ์ญํ ์ ํ๋ฉฐ, ์ฌ๊ธฐ์์ ThreadLocal ๊ฐ์ฒด๊ฐ ํค(key)๋ก ์ฌ์ฉ๋๊ณ , ๊ทธ์ ๋์ํ๋ ๊ฐ์ด ์ ์ฅ๋๋ค.
์ฆ, ์ฌ๋ฌ ์ค๋ ๋๊ฐ ํ๋์ ThreadLocal ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋๋ผ๋, ์ค์ ์ ์ฅ๋๋ ๊ฐ์ ๊ฐ ์ค๋ ๋ ๊ฐ์ ๋ณ๋๋ก ๋ถ๋ฆฌ๋์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฒ์ด๋ค. ์ด๋ฐ ๊ตฌ์กฐ ๋๋ถ์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ๋๊ธฐํ ์์ด ์์ ํ๊ฒ ๊ฐ ์ค๋ ๋๋ง์ ๋ ๋ฆฝ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ค.
3) Immutable objct๋ฅผ ํ์ฉํ๋ค.
mutable์ '๋ณ๊ฒฝ๋ ์ ์๋'์ด๋ผ๋ ๋ป์ด๊ณ , ๋ฐ๋๋ก Immutability๋ '๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ์ฑ'์ ์๋ฏธํ๋ค.
๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ๋ถ๋ณ ๊ฐ์ฒด(Immutable Object)๋ ๋๊ธฐํ ์์ด๋ ์์ ํ๊ฒ ๊ณต์ ํ ์ ์์ด ์ค๋ ๋ ์์ ์ ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ฅํ๋ค.
Java์์๋ ์์ฑ ์ดํ ๋ณ๊ฒฝ๋ ํ์๊ฐ ์๋ ๋ณ์์ final ํค์๋๋ฅผ ๋ถ์ฌ ๋ณ๊ฒฝ์ ๊ธ์งํ๋ค. final ํ๋๋ก ์ ์ธ๋ ๋ณ์๋ ์ด๊ธฐํ ์ดํ ๊ฐ์ ๋ฐ๊ฟ ์ ์์ผ๋ฉฐ, ์ด๋ก ์ธํด ๊ฐ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํด๋ ์์ ํ๋ค.
Java์ String, ๋ํผ ํด๋์ค ๋ฑ์ด ์ข์ ์์์ด๋ค.
2. ๊ณต์ ์ํ๋ฅผ ํผํ ์ ์๋ ๊ฒฝ์ฐ, ๋๊ธฐํ ๋ฉ์ปค๋์ฆ ํ์ฉํ๊ธฐ
ํ์ง๋ง ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์๋ ๊ณต์ ์ํ๊ฐ ๋ถ๊ฐํผํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด ๊ฒฝ์ฐ์ ์ ์ฉํ ์ ์๋ ์ค๋ ๋ ์์ ๋ณด์ฅ์ ์ํ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฒ๋ค์ ์์๋ณด์.
1) ์์์ ์ฐ์ฐ(Atomic operations)
์ด ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ค๋จํ ์ ์๋ ์์์ ์ธ ์ฐ์ฐ์ ํตํด์๋ง ๊ณต์ ์์์ ์ก์ธ์คํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค.
์ฐ์ฐ ์์ฒด๊ฐ ์์์ ์ผ๋ก ์ํ๋๋ฏ๋ก, ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ธ์ ์ด๋ป๊ฒ ์ก์ธ์คํ๋์ง์ ์๊ด์์ด ๊ณต์ ๋ฐ์ดํฐ๊ฐ ํญ์ ์ ํจํ ์ํ๋ก ์ ์ง๋ ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ์์์ ์ฐ์ฐ์ ๋ง์ ์ค๋ ๋ Lock ๋ฉ์ปค๋์ฆ์ ๊ธฐ๋ณธ ์๋ฆฌ์ด๋ค.
Atomic ํด๋์ค ํ์ฉ
Java๋ java.util.concurrent.atomic ํจํค์ง์์ ๋ค์ํ Atomic ํด๋์ค๋ค์ ์ ๊ณตํ๋ค.
๋ํ์ ์ผ๋ก AtomicInteger, AtomicLong, AtomicBoolean, AtomicReference ๋ฑ์ด ์๋ค.
์ด๋ค์ ๋ด๋ถ์ ์ผ๋ก ํ๋์จ์ด ์์ค์ ์์์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฝ ์์ด ์์ ํ ์ฐ์ฐ์ ๋ณด์ฅํ๋ค.
์ฃผ์ ๋ฉ์๋:
get(): ํ์ฌ ๊ฐ์ ๋ฐํ
set(newValue): ๊ฐ์ ์ค์
getAndIncrement(), incrementAndGet(): ๊ฐ์ ์์์ ์ผ๋ก 1 ์ฆ๊ฐ
compareAndSet(expectedValue, newValue): ๊ธฐ๋๊ฐ๊ณผ ์ค์ ๊ฐ์ด ์ผ์นํ๋ฉด ์ ๊ฐ์ผ๋ก ์์์ ๊ต์ฒด
์ฌ์ฉ ์์:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicExample {
private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
public int getCounter() {
return counter.get();
}
}
2) ์ํธ ๋ฐฐ์ (Mutual exclution) ๋ฐ synchronized ํค์๋ ํ์ฉ
์ด ๋ฐฉ๋ฒ์ ๊ณต์ ์์์ ๋ํ ์ก์ธ์ค๋ฅผ ํญ์ ํ๋์ ์ค๋ ๋๋ง ๊ฐ๋ฅํ๋๋ก ํ๋ ๋งค์ปค๋์ฆ์ด๋ค.
ํญ์ ํ๋์ ์ค๋ ๋๋ง ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ์ ์๊ฒ ํ๋ค๋ ๊ฒ์ด๋ค.
์ด ๋งค์ปค๋์ฆ์ ๋ถ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ฉด, deadlocks, livelocks, resource starvation๊ณผ ๊ฐ์ ๋ถ์์ฉ์ด ์์ ์ ์๋ค.
์๋ฐ์์๋ synchronized ํค์๋๋ฅผ ํ์ฉํ์ฌ ์๊ณ์์ญ์ ๋ณดํธํ ์ ์๋ค.
์ด๋ ํ ์์ ์ ํ๋์ ์ค๋ ๋๋ง ๊ณต์ ์์์ ์ ๊ทผํ๋๋ก ๋ณด์ฅํ์ฌ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๋ค.
๋ฉ์๋๋ ์ฝ๋ ๋ธ๋ก์ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ฝ์ด ๊ฑธ๋ฆฐ ๋์ ๋ค๋ฅธ ์ค๋ ๋๋ ๋๊ธฐํ๊ฒ ๋๋ค.
๋ค์ ์์ ๋ฉ์๋ inc()๋ synchronized ํค์๋ ๋๋ถ์, thread safeํ๊ฒ ๋์ํ๋ค.
class Counter {
private int i = 0;
public synchronized void inc() {
i++;
}
}
โ๊ต์ฐฉ ์ํ(DeadLock)๋?
๊ต์ฐฉ ์ํ๋ ๋ ์ด์์ ์ค๋ ๋๊ฐ ์๋ก ์๋๋ฐฉ์ด ์ ์ ํ ์์์ ํด์ ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ผ ๋ฌดํํ ๋๊ธฐํ๋ฉฐ ์์ ์ ์งํํ์ง ๋ชปํ๋ ์ํ๋ฅผ ์๋ฏธํ๋ค.
์ฆ, ์ค๋ ๋ A๋ ์์ 1์ ์ ์ ํ ์ฑ ์์ 2๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๊ณ , ๋์์ ์ค๋ ๋ B๋ ์์ 2๋ฅผ ์ ์ ํ ์ฑ ์์ 1์ ๊ธฐ๋ค๋ฆฌ๋ ์ํฉ์ฒ๋ผ ์๋ก๊ฐ ์๋ก์ ์์์ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ์์ํ ๋๊ธฐ ์ํ์ ๋น ์ง๋ ํ์์ด๋ค.
๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๋ ค๋ฉด ๋ค์ ๋ค ๊ฐ์ง ์กฐ๊ฑด์ด ๋ชจ๋ ์ฑ๋ฆฝํด์ผ ํ๋ค๊ณ ์๋ ค์ ธ ์๋ค:
1. ์ํธ ๋ฐฐ์ (Mutual Exclusion): ์์์ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์ฌ์ฉํ ์ ์๋ค.
2. ์ ์ ์ ๋๊ธฐ(Hold and Wait): ์์์ ์ ์ ํ ์ํ์์ ์ถ๊ฐ ์์์ ๊ธฐ๋ค๋ฆฐ๋ค.
3. ๋น์ ์ (No Preemption): ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ ์ ํ ์์์ ๊ฐ์ ๋ก ๋นผ์์ ์ ์๋ค.
4. ์ํ ๋๊ธฐ(Circular Wait): ์ค๋ ๋ ์งํฉ ๋ด์์ ์๋ก๊ฐ ์ ์ ํ ์์์ ์ํ ํํ๋ก ๊ธฐ๋ค๋ฆฐ๋ค.
๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๋ฉด ๊ด๋ จ ์ค๋ ๋๋ค์ด ๋ฌดํ ๋๊ธฐ ์ํ์ ๋น ์ ธ ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ๊ฑฐ๋ ์๋ตํ์ง ์๋ ๋ฑ์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
โLiveLock์ด๋?
โStarvation์ด๋?
3) Lock ํ์ฉ
๋ ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํ ๋๋ java.util.concurrent.locks ํจํค์ง์ ReentrantLock ๊ฐ์ ๋ฝ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
๋ฝ ํ๋๊ณผ ํด์ ๋ฅผ ๋ช ์์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ด, ์กฐ๊ฑด๋ถ ๋ฝ์ด๋ ํ์์์ ๋ฝ ๊ตฌํ์ ์ฉ์ดํ๋ค.
๋ฝ ๋ฉ์ปค๋์ฆ ๊ด๋ จํ ์ธ๋ถ ๋ด์ฉ์ ๊ธฐ์กด ํฌ์คํ ์ ์ฐธ๊ณ ํ์.
4) ๋์์ฑ ๋ฌธ์ ๊ฐ ์๋ ์๋ฃ๊ตฌ์กฐ ํ์ฉ
java.util.concurrent ํจํค์ง์ ์กด์ฌํ๋ ์๋ฃ๊ตฌ์กฐ๋ค์ด๋ค.
๋ํ์ ์ผ๋ก ConcurrentHashMap, BlockingQueue ๋ฑ์ด ์๋ค.
์ถ๊ฐ ๋ด์ฉ
volatile ํค์๋ ํ์ฉ
์ค๋ ๋๋ ์ด๋ค ๋ณ์์ ์ ๊ทผํ ๋ CPU์ ์บ์์ ๋ ์ง์คํฐ๋ฅผ ๊ฑฐ์น๋ค. ์ด ๊ณผ์ ์์ ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ผ๋ ๋ฐ๋ก ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ์๋์ง ์๊ณ ์บ์์๋ง ๋ฐ์๋ ์ ์๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ด ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ๋ฐ๋ก ์ธ์งํ์ง ๋ชปํ๋ ๊ฐ์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ฌํ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด volatile ํค์๋๋ฅผ ํ์ฉํ ์ ์๋ค.
volatile ํค์๋๋ ์๋ฐ์์ ๋ณ์ ์ ๊ทผ ์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ต์ ๊ฐ์ ์ฝ๊ณ ์ฐ๋๋ก ๋ณด์ฅํ๋ค.
์ฆ, volatile ํค์๋๋ ๋ณ์์ ๊ฐ์์ฑ(visibility)์ ๋ณด์ฅํ์ฌ ๋ชจ๋ ์ค๋ ๋๊ฐ ๋ณ์์ ์ต์ ๊ฐ์ ์ฝ๋๋ก ํ์ง๋ง, i++ ๊ฐ์ ๋ณตํฉ ์ฐ์ฐ(์ฝ๊ธฐ → ์ฐ์ฐ → ์ฐ๊ธฐ)์ ์์์ ์ผ๋ก ์ฒ๋ฆฌํ์ง๋ ๋ชปํ๋ค.
๋ฐ๋ผ์ ๋ณตํฉ ์ฐ์ฐ์ ๋ํด์ synchronized, Lock, Atomic ํด๋์ค ๋ฑ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ด๋ ์์์ ์ฐ์ฐ์ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๋ค.
public class SharedObject {
public volatile int counter = 0;
}
โ๊ฐ์์ฑ ๋ฌธ์ ๋?
๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ํ ์ค๋ ๋๊ฐ ๋ณ๊ฒฝํ ๊ณต์ ๋ณ์์ ์ต์ ์ํ๋ฅผ ๋ค๋ฅธ ์ค๋ ๋์์ ์ฆ์ ํ์ธํ ์ ์๋ ์ํฉ
์ถ๊ฐ ์กฐ์ฌ/ํ์ธํ ์
- 4)์ 1) ์ Atomic ์๋ฃ๊ตฌ์กฐ์ ๋๊ธฐํ ๋ฐฉ์์ด ์ด๋ป๊ฒ ๋ค๋ฅธ์ง.
- 4) ์ข๋ ์์ธํ
- ๋ฐฉ์ ๊ตฌ๋ถ์ด ์ ์ ํ์ง
- ๊ฐ ๋ฐฉ์์ ์ฅ๋จ์
- deadlocks, livelocks, resource starvation๊ณผ ๊ฐ์ ๋ถ์์ฉ ์ถ๊ฐ ์กฐ์ฌ
- ํด๊ฒฐ๋ฐฉ๋ฒ ์กฐ์ฌ
์ฐธ๊ณ ์๋ฃ