Description ์ ๋ฆฌ
๋ฌด์ด์ ๋ฒ์น: ์นฉ ํ๋์ ๊ฝ์ ์ ์๋ ํธ๋์ง์คํฐ ๊ฐ์๊ฐ ๋งค๋
2๋ฐฐ ์ฆ๊ฐ. 50๋
์ ๋๋์์ ์ ํจํ์.
์๋ฌ์ ๋ฒ์น
T(N) = S + (1/N) * (T - S)
S: ์์ฐจ ์คํ ํํธ
T: ์ด ํ์คํฌ ์์ ์๊ฐ
N: ํ๋ก์ธ์ ๊ฐ์
๋์ ์์
์ T - S์ด๊ณ , N ๊ฐ ํ๋ก์ธ์ค์ ํ์คํฌ๋ฅผ ๊ณ ๋ฃจ ๋ถ๋ฐฐํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ ์ฒด ํ์คํฌ ์์ ์๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ฏ๊ฐ์ง๋ฌ์ด ๋ณ๋ ฌ: ๋ณ๋ ฌ ํ์คํฌ๋ ๋ค๋ฅธ ์์ฐจ ํ์คํฌ ๊ฐ์ ์ํตํ ํ์๊ฐ ์ ํ ์์ ๊ฒฝ์ฐ ์ด๋ก ์ ์ผ๋ก ์๋๋ ๋ฌดํํ ๋์ผ ์ ์๋ค.
์๋ฐ ๋์์ฑ
volatile ํค์๋
Main memory๋ก๋ถํฐ ์ต์ ๊ฐ์ ๊ฐ์ ธ์ค๋๋ก ํ๋ค.
Thread Safety Case
์ค์ง ํ๋์ Thread๋ง writeํ๋ ๊ฒฝ์ฐ
์ฌ๋ฌ thread๊ฐ writeํ์ง๋ง Atomicํ๊ฒ writeํ๋ ๊ฒฝ์ฐ
Non-Thread Safety case
non-atomic/composite operation
e.g. ์ฆ๊ฐ/๊ฐ์ ์ ๊ฐ์ operation. ์ฆ๊ฐ/๊ฐ์๋ 3๊ฐ์ง operation(Read variable, Update, Writing the updated back to memory)์ผ๋ก ์ด๋ฃจ์ด์ ธ์๊ธฐ ๋๋ฌธ์ ์ด ์งง์ ์๊ฐ๋์ race condition ๋ฐ์ ๊ฐ๋ฅ
https://www.baeldung.com/java-volatile-variables-thread-safety
JMM(Java Memory Model)์ ์ดํด
JMM์ ์์ฃผ ์ฝํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด๋ค.
๊ฐํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ: ์ ์ฒด ์ฝ์ด๊ฐ ํญ์ ๊ฐ์ ๊ฐ์ ๋ฐ๋ผ๋ณธ๋ค
์ฝํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ: ์ฝ์ด๋ง๋ค ๋ค๋ฅธ ๊ฐ์ ๋ณผ ์ ์๊ณ , ๊ทธ ์์ ์ ์ ์ดํ๋ ํน๋ณํ ์บ์ ๊ท์น์ด ์๋ค
JMM documents - TODO
CAS(Compare-And-Swap): non-blocking algorithms for concurrent environments. ๋จ์ผ ์ฐ์ฐ์ผ๋ก Read, Update, Writing the updated back to memory๋ฅผ ์ฒ๋ฆฌํ๋ค.
Non-blocking algorithm: ํน์ ์ค๋ ๋์์ ์์
์ด ์คํจํ๊ฑฐ๋ ๋๋ ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ์, ๋ค๋ฅธ ์ด๋ค ์ค๋ ๋๋ผ๋ ๊ทธ๋ก์ธํด ์คํจํ๊ฑฐ๋ ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ์ง ์๋ ์๊ณ ๋ฆฌ์ฆ์ Non-Blocking ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋ค. ๋ํ ๊ฐ ์์
๋จ๊ณ๋ง๋ค ์ผ๋ถ ์ค๋ ๋๋ ํญ์ ์์
์ ์งํํ ์ ์๋ ๊ฒฝ์ฐ Lock-Free ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํ๋ค.
JVM์์์ CAS ์ง์์ Java 5.0์์๋ถํฐ ์์๋์๊ณ , CAS ์ฐ์ฐ์ ์ง์ ์ง์ํ๋ ํ๋์จ์ด์์๋ ํด๋น ๋ถ๋ถ์ ๊ธฐ๊ณ์ด๋ก ๋ณํ.
https://effectivesquid.tistory.com/entry/Lock-Free-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Non-Blocking-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
Intrinsic lock vs spin lock
Intrinsic lock: ์ ์ ์ฝ๋์์ OS๋ฅผ ํธ์ถํจ์ผ๋ก์จ ์๋. OS๋ฅผ ์ด์ฉํด ์ค๋ ๋๊ฐ ๋ฐ๋ก ์ ํธ๋ฅผ ์ค ๋๊น์ง ๋ฌดํ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ง๋๋ ๊ฒ
Spin lock: ๋ธ๋กํน๋ ์ค๋ ๋๋ฅผ CPU์ ํ์ฑ ์ํ๋ก ๋๋๊ณ , ์๋ฌด ์ผ๋ ์ํค์ง ์์ ์ฑ ๊ณ์ ์ฌ์๋(CPU cycle ์๋ชจ)
๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
java.util.concurrent.locks.Lock interface
lock(): ๊ธฐ์กด ๋ฐฉ์๋๋ก ๋ฝ์ ํ๋ํ๊ณ ๋ฝ์ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ๋ธ๋กํน
tryLock(): ๋ฝ์ ํ๋ํ๋ ค๊ณ ์๋ํ๊ณ , true/false๋ฅผ return. ํ์์์ ์ค์ ๋ ํ ์ ์์.
ReentrantLock: Lock์ ๊ตฌํ์ฒด
ReentrantReadWriteLock์ ReadLock๊ณผ WriteLock์ ์ฌ์ฉํ๋ฉด, ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ฝ๊ธฐ ์์
์ ํ๋ ๋์ค์๋ ๋ค๋ฅธ ์ฝ๊ธฐ ์ค๋ ๋๋ฅผ ๋ธ๋กํนํ์ง ์๊ฒ ํ ์ ์๋ค. ๋ธ๋กํน์ ์ฐ๊ธฐ๋ง ์ผ์ด๋จ. ์ฝ๊ธฐ๊ฐ ๋ง์ด ์ผ์ด๋๋ Application์์ ์ข๋ค.
Semaphore: โ์ต๋ O๊ฐ ๊ฐ์ฒด๊น์ง๋ง ์ก์ธ์ค๋ฅผ ํ์ฉโ๊ณผ ๊ฐ์ด ์ฌ๋ฌ ๋ฆฌ์์ค์ ์ก์ธ์ค๋ฅผ ํ์ฉํ๋ ๋
ํนํ ๊ธฐ์ ์ ์ ๊ณต
acquire: ์ฌ์ฉ ๊ฐ๋ฅํ ํผ๋ฐ ์๋ฅผ ํ๋์ฉ ์ค์. ์ธ ์ ์๋ ํผ๋ฐ์ด ํ๋๋ ์์ ๊ฒฝ์ฐ blocking
release: ํผ๋ฐ์ ๋ฐ๋ฉํ๊ณ ๋๊ธฐ ์ค์ธ ์ค๋ ๋ ์ค์์ ํ๋์๊ฒ ํด์ ํ ํผํท์ ์ ๋ฌ
CountDownLatch: Count๋ฅผ ์
ํ
ํ๊ณ , ๊ฐ ์ค๋ ๋๊ฐ countdown()์ ํธ์ถํ ๋๋ง๋ค ์นด์ดํธ ๊ฐ์ 1 ๊ฐ์ํ๊ณ , 0์ ์ด๋ฅด๋ฉด Latch๊ฐ ์ด๋ฆฐ๋ค.
ForkJoinPool
ํ์ ๋ถํ ํ
์คํฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
์์
๋นผ์๊ธฐ ์๊ณ ๋ฆฌ์ฆ
์ง๋ฌธ
Q. ์ ์ฝํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด ๊ฐํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ๋ณด๋ค ์ด์์ฑ์ด ๋์ ๊ฑด๊ฐ? ์ต๊ทผ CPU ์ํคํ
์ฒ๋ค์ด ์ฝํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด๋ผ์?
Q. CountDownLatch๋ ํ์ฌ ๋จ๊ณ์ ๋ชจ๋ ์ผ์ ์ฒ๋ฆฌํ๊ณ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ์ผ ํ ๋ ์ฌ์ฉ? ์ค์ ์ด๋ฐ ์ฌ๋ก๊ฐ ์๋ ๊ฒ ์์๊น? ์จ๋ณธ์ ์ด ์์ด์...
Q. ์ฑ
์์๋ ๊ฒฝํฉ ์ค์ธ ๋ฆฌ์์ค๊ฐ ๊ทนํ ์งง์ ์๊ฐ๋์๋ง ์ฌ์ฉํ ๊ฒฝ์ฐ Intrinsic lock ๋ฐฉ์์ ๋ง๋ํ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์๋ค๊ณ ํ๋ค. ์ด๊ฒ์ ๊ณต๊ฐํ์ง๋ง, ๊ฒฝํฉ ์ค์ธ ๋ฆฌ์์ค๋ฅผ ๊ทนํ ์งง์ ์๊ฐ๋์ ์ฌ์ฉํ๋๊ฑธ ์ด๋ป๊ฒ ์์ง?
Reactions are currently unavailable
You canโt perform that action at this time.
์ ๋ฆฌ
์ง๋ฌธ