Week 6
: ๋ถ์กฑํ CS
โ๏ธ 6์ ๋์งธ ์ฃผ ๋ฉํ ๋ง์ ๋ง๋ฌด๋ฆฌํ๋ค.
์ด๋ฒ ์ฃผ๋ ์๋ฐ์ ์ ์ ์ต๋ํ ๋ง์ด ์ฝ์ด๋ณด๋ ๊ฒ์ด ๋ชฉํ์๋๋ฐ, ๊ฐ์กฑ ์ฌํ์ด๋ ์ผ์ ์ด ๊ฒน์ณ์ ์ต๋ํ ์ฌํ์ง์์ ๊ณต๋ถํ์ง๋ง ์๊ฐ์ด ๋ถ์กฑํ๋ ํ ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๋ ๋ ์ฑํฐ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก CS ์ง์๊ณผ ์ด์์ฒด์ ์ ๋ํ ์ดํด๊ฐ ์์ด์ผ ๋น ๋ฅด๊ฒ ์ดํด ํ ์ ์๋ ์์ญ์ด๋ผ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ํ ๋ฒ์ ๊ณต๋ถํ๋ ค๊ณ ํ๋ค๋ณด๋ ํด๋น ์ฑํฐ์์ ๋ง์ ์๊ฐ์ด ์์ ๋๋ค.
๊ทผ๋ฐ ์ ์ ๊ณต๋ถํ ๋ด์ฉ๋ค์ด ๋ค ๋ด ๊ฒ์ด ๋์๋? ๋๋์๋ณด๋ฉด ๋ ๊ทธ๋ ์ง ์์ ๊ฒ ๊ฐ๋ค.
๊ทธ๋๋ ์ค๋ ๋ฉํ ๋ง ๋ด์ฉ์ ์์ง ์๋๋ก ์ ๋ฆฌํด๋ณด์!
1. Synchronized
๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ํด๋น ์ ์ด์๊ฐ ์ ์ธ๋ ๋ฉ์๋๋ ๋ธ๋ก์ ์ ๊ทผ ์ ๋ฐ์ ํ ์ ์๋ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์๋ค.
์ฆ, ์ค๋ ๋ ๊ฐ ๋๊ธฐํ๋ฅผ ์ง์ํ๋ฉฐ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ ๊ทผํด์ผํ๋ ์์์ ๋ํด ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผ ํ ์ ์๋๋ก ํ๋ค.
Synchronized ์ ์ด์๋ ๋ฉ์๋์ ์ง์ ์ ์ธํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ฉ์๋ ๋ด์ Synchronized Block์ ํตํด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
Synchronized ์ ์ด์๋ฅผ ๋ฉ์๋์ ์ง์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉ ํ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ ํ ์ํฌ ์ ์๋ค.
์ฌ๋ฌ ์ค๋ ๋์์ ๋๊ธฐํ ๋ ๋ฉ์๋์ ์ ๊ทผํ๋ค๊ณ ๊ฐ์ ํ์ ๋, ํด๋น ๋ฉ์๋ ๋ด์ ๊ตณ์ด ๋๊ธฐํ ํ ํ์๊ฐ ์๋ ๋ณ์๋ฅผ ๋๊ธฐํ๊ณ ์๋ ์ฌ๋ฌ ์ค๋ ๋์์๋ ์ ๊ทผ์ ํด์ผ ํ๋๋ฐ, Lock ์ํ์ ์ค๋ ๋๊ฐ ํด๋น ๋ฉ์๋์ ๊ณ์ ์ ๊ทผํ๊ณ ์๋ค๋ฉด ํด๋น ์ค๋ ๋๊ฐ ์ข ๋ฃ๋ ๋ ๊น์ง ๋ค์ ์ค๋ ๋๋ค์ด ๋๊ธฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ฌธ์ Synchroinzed ์ ์ด์๋ฅผ ๋ฉ์๋์ ์ง์ ์ ์ธํ๋ ๋ฐฉ์์ ๋ง์ ๊ณ ๋ฏผ ๋์ ๊ฒฐ์ ํด์ผ ํ๋ค.
์ด ๊ฐ์ ์ด์ ๋ก ์ด์ ์ ๋ฐฐ์ด Vector, HashTable ํด๋์ค๋ ์ ์ฌ์ฉํ์ง ์๋๋ค.
2. volatile
Syncrhronized ์ ์ด์์ ๊ฐ์ด ์ค๋ ๋ ๋๊ธฐํ๋ฅผ ์ํ ์ ์ด์.
volatile ์ ์ด์๋ ๋ณ์์ ์ง์ ์ ์ผ๋ก ์ ์ธํ๋ค.
๋ณธ๋ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ ๊ทผํ๊ณ ์ ํ๋ ์์ ์ ๋ณด๋ฅผ CPU ์บ์์์ ๊ฐ์ง๊ณ ์ค๋๋ฐ, ํด๋น ์ ์ด์๋ฅผ ๋ณ์์ ์ ์ธํ๋ฉด
volatile ์ ์ด์๊ฐ ์ ์ธ๋ ๋ณ์์ ์ ๋ณด๋ฅผ CPU ์บ์๊ฐ ์๋ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค.
๊ธฐ๋ณธ ์๋ฃํ์๋ ์ ์ธ ํ ์ ์๊ณ , ์ฐธ์กฐ ์๋ฃํ์๋ง ์ ์ธ ๊ฐ๋ฅํ๋ค.
3. Atomic Type
Synchronized ์ ์ด์๋ volatile ์ ์ด์ ์ฒ๋ผ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์์์ ๋์์ ์ ๊ทผ ํ์ ๋, ๋ฐ์ดํฐ์ ๊ฐ์์ฑ์ ํ๋ณดํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค. CAS ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ๊ตฌํ๋์ด ์์ผ๋ฉฐ, ์ด CAS ์๊ณ ๋ฆฌ์ฆ์ Compare And Swape(ํน์ Set) ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๋น ์์์ ๊ธฐ์กด์ ๊ฐ๊ณผ ์๋ก ํ ๋น๋ ๊ฐ์ด ๊ฐ๋ค๋ฉด ์๋ก์ด ๊ฐ์ผ๋ก ๊ต์ฒดํ๊ณ ๊ฐ์ง ์๋ค๋ฉด ๊ต์ฒดํ์ง ์๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference ํด๋์ค๊ฐ ์กด์ฌํ๋ค.
๋ค๋ง ์์ง ํท๊ฐ๋ฆฌ๋ ์ ์ ๋ฉํ ๋ง ์๊ฐ์ CAS ์๊ณ ๋ฆฌ์ฆ์ Java ์ธ์ด๋ก๋ ์ ํํ ๊ตฌํ๋์ง ์๊ณ Native Language๋ก ๊ตฌํ๋์ด ์์ด JNI๋ฅผ ํตํด ์ํ๋๋ค๋ ๊ฑธ ์ผํ ๋ค์๋ ๊ฒ ๊ฐ์๋ฐ, ์ด๋ค ๊ฒ์์ด๋ก ์ฐพ์๋ด์ผ ํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค.
์กฐ๊ธ ๋ ์์๋ณด์.
(sun.misc.Unsafe ํด๋์ค์ ์ ์๋์ด ์๋ compareAndSwap..() ๋ฉ์๋์ native ์ ์ด์๊ฐ ์ ์ธ๋์ด ์๋ค.)
public final native boolean compareAndSwapObject(Object o, long offset,
Object expected,
Object x);
4. CAS(Compare And Swape / Set) Algorithm
> CAS ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ป๊ฒ ๋์์ฑ์ ๋ณด์ฅ ๋ฐ์ ์ ์์๊น?
๋ฉํฐ ์ค๋ ๋ / ํ๋ก์ธ์ค ํ๊ฒฝ์์ CPU๋ ์ ๊ทผํ๊ณ ์ ํ๋ ๋ณ์์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ์บ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐธ์กฐํ๋๋ฐ, ์ด ๋ ์บ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ณ์ ๋ฐ์ดํฐ์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๋ณ์ ๋ฐ์ดํฐ๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์์ฑ ๋ฌธ์ ๋ผ๊ณ ํ๋ฉฐ, ์ด๋ฅผ ํด๊ฒฐ ํ๊ธฐ ์ํด์ ์ค๋ ๋ / ํ๋ก์ธ์ค๊ฐ ์บ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐธ์กฐํ ๋ณ์ ๋ฐ์ดํฐ ๊ฐ๊ณผ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์๋ณธ ๋ฐ์ดํฐ ๊ฐ์ ๋น๊ตํ์ฌ ๋ ๊ฐ์ด ์ผ์นํ๋ค๋ฉด ์๋ก์ด ๊ฐ์ผ๋ก ๊ต์ฒด๋ฅผ ์งํํ๊ณ , ์ผ์นํ์ง ์๋๋ค๋ฉด ์ฌ์๋ํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฌํ ๊ฐ์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์๋๋ก ํ๋ค.
Java์ Atomic Type ํด๋์ค ๋ด๋ถ์ ์ ์๋ compareAndSet() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ get..() ๋ฉ์๋๋ฅผ ํ์ธํ๋ฉด compareAndSet() ๋ฉ์๋๋ฅผ while ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ฐ์ธ๊ณ ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
5. Thread, Demon Thread
์ผ๋ฐ์ ์ธ ์ค๋ ๋์ ๋ฐ๋ชฌ ์ค๋ ๋์ ์ฐจ์ด๋ ๋ฐ๋ชฌ ์ค๋ ๋์ ๊ฒฝ์ฐ ์ผ๋ฐ ์ค๋ ๋์ ์ข ์์ ์ธ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด ํด๋น ์ผ๋ฐ ์ค๋ ๋์ ์ํ ๋ฐ๋ชฌ ์ค๋ ๋๋ ํจ๊ป ์ข ๋ฃ๋๋ค.
์ฆ, ๋ฐ๋ชฌ ์ค๋ ๋๋ ์์ ์ด ์ํ ์ผ๋ฐ ์ค๋ ๋๋ฅผ ๋ณด์กฐํ๋ ์ญํ ๋ก ์ฌ์ฉ๋๋ฉฐ ๋ํ์ ์ธ ์๋ก๋ GC๊ฐ ์๋ค.
์ด๋ฅผ ์์ฉํ ์๋น์ค(?)๋ค์ ์์ ์คํธ๋ฆฌ๋ฐ ์๋น์ค, ๊ฒ์์ด ์๋ ์์ฑ, ๊ฒ์๊ธ ์์ ์ ์ฅ์ด ์๊ฒ ๋ค.
ํด๋น ์๋น์ค๋ค์ ๊ณตํต์ ์ ๋ฉ์ธ์ผ๋ก ์ํ๋์ด์ผ ํ ๊ฒ๋ค์ ๋ณด์กฐํ๋ ์๋น์ค๋ผ๋ ์ ์ด๋ค.
์์ ํ ์๋ฟ์ง๋ ์์ง๋ง ์ด๋์ ๋ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง๋ ๊ฒ ๊ฐ๋ค.
์ถ๊ฐ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ๋ค
๐ฅ Thread Local > MDC Filter, CountDown Match > ๋์์ฑ ์ง์ ํด๋์ค(Concurrent)
๐ฅ Stream, Buffer, Block
๐ฅ Blocking, Non-Blocking / Sync, Async
๐ฅ Race Condition (๋ณ๋ชฉ ํ์)
๐ฅ OS > Sytem Call, Kernel, Shell (์ด์์ฒด์ ๊ฐ๋ ์ก๊ธฐ)
๐ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ์บ์ ๋ฉ๋ชจ๋ฆฌ, ํ์ด์ง ์๊ณ ๋ฆฌ์ฆ ๋ค์ ํบ์๋ณด๊ธฐ
๐ญ ์ด๋ฒ์ ๊ณต๋ถํ ๋ด์ฉ๋ค์ ์ ๋ฐ์ ์ผ๋ก ์ด์์ฒด์ ๊ฐ๋ ์์ ๋์ค๋ ๋ด์ฉ๋ค์ ๋ํ ์ดํด๊ฐ ํ์ํ ๋ถ๋ถ๋ค์ด ๋ง์์ ์ดํดํ๋๋ฐ ์ ๋ฅผ ๋จน์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ์ด์ ์ธ ์ด์์ฒด์ ๊ฐ๋ ์ด ์์ด์ ์ง๊ธ ๋น์ฅ์ ๊ธฐ์ตํ๊ณ ์๋ค๊ณ ํ๋๋ผ๋ ๋ด๊ฒ ์๋ฟ์ง ์๊ณ , ์ด์์ฒด์ ์ ๋ํด ๊ณต๋ถํ์ง ์๋๋ค๋ฉด ๊ธ๋ฐฉ ๋จธ๋ฆฟ์์์ ํ๋ฐ๋ ๊ฒ ๊ฐ๋ค. (๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ฒ๋ผ..^^.. ๊ฑ๋ ๋๋ํ๊ธฐ๋ผ๋ ํ์ง..)
๋น์ฅ ๋ณธ๊ฒฉ์ ์ผ๋ก ํ๊ธฐ์๋ ์๊ฐ์ด ๋ถ์กฑํ์ง๋ง ํํํ ์ด์์ฒด์ ์ ๋ํด์ ๊ณต๋ถ๋ฅผ ํด์ผ๊ฒ ๋ค. ์๋ฌด๋๋ ์ปดํจํ ์ ๋ํ ๊ธฐ๋ณธ์ด๋๊น ๋ง์ด๋ค.