TreadSafe
์ฐ๋ ๋ ์ธ์ดํ ํ๋ค๋ ๊ฒ์ ๋ฌด์์ ์๋ฏธํ๋์?
์ฐ๋ ๋ ์์ (
Thread-Safety) ํ๋ค๋ ๊ฒ์ ๋ฉํฐ ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ์์ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ค ํจ์๋ ๋ณ์, ํน์ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ์ฐ๋ ๋๋ก๋ถํฐ ๋์์ ์ ๊ทผ์ด ์ด๋ฃจ์ด์ ธ๋ ํ๋ก๊ทธ๋จ์ ์คํ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋งํ๋ค.ํ๋์ ํจ์๊ฐ ํ ์ฐ๋ ๋๋ก๋ถํฐ ํธ์ถ๋์ด ์คํ ์ค์ผ ๋, ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ๊ทธ ํจ์๋ฅผ ํธ์ถํ์ฌ ๋์์ ํจ๊ป ์คํ๋๋๋ผ๋ ๊ฐ ์ฐ๋ ๋์์์ ํจ์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ค๋ ๊ฒ์ ๋งํ๋ค.
์ฐ๋ ๋ ์์ ์ฌ๋ถ ํ๋จ ๋ฐฉ๋ฒ
์ ์ญ ๋ณ์๋ ํ, ํ์ผ๊ณผ ๊ฐ์ด ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์ ๊ทผํ ์ ์๋ ์์์ ์ฌ์ฉํ๋๊ฐ?
ํธ๋ค๊ณผ ํฌ์ธํฐ๋ฅผ ํตํ ๋ฐ์ดํฐ์ ๊ฐ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฐ?
๋ถ์ ํจ๊ณผ(
Side Effect)๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋๊ฐ ์๋๊ฐ?
์ฐ๋ ๋ ์์ ์ ์งํค๊ธฐ ์ํ 4๊ฐ์ง ๋ฐฉ๋ฒ
Mutual Exclusion (์ํธ ๋ฐฐ์ )
Atomic Operation (์์ ์ฐ์ฐ)
Thread-Local Storage (์ฐ๋ ๋ ๋ก์ปฌ ์ ์ฅ์)
Re-Entrancy(์ฌ์ง์ ์ฑ)
Mutual Exclusion (์ํธ ๋ฐฐ์ )
๊ณต์ ์์์ ํ๋์
Thread๋ง ์ ๊ทผํ ์ ์๋๋ก ์ธ๋งํฌ์ด / ๋ฎคํ ์ค๋ก ๋ฝ์ ํต์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Atomic Operation (์์ ์ฐ์ฐ)
๊ณต์ ์์์ ์ ๊ทผํ ๋๋ ์์ ์ฐ์ฐ์ ์ด์ฉํ๊ฑฐ๋ ์์์ ์ผ๋ก ์ ์๋ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ฌ์ฉํจ์ผ๋ก์จ ์ํธ ๋ฐฐ์ ๋ฅผ ๊ตฌํํ ์ ์๋ค.
Atomic
๊ณต์ ์์ ๋ณ๊ฒฝ์ ํ์ํ ์ฐ์ฐ์ ์์์ ์ผ๋ก ๋ถ๋ฆฌํ ๋ค์ ์ค์ ๋ก ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ด ์ด๋ฃจ์ด์ง๋ ์์ ์
Lock์ ๊ฑธ๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์๊ฐ ๋์ ๋ค๋ฅธ ์ฐ๋ ๋์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Thread-Local Storage (์ฐ๋ ๋ ๋ก์ปฌ ์ ์ฅ์)
๊ณต์ ์์์ ์ฌ์ฉ์ ์ต๋ํ ์ค์ด๊ณ ๊ฐ๊ฐ์ ์ฐ๋ ๋์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ ์ ์ฅ์๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๋์ ์ ๊ทผ์ ๋ง๋ ๋ฐฉ๋ฒ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ณต์ ์ํ๋ฅผ ํผํ ์ ์์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ฉฐ, ์ ์ญ ๋ณ์ ์ฌ์ฉ์ ์์ ํ๋ผ๋ ๋ป์ผ๋ก ์๊ฐํ๋ฉด ๋๋ค.
Re-entrancy (์ฌ์ง์
์ฑ)
์ฐ๋ ๋ ํธ์ถ๊ณผ ์๊ด์์ด ํ๋ก๊ทธ๋จ์ ๋ฌธ์ ๊ฐ ์๋๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ค ํจ์๊ฐ ํ ์ฐ๋ ๋์ ์ํด ํธ์ถ๋์ด ์คํ ์ค์ด๋ผ๋ฉด ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ๊ทธ ํจ์๋ฅผ ํธ์ถํ๋๋ผ๋ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๊ฐ์๊ฒ ์ฌ๋ฐ๋ฅด๊ฒ ์ฃผ์ด์ ธ์ผ ํ๋ค.
์ฐ๋ ๋๋ผ๋ฆฌ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.
Java์์ Thread-Safe ํ๊ฒ ์ค๊ณํ๋ ๋ฐฉ๋ฒ
java.util.concurrentํจํค์ง ํ์์ ํด๋์ค๋ค์ ์ฌ์ฉํ๋ค.์ธ์คํด์ค ๋ณ์๋ฅผ ๋์ง ์๋๋ค.
์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ค.
๋๊ธฐํ(
Syncronized) ๋ธ๋ญ์์ ์ฐ์ฐ์ ์ํํ๋ค.
๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์ ์์ ํ ์ฑ๊ธํค ์ธ์คํด์ค ๋ง๋ค๊ธฐ
๊ฒ์ผ๋ฅธ ์ด๊ธฐํ (
Synchronized๋ธ๋ก ์ฌ์ฉ)์๋๊ฐ ๋๋ฌด ๋๋ ค์ ๊ถ์ฅ๋์ง ์๋๋ค.
Double-Check Locking
if๋ฌธ์ผ๋ก ์กด์ฌ ์ฌ๋ถ ์ฒดํฌํ๊ณ ,Synchronized๋ธ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ ์ ๋ ๋ฌธ์ ํด๊ฒฐ์ ๊ฐ๋ฅํ์ง๋ง ์๋ฒฝํ์ง ์๋ค.
Holder์ ์ํ ์ด๊ธฐํ
ํด๋์ค ์์์ ํด๋์ค(
Holder)๋ฅผ ๋์ด JVM Class Loader ๋ฉ์ปค๋์ฆ์ ์ด์ฉํ ๋ฐฉ๋ฒ๊ฐ๋ฐ์๊ฐ ์ง์ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋ณด๋ค๋ JVM์ ์์์ ์ธ ํน์ฑ์ ์ด์ฉํด ์ด๊ธฐํ์ ์ฑ ์์ JVM์ผ๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ
์ผ๋ฐ์ ์ผ๋ก ์ฑ๊ธํค์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
Spring ์์๋ ์ด๋ฐ ์ฑ๊ธํค ํจํด์ ํตํด
Bean์ ๋ํ ๊ด๋ฆฌ๊ฐ ๋๋ฌด ๋ณต์กํด์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด, Singleton Registry์ธ Application Context๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
java.util.concurrent ํจํค์ง๋?
Java 5 ์์ ์ถ๊ฐ๋ ํจํค์ง๋ก, ๋ฉํฐ์ฐ๋ ๋ฉ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ค์ํ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ค์ ์ ๊ณตํ๋ ํจํค์ง์ด๋ค.
Locks : ์ํธ ๋ฐฐ์ ๋ฅผ ์ฌ์ฉํ ์ ์๋ ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค.
Atomic : ๋๊ธฐํ๊ฐ ๋์ด์๋ ๋ณ์๋ฅผ ์ ๊ณตํ๋ค.
Executors : ์ฐ๋ ๋ ํ ์์ฑ, ์ฐ๋ ๋ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ, Task ๋ฑ๋ก๊ณผ ์คํ ๋ฑ์ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
Queue : ์ฐ๋ ๋ ์์ ํ ํ๋ฅผ ์ ๊ณตํ๋ค.
Synchronizers : ํน์ํ ๋ชฉ์ ์ ๋๊ธฐํ๋ฅผ ์ฒ๋ฆฌํ๋ 5๊ฐ์ ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค.
Semaphore,CountDownLatch,CyclicBarrier,Phaser,Exchanger
์ฐธ๊ณ
Last updated