thread
Thread
์ฐ๋ ๋๋ผ๋ ๊ฐ๋
์ ์ดํดํ๊ธฐ ์ํด์๋ ํ๋ก์ธ์ค์ ๋ณํ์ฑ(Concurrency)์ ๊ฐ๋
์ ์๋ฉด ๋ ์ข์ ๊ฒ๊ฐ๋ค.
ํ๋ก์ธ์ค
ํ๋ก์ธ์ค์ ์ฌ์ ์ ์๋ฏธ๋ ์ปดํจํฐ์์ ์คํ๋๊ณ ์๋ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๋งํ๋ค. ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฉํฐ ํ๋ก์ธ์ฑ์ด๋ผ๊ณ ํ๋ฉฐ, ๊ฐ์ ์๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ๋์ฐ๋ ์๋ถํ ๋ฐฉ์์ ๋ฉํฐํ์คํน ์ด๋ผ๊ณ ํ๋ค.
ํน์ง
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋จ์
๋ชจ๋ ํ๋ก๊ทธ๋จ์ ์คํ ๋ ๋ ํ๋ ์ด์์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ๋๋ค.
๊ฐ ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ณ์๋ ์๋ฃ ๊ตฌ์กฐ์ ์ ๊ทผํ ์ ์๋ค.
๊ฐ ํ๋ก์ธ์ค๋ ๋ณ๋์ ์ฃผ์๊ณต๊ฐ์์ ์คํ๋๋ค.
์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋์ด ์คํ๋์ด ์๋ ํ๋ก๊ทธ๋จ์ ๋งํ๋ค.
ํ๋ก์ธ์ค์ ์ํ๋ ์์ฑ, ์คํ, ์ค๋น, ๋๊ธฐ, ์ข ๋ฃ๊ฐ ์๋ค.
๋ณํ์ฑ (Concurrency) == ๋์์ฑ
๋ณ๋ ฌ์ฑ๊ณผ ํท๊ฐ๋ฆด ์ ์๋๋ฐ ๋ณํ์ฑ์ ๋์์ ์คํ๋๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ผ๋ก ์ฑ๊ธ์ฝ์ด์์๋ ์๋ถํ ๊ธฐ๋ฒ์ผ๋ก ์ํํ ์ ์๊ณ ๋ฉํฐ์ฝ์ด์์๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ณ๋ ฌ๋ก ๋์ํ ์ ์๋ค.
๋ณ๋ ฌ์ฑ(Parallelism)์ ์ค์ ๋ก ๋์์ ์์
์ด ์ฒ๋ฆฌ๋๋ ๊ฒ์ผ๋ก ๋ฉํฐ์ฝ์์์๋ง ๋์์ด ๊ฐ๋ฅํ๋ค.
์ฐ๋ ๋
ํ๋ก์ธ์ค์ ํน์ ํ ์ํ ๊ฒฝ๋ก๋ก ํ๋ก์ธ์ค๊ฐ ํ ๋น ๋ฐ์ ์์์ ์ด์ฉํ๋ ์คํ์ ๋จ์๋ผ๊ณ ํ ์ ์๋ค.
ํ๋์ ํ๋ก์ธ์ค์์ ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฉํฐ ์ค๋ ๋ฉ์ด๋ผ๊ณ ํ๋ค.
ํน์ง
ํ๋ก์ธ์ค ๋ด์์ ์คํ/๋ ์ง์คํฐ๋ง ๊ฐ๊ฐ ํ ๋น ๋ฐ๊ณ ๋๋จธ์ง ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ณต์ ํ๋ค. ์คํ์ ๊ฐ๊ฐ ํ ๋นํ๋ ์ด์ : ์ค๋ ๋๋ ํ ๊ธฐ๋ฅ์ ์ํํ๋ ๋ ๋ฆฝ์ ์ธ ๋จ์๋ก์จ ์ต์ํ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ(์คํ)์ ๊ฐ๊ฐ ํ ๋นํด์ผ ๋ ๋ฆฝ์ ์ผ๋ก ์ํ์ด ๊ฐ๋ฅํ๋ค.
Thread ํด๋์ค์ Runnable ์ธํฐํ์ด์ค
์๋ฐ์์ ์ฐ๋ ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์๋ Thread ํด๋์ค์ Runnable ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
Thread ํด๋์ค extends
Thread ํด๋์ค๋ฅผ ํ์ฅํ์ฌ ์์ฑํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ threadํด๋์ค๋ฅผ ์์๋ฐ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ธ th1๊ณผ th2์ ๊ฐ์ด ์ต๋ช
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๋ ๋ฐฉ๋ฒ 2๊ฐ์ง ๊ฐ ์กด์ฌํ๊ณ ๋๋ฒ์งธ๋ฐฉ๋ฒ์ธ ์ต๋ช
ํด๋์ค๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฐ๋ ๋๊ฐ ์ค์ง ํ๋ฒ๋ง ์ํ ๋ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Runnable ์ธํฐํ์ด์ค implements
Runnable ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ Thread์์ฑ๋ฐฉ๋ฒ๋ ๋๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
Runnalbe ์ธํฐํ์ด์ค๋ฅผ implementsํ class๋ฅผ ์์ฑ์ ๋งค๊ฐ๋ณ์๋ก ์ด์ฉํ์ฌ ์์ฑํ๋ ๋ฐฉ๋ฒ
Runnable ์ธํฐํ์ด์ค๋ run๋ฉ์๋๋ฐ์ ์กด์ฌํ์ง ์๋ ์ ์ ์ด์ฉํ์ฌ
๋๋ค๋ฅผ ์ด์ฉํด ๋ฐ๋ก run๋ฉ์๋๋ฅผ ์ ์ํ์ฌ ์์ฑํ๋ ๋ฐฉ๋ฒ
์ฐจ์ด์
Thread ํด๋์ค๋ฅผ extendsํ๋ ๋ฐฉ๋ฒ์ class๋ฅผ ์์๋ฐ๋ ๊ฒ์ธ ๋งํผ Thread์ ๋ค๋ฅธ ๋ฉ์๋๋ค์ ์ด์ฉ์ด ๊ฐ๋ฅํ์ง๋ง ๋ค๋ฅธ class๋ฅผ ์์๋ฐ์ง ๋ชปํ์ง๋ง, Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋ค๋ฅธ class๋ฅผ ์์๋ฐ์ ์ ์๊ณ ์กฐ๊ธ ๋
๊ฐ์ฒด ์งํฅ์ ์ด๋ค.Threadํด๋์ค๋ฅผ ์์๋ฐ๋ class๋ run ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ์ง๋ง, Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ฐฉ๋ฒ์ Thread ํด๋์ค๋ ๊ฐ๋น์ง ์ปฌ๋์ ์ด ๋๋๋ผ๋ ๊ตฌํ์ฒด๋ ๊ฐ๋น์ง ์ปฌ๋์ ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ Threadํด๋์ค์ ๋ฉ์๋๋ฅผ ์ด์ฉํ๊ณ ์ถ๋ค๋ฉด Thread ํด๋์ค์ static ๋ฉ์๋์ธ currentThread()๋ฅผ ํธ์ถํ์ฌ ์ฐ๋ ๋์ ์ฐธ์กฐ๋ฅผ ์ป์ด์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ฐ๋ ๋์ ์ํ
๊ฐ์ฒด ์์ฑ
NEW
์ค๋ ๋ ๊ฐ์ฒด ์์ฑ (start()๋ฉ์๋ ํธ์ถ ์ )
์คํ ๋๊ธฐ
RUNNABLE
์ค์ผ์ค๋ง ๋์ง ์์ ์คํ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ํ
์ผ์์ ์ง
WAITING
๋ค๋ฅธ ์ค๋ ๋์ notify๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ํ
์ผ์์ ์ง
TIMED_WAITING
์ฃผ์ด์ง ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ
์ผ์์ ์ง
BLOCKED
์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฐ์ฒด์ ๋ฝ์ด ํ๋ฆด ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ํ ( ๋๊ธฐํ ๋ฌธ์ )
์ข ๋ฃ
TERMINATED
์คํ์ ๋ง์น ์ํ
Start์ run
start()๋ NEW์ํ์ ์ค๋ ๋๋ฅผ RUNNABLE์ํ๋ก ๋ง๋ค์ด์ฃผ๋ ๋ฉ์๋๋ก ์คํ๋ ์ ์๋ ๋๊ธฐ ํ์ ๋ฃ์ด์ฃผ๋ ์ญํ (call stack ์์ฑ)
run()์ ์ค๋ ๋๊ฐ ์ค์ผ์ค๋ฌ์ ์ํด ์ค์ ๋ก ์คํ๋ ๋ ์คํํ ๋ฉ์๋์ด๊ณ start()์์ด run๋ง ์คํํ๊ฒ ๋๋ค๋ฉด override๋ ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ํธ์ถํ ๋ฟ ํด๋น Thread๋ RUNNABLE์ํ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์คํ๋๊ธฐ ํ์ ๋ค์ด์์ง ์์ ์ํ๋ ๋๋ก ๋์ํ์ง ์๋๋ค.
์ฐ๋ ๋ ์ํ ์ ์ด ๋ฉ์๋
Thread ํด๋์ค์ ์ ์
interrupt()
์ผ์์ ์ง์ํ์ ์ค๋ ๋์์ Interrupt ์์ธ๋ฅผ ๋ฐ์์์ผ ์์ ์ ๋ฉ์ถ๋ผ๊ณ ์์ฒญํ๋ ๋ฉ์๋
interrupted()
interrupt()๊ฐ ํธ์ถ๋์๋์ง ์๋ ค์ฃผ๋ ๋ฉ์๋ (๋์๋ค๋ฉด true)
join((long millis),(int nanos))
๋์์ค์ธ ์์ ์ ๋ฉ์ถ๊ณ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ง์ ์๊ฐ๋์ ์์ ์ํํ๋๋ก ๋๊ฒจ์ฃผ๋ ๋ฉ์๋๋ก ์๊ฐ์ ์ง์ ํ์ง ์์ผ๋ฉด ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์์ ์ ๋ง์น ๋ ๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
sleep(long millis, (int nonos))
์ผ์ ์๊ฐ๋์ ์ค๋ ๋๋ฅผ ๋ฉ์ถ๊ฒ ํ๋ ๋ฉ์๋๋ก ์ผ์์ ์ง์ํ๋ก ๋ง๋ค๊ณ interrupt()๊ฐ ํธ์ถ๋๋ฉด ์คํ ๋๊ธฐ์ํ๋ก ๋ง๋ ๋ค.
sleep์ ํญ์ ์คํ์ค์ธ ์ค๋ ๋์ ๋ํด ์๋ํ๊ธฐ ๋๋ฌธ์ static์ผ๋ก ์ ์ธ๋์ด ์์ด Thread.sleep(1000)๊ณผ ๊ฐ์ด ์ฌ์ฉํด์ผ ํ๋ค.
yield()
์ค๋ ๋ ์์ ์๊ฒ ์ฃผ์ด์ง ์๊ฐ์ ๋ค์ ์ค๋ ๋์๊ฒ ์๋ณดํ๋ ๋ฉ์๋
Object ํด๋์ค์ ์ ์
ํน์ ๊ฐ์ฒด์ ๋ํ ๊ฒ์ด๋ฏ๋ก ์์ ๋ฉ์๋๋กธ ๋ค๋ฅด๊ฒ Objectํด๋์ค์ ์ ์๋์ด ์์ด ๋ชจ๋ ๊ฐ์ฒด์์ ํธ์ถ์ด ๊ฐ๋ฅํ๊ณ ๋๊ธฐํ ๋ธ๋ก๋ด์์๋ง ์ฌ์ฉํ ์ ์๋ค.
notify()
์ผ์์ ์ง ์ํ์ ์ค๋ ๋์ค ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ๊นจ์ฐ๋ ๋ฉ์๋๋ก RUNNABLE์ํ๋ก ๋ง๋ ๋ค.
notifyAll()
waiting pool์์ ์๋ ๋ชจ๋ ์ค๋ ๋๋ฅผ ๊นจ์ฐ๋ ๋ฉ์๋๋ก ๊นจ์ด๋ ์ค๋ ๋๋ค์ ๋ค์ ๊ฒฝ์์ ํตํด ์คํ๋๋ค.
ํธ์ถ๋ ๊ฐ์ฒด์ waiting pool๋ด์ ์ค๋ ๋๋ค์ ๋ชจ๋ ๊นจ์ฐ๋ ๊ฒ
wait()
notify()๋ notifyAll()์ ๊ธฐ๋ค๋ฆฌ๋ ๋ฉ์๋
wait(long timeout,(int nanos))
์ง์ ๋ ์๊ฐ๋์๋ง ๊ธฐ๋ค๋ฆฌ๋ ๋ฉ์๋
์ฐ๋ ๋์ ์ฐ์ ์์
์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋๊ฐ ๋์ํ๋ฉฐ ๋ณํ์ฑ์ ์ํํ๊ธฐ ์ํด ์๋ถํ ์ ํ์ฌ ์ค์ผ์ค๋ง์ ํตํด ์ค๋ ๋๋ฅผ ๋์ ์ํค๋๋ฐ ์ด๋ฅผ ์ํด, ์๋ฐ๋ ์ฐ๋ ๋ ํด๋์ค์ ์ด๋ค ์ฐ๋ ๋๋ฅผ ๋ ์ค์ํ๊ฒ ์๊ฐํ์ฌ ๋์์ํฌ์ง ์ง์ ํ์ฌ ๋ ๋ง์ ์์
์๊ฐ์ ๊ฐ๋๋ก ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๊ฐ๊ณ ์๋ค.
์ฐ์ ์์์ ๋ฒ์๋ 1~10์ด๋ฉฐ ์ซ์๊ฐ ๋์์๋ก ์ฐ์ ์์๊ฐ ๋๊ณ , ๋ฉ์ธ ๋ฉ์๋๋ฅผ ์ํํ๋ ์ฐ๋ ๋์ ์ฐ์ ์์๊ฐ 5์ด๋ฏ๋ก main๋ฉ์๋ ๋ด์์ ์์ฑํ๋ ์ฐ๋ ๋์ ์ฐ์ ์์๋ ๊ธฐ๋ณธ๊ฐ์ด 5๊ฐ ๋๋ค.
์ฐ๋ ๋์ ์ฐ์ ์์๋ ์๋์ ์ธ ๊ฐ์ผ๋ก ์ ๋์ ์ด ๊ฐ์ด ์๋๋ค
๋ฉ์๋
์ํํ ๋น (Round Robin) ๋ฐฉ์
์ค์ผ์ค๋ง ๋ฐฉ์์๋ ์ฐ์ ์์๋ฐฉ์ ๋ง๊ณ ๋ RR๋ฐฉ์๋ ์๋๋ฐ ์ด ๋ฐฉ์์ ์ค๋ ๋๋ง๋ค ์ฌ์ฉํ ์๊ฐ์ ํ ๋น(Time slice)ํด์ ์ ํด์ง ์๊ฐ๋งํผ ๋์๊ฐ๋ฉฐ ์คํํ๋ ๋ฐฉ์์ผ๋ก JVM์ ์ํด ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์์๋ก ์์ ํ ์ ์๋ค.
Main ์ฐ๋ ๋
์ฐ๋ฆฌ๊ฐ ์๋ฐํ๋ก์ ํธ๋ฅผ ์ฒ์ ์์ํ์๋๋ c,c++์ ๊ฐ์ด ์ฒ์ ์์ฑํ๋ main()๋ฉ์๋๋ฅผ ์คํํ๋ฉด ์์๋๋ ์ค๋ ๋๋ก main๋ฉ์๋์ ์ฝ๋ ํ๋ฆ์ด๋ค.
main ์ฐ๋ ๋๋ฅผ ํตํด ๋ค๋ฅธ ์ฐ๋ ๋๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ์ค๋ ๋๊ฐ ์๋ค๋ฉด ๋ฉํฐ์ค๋ ๋๋ ๋น์ฐํ ๊ตฌํํ ์ ์๋ค.
single process single thread
single process multi thread
multi process single thread
multi process multi thread
๋๊ธฐํ
๋ฉํฐ ์ค๋ ๋๋ก ๋์ํ๋ ํ๋ก๊ทธ๋จ์์ ํ ์ค๋ ๋๊ฐ ์์ ํ๋ ์ค์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ค์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๊ฐ์ญํ์ง ๋ชปํ๋๋ก ๋ง๋ ๊ฒ์ด๋ค.
๋๊ธฐํ๋ฅผ ์ํค์ง ์๋๋ค๋ฉด ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๊ฐ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๋์ํ ๊ฒฝ์ฐ, ์ด๋ค ์ค๋ ๋๊ฐ ๋จผ์ ์คํ๋ ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์๋ํ์ง ์๋ ๋์์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉํฐ์ค๋ ๋ํ๋ก๊ทธ๋๋ฐ์์๋ ์ค์ํ ๋ฌธ์ ์ด๋ค.
์ฃผ์ ๊ฐ๋ ๋ค
์๊ณ ๊ตฌ์ญ (Critical Section) : ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ๋ฐ์ดํฐ ๋ธ๋ญ์ผ๋ก ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผ๊ฐ๋ฅํ๋๋ก ์ง์ ํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
์ํธ ๋ฐฐ์ (Mutual Exclusion,Mutex) : ์๊ณ ๊ตฌ์ญ์ ํ ์์ ์์ ํ๊ฐ์ ์ค๋ ๋๋ง ์ฌ์ฉํ ์ ์๋๋ก ๋ค๋ฅธ ์ค๋ ๋์ ์ ๊ทผ์ ์ ์ดํ๋ ๊ธฐ๋ฒ
๋๊ธฐํ : ์ํธ๋ฐฐ์ ์ ํ ํํ๋ก ์ํธ๋ฐฐ์ ๋ฅผ ์ํํ๊ธฐ ์ํด ํ๋ก์ธ์ค์ ์ฒ๋ฆฌ ์์๋ฅผ ๊ฒฐ์ ํ๋ ๊ธฐ๋ฒ (Semaphore)
๊ธฐ์ ์ํ (starvation) : ๋ค๋ฅธ ์ฐ๋ ๋์๊ฒ ์ฐ์ ์์๊ฐ ๋ฐ๋ ค ์์์ ๊ณ์ ํ ๋น๋ฐ์ง ๋ชปํ๋ ์ํ
๊ณต์ ์ฑ(fairness) : ๋ชจ๋ ์ฐ๋ ๋๊ฐ ๊ณตํํ๊ฒ ์์ ์ ์ํํ๋ ๊ฒ
Synchronized ์ด์ฉ
์๊ณ์์ญ์ ์ค์ ํ๋๋ฐ ์ฌ์ฉํ๋ ํค์๋๋ก ๋ฉ์๋ ์ ์ฒด๋ฅผ ์๊ณ์์ญ์ผ๋ก ์ง์ ํ๊ฑฐ๋ ํน์ ํ ์์ญ์ ์๊ณ์์ญ์ผ๋ก ์ง์ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์ฐ๋ ๋๋ synchronized๊ฐ ํธ์ถ๋ ์์ ๋ถํฐ ํด๋น ์ฝ๋๋ธ๋ญ์ด ํฌํจ๋ ๊ฐ์ฒด์ lock์ ์ป์ด ์์ ์ ์ํํ๋ค๊ฐ ์ข ๋ฃ๋๋ฉด lock์ด ๋ฐํ๋๊ณ ์ด๋ ๋ชจ๋ ์๋์ผ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ์๋ ์๊ณ์์ญ๋ง ์ค์ ํด์ฃผ๋ฉด๋๋ค.
๊ฐ์ฒด๋ lock์ ํ๋์ฉ ๊ฐ์ง๊ณ ์๊ณ ์ค์ ํ ๊ฐ์ฒด์ lock์ ๊ฐ์ง๊ณ ์๋ ์ฐ๋ ๋๋ง ์๊ณ์์ญ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ณ ๋ค๋ฅธ ์ค๋ ๋๋ ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์๊ณ์์ญ์ ์ขํ๋ ๊ฒ์ด ์ข๋ค.
๋ฉ์๋์ synchronized๋ฅผ ๊ฑธ๋ฉด ๊ทธ ๋ฉ์๋๊ฐ ํฌํจ๋ ๊ฐ์ฒด(this)์ lock์ ๊ฑฐ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
๊ฐ์ฒด ์์ด ํธ์ถํ๋ static ๋ฉ์๋์ ๊ฒฝ์ฐ ํด๋น class์ lock์ ๊ฑธ๋ฉด์ ํจ์๊ฐ์ lock์ด ๊ณต์ ๋์ด ๋์์ ํธ์ถ๋๋ ๊ฒ์ ๋ง์ ๋๊ธฐํ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
Locks
Java 5์ ์ถ๊ฐ๋ ํจํค์ง๋ก java.util.concurrent๊ฐ ์๋๋ฐ ์ด ํจํค์ง์์ ๋๊ธฐํ๋ฅผ ์ํด ๋ค์ํ ํด๋์ค๋ค์ ์ ๊ณตํ๋ค.
์ฃผ์ ๊ธฐ๋ฅ
Locks : ์ํธ ๋ฐฐ์ ๋ฅผ ์ฌ์ฉํ ์ ์๋ ํด๋์ค
Synchronizers : ๋๊ธฐํ๋ฅผ ์ฒ๋ฆฌํ๋ ํด๋์ค ์ ๊ณต (Semaphore, CountDownLatch, CyclicBarrier, Phaser, Exchanger)
Atomic : ๋๊ธฐํ๊ฐ ๋์ด์๋ ๋ณ์ ์ ๊ณต
Executors : ์ฐ๋ ๋ ํ ์์ฑ, ์ฐ๋ ๋ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ์ ๊ฐ์ ๊ธฐ๋ฅ ์ ๊ณต
Queue : Thread-safeํ Queue ์ ๊ณต
java.util.concurrent.locks
ํด๋น ํจํค์ง์ ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ Lock API๋ค์ด ์ ์ด ๋์ด์๊ณ , synchronized ๋ lock์ ์ด์ฉํ ๋๊ธฐํ์ธ๋งํผ ๋์ผํ ๋ฉ์ปค๋์ฆ์ผ๋ก ๋์ํ๋ค.
๋ด๋ถ์ ์ผ๋ก synchronized๋ฅผ ์ฌ์ฉํด ๊ตฌํ๋์๊ณ , ๋์ฑ ๋ ์ ์ฐํ๊ณ ์ ๊ตํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๊ณ ์ง์ lock์ ๊ฑธ๊ณ ํธ๋ ์์ ์ ์ํํด์ผ ํ๋ค.
Interface
Lock : ๊ณต์ ์์์ ํ๋ฒ์ ํ ์ฐ๋ ๋๋ง read/write๋ฅผ ์ํ ๊ฐ๋ฅ
ReadWriteLock : ๊ณต์ ์์์ ์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋๊ฐ readํ ์ ์์ง๋ง write๋ ํ ์ฐ๋ ๋๋ง ์ํ ๊ฐ๋ฅ
Condition : wait()๊ณผ notify()๋ฅผ ์ฐ๋ ๋์ ์ข ๋ฅ๋ก ๊ตฌ๋ถํ์ง ์๊ณ , ๊ณต์ ๊ฐ์ฒด์ waiting poll์ ๋ชฐ์ ๋ฃ๊ณ ๊ฐ ์ฐ๋ ๋๋ฅผ ์ํ Condition์ ๋ง๋ค์ด ๊ฐ๊ฐ์ waiting pool์์ ๋ฐ๋ก ๊ธฐ๋ค๋ฆฌ๋๋ก ํ๋ค.
wait(),notify(),notifyAll() ๋์ await(),signal(),signalAll()์ ์ฌ์ฉํ๋ค.
Interface์ ๊ตฌํ์ฒด
ReentrantLock : Lock์ ๊ตฌํ์ฒด๋ก ์๊ณ์์ญ์ ์์,์กธ๋ฃ ์ง์ ์ ๋ช ์ ํ ์ ์๊ฒ ํด์ค๋ค.
ReentrantReadWriteLock : ReadWriteLock์ ๊ตฌํ์ฒด
StampLock : JDK 1.8๋ถํฐ ์ถ๊ฐ๋์๊ณ , ๋ค๋ฅธ lock๊ณผ ๋ฌ๋ฆฌ Lock์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์๊ณ lock์ ๊ฑธ๊ฑฐ๋ ํด์งํ ๋ ์คํฌํ(longํ์ ์ ์๊ฐ)๋ฅผ ์ฌ์ฉํ๋ค.
์ฃผ์ ๋ฉ์๋
lock() : Lock ์ธ์คํด์ค์ lock์ ๊ฑด๋ค.
lockInterruptibly() : ํ์ ์ฐ๋ ๋๊ฐ interrupted ์ํ๊ฐ ์๋๋ Lock ์ธ์คํด์ค์ ์ ๊ธ์ ๊ฑธ๊ณ interrupted์ํ๋ผ๋ฉด Exception์ ๋ฐ์์ํจ๋ค.
tryLock() : ์ฆ์ Lock์ธ์คํด์ค์ ์ ๊ธ์ ์๋ํ๊ณ ์ฑ๊ณต์ฌ๋ถ๋ฅผ boolean ํ์ ์ผ๋ก ๋ฐํํ๋ค.
tryLock(long timeout, TimeUnit timeUnit) : ์ ๊ธ ์คํจ์ false๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์๋ ์ฃผ์ด์ง ์๊ฐ๋์ ๊ธฐ๋ค๋ฆฐ๋ค.
unlock() : Lock์ธ์คํด์ค์ ์ ๊ธ์ ํด์ ํ๋ค.
newCondition() : ํ์ Lock ์ธ์คํด์ค์ ์ฐ๊ฒฐ๋ Condition ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
Synchronized ์ Lock์ ์ฐจ์ด์
Synchronized๋ ์์์ ์ธ(implicit) lock์ด๋ผ๊ณ ํ์ฌ ๋ถ๊ณต์ ๋ฌธ์ ๊ฐ ๋ฐ์ ํ ์ ์์ด ์ฐ๋ ๋ ์์๋ฅผ ๋ณด์ฅํ์ง ์์ง๋ง Lock์ ์์๋ฅผ ์ง์ ํ ์ ์์ด ๋ช
์์ ์ธ(explict) lock์ด๋ผ๊ณ ํ๋ค.
Synchronized๋ lock์ ์๋ ํ๋/๋ฐํํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๋ค๋ ์ฅ์ ์ด ์๊ณ , Lock์ ReentrantLock์ ์ด์ฉํ๋ฉด ์์ฑ์ ์ธ์๋ฅผ ํตํด ๊ณต์ /๋ถ๊ณต์ ์ ์ค์ ํ ์ ์์ด ๊ณต์ ํ lock์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์์ ํ ๋น์ ์ํด ๊ฒฝ์์ด ๋ฐ์ํ์ ๋ ์ค๋ ๊ธฐ๋ค๋ฆฐ ์ค๋ ๋์๊ฒ lock์ ์ ๊ณตํ์ฌ ๊ธฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
volatile
๋ฉํฐ ์ฝ์ด ํ๋ก์ธ์๋ ์ฝ์ด๋ง๋ค ๋ณ๋์ ์บ์๋ฅผ ๊ฐ๊ณ ์๋๋ฐ ๋ณ์ ์์ volatile ํค์๋๋ฅผ ๋ถ์ด๋ฉด ์ฝ์ด๊ฐ ๋ณ์์ ๊ฐ์ ์ฝ์ด์ฌ ๋ ์บ์๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ ์บ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
JVM์ ๋ฐ์ดํฐ๋ฅผ 4byte ๋จ์๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ int๋ ์ด๋ณด๋ค ์์ ํ์ ์ ๋ฐ์ดํฐ๋ ํ๋ฒ์ ์ฝ๊ฑฐ๋ ์ฐ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ ๊ทธ๋ณด๋ค ํฐ ๋ฐ์ดํฐ ํ์ ์ด๋ผ๋ฉด ํ๋์ ๋ช ๋ น์ด๋ก ๊ฐ์ ์ฝ๊ฑฐ๋ ์ธ ์ ์๋ค. ๋๋ฌธ์ ๋ณ์์ ๊ฐ์ ์ฝ๋ ๊ณผ์ ์์ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ๋ผ์ด๋ค ํ์ด ์๊ธฐ ๋๋ฌธ์ ๋ณ์๋ฅผ ์ฝ๊ณ ์ฐ๋ ๋ฌธ์ฅ์ synchronized๋ธ๋ญ์ผ๋ก ๊ฐ์ธ๊ฑฐ๋ ๋ณ์๋ฅผ volatile์ ๋ถ์ฌ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์บ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์๋ค.
์์์๋ volatile๋ฅผ ๋ถ์ผ ์ ์์ด ๋ณ์์ final์ ๊ฐ์ด ์ธ ์ ์๋ค. (์์๋ ๋ณํ์ง ์๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ thread-safeํ๊ธฐ ๋๋ฌธ์)
๋ฐ๋๋ฝ
๊ต์ฐฉ์ํ๋ผ๊ณ ๋ ํ๋ฉฐ ์ํธ ๋ฐฐ์ ์ ์ํด ๋ํ๋๋ ๋ฌธ์ ๋ก, ๋ ์ด์์ ์ค๋ ๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์ํ์์ ์๋ก ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ ์ ํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌํ๊ฒ๋์ด ๋์์ด ๊ธฐ๋ค๋ฆฌ๋ ์ํ
๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ ์ ์์๋ ๋ฐ์ํ๋๋ฐ ํ ํธ๋์ญ์ ์์ ํ ๋ ์ฝ๋์ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ ๋, ์ด ๋ ์ฝ๋๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํด ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ ๊ทผ์ ๋ง๋๋ก lock์ ๊ฑฐ๋๋ฐ ๋ค์์ ํธ๋์ ์ ์ด ๋์์ ๋ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ๋ คํ๋ค๋ฉด ๋ฐ๋๋ฝ์ ๋น ์ง ์ํ์ด ์๋ค.
๋ฐ๋๋ฝ ๋ฐ์ ์กฐ๊ฑด(์ด์ )
Mutual Exclusion(Mutex) : ์์์ ๋์ ์ ๊ทผ ๋ถ๊ฐ๋ฅ
Hold & Wait : ์ ์ ํ๊ณ ๊ธฐ๋ค๋ฆฌ๊ธฐ (์์์ ์ ์ ํ์ฑ๋ก ๋ค๋ฅธ ์ค๋ ๋์ ์์์ ๋ฐ๋ฉ๋ฐ๊ธธ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ)
No Preemption : ์์์ ๊ฐ์ ๋ก ๋บ์ด์ค์ง ๋ชปํจ
Circular Wait : ์ํ ํํ๋ก ๋๊ธฐ
๋ฐ๋๋ฝ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฐ๋๋ฝ ์๋ฐฉ : ๋ฐ๋๋ฝ ๋ฐ์ ์กฐ๊ฑด 4๊ฐ์ง๋ฅผ ์์ฒ ๋ด์ํ๋ ๋ฐฉ๋ฒ
๋ฐ๋๋ฝ์ ํํผ : ์์์ด ์ด๋ป๊ฒ ์์ฒญ๋ ์ง์ ๋ํ ์ถ๊ฐ์ ๋ณด๋ฅผ ์ ๊ณตํ๋๋ก ์๊ตฌํ๋ ๊ฒ์ผ๋ก ์์ ํ ๋น์ํ๋ฅผ ๊ฒ์ฌํ๋ ๋ฐฉ๋ฒ
๋ฐ๋๋ฝ ํ์ง & ํ๋ณต : ๋ฐ๋๋ฝ์ด ๋ฐ์ํ์๋ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
๋ฐ๋๋ฝ ๋ฌด์ : ์์ฃผ ์ ์ ํ๋ฅ ๋ก ๋ฐ๋๋ฝ์ด ๋ฐ์ํ๋ค๋ฉด, ๋ฌด์ํ๋ ๋ฐฉ๋ฒ
๋ฌด์ํ๊ฑฐ๋ ์ฌ์คํํ๋ ํธ์ด ์์์ ์ผ๋ก ๋ ์ด๋์ ๋ณผ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ํํ๋ ๋ฐฉ๋ฒ
๋ฐ๋๋ฝ ๋ฐฉ์ง ๋ฐฉ๋ฒ๋ค
๋ฝ ์ ๋ ฌ : ๋ชจ๋ ๋ฝ์ด ํญ์ ๊ฐ์ ์์๋ก ํ๋๋๋ค๋ฉด ๋ฐ๋๋ฝ์ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํจ๊ณผ์ ์ด๋ ๋ฝ์ ์์๋ฅผ ์๊ณ ์๋ ์ํ์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. (๋ฐ๋๋ฝ ์๋ฐฉ)
๋ฝ ํ์ ์์ : ๋ฝ์ ํ๋ํ๊ธฐ ์ํด ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ ์ ํด๋๊ณ ์๊ฐ์ด ์ง๋ ํ์๋ ๋ฝ์ ๋ค์ ์๋ํ๋ ๋ฐฉ๋ฒ (๋ฐ๋๋ฝ ํ์ง&ํ๋ณต)
๊ฐ์ ๋ฝ์ ํ๋ํ๋ ค๋ ๋ค๋ฅธ ๋ชจ๋ ์ฐ๋ ๋์๊ฒ ๊ธฐํ๋ฅผ ์ฃผ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ณต์ ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ๋๊ณ , ๋ฐ๋๋ฝ ๋ฟ๋ง์ด ์๋ ์์ ์ ์ฒ๋ฆฌ์ค์๋ ํ์์์์ด ๋ฐ์ํ ์ ๋ ์๋ค.
๋ฐ๋๋ฝ ๊ฐ์ง : ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ์ฐ๋ ๋๊ฐ ๋ฝ์ ํ๋ํ๋ฉด ์ ์ฅํ๊ณ ์ด๋ฅผ ์ด์ฉํด ๋ฐ๋๋ฝ์ ๊ฐ์งํ๊ณ ๋ฐ๋๋ฝ์ด ๋ฐ์ํ๋ค๋ฉด, ๋ฝ์ ํด์ ํ๋ ๋ฐฉ๋ฒ
Atomic Variable : volatile ํค์๋๋ java.util.concurrent.atomic ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์ฐ๋ ๋ ํ
์ฐ๋ ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ํ์ํ ๋ ์ฌ์ฉํ๊ณ ๋ฐ๋ฉํ ์ ์๋๋ก ํ๋ ํ์ฅ์ ๊ฐ๋
java.util.concurrent.Executors์์ ์ค๋ ๋ํ ๊ด๋ จ API๋ฅผ ์ ๊ณตํ๋ค.
์ฅ์
์ค๋ ๋๋ฅผ ์์ฑ/์๊ฑฐํ๋๋ฐ ๋น์ฉ์ด ์ ๋ค.
์์ ์ด์ ๋ก ๋ค์์ ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ๋น ๋ฅด๊ฒ ๋์ ๊ฐ๋ฅํ๋ค.
๋จ์
์ฌ์ฉํ๋ ์๋ณด๋ค ๋ง์ด ์์ฑํด๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ๋๋ค.
๋ ธ๋ ์ค๋ ๋๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ฐ๋ ๋ ํ์ ๊ตฌ์กฐ
Task์ ์์ฒญ์ ๋ฐ๋ Queue
์ค์ ์ฐ๋ ๋๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ manager
Queue ์์์ Task๋ฅผ ๊บผ๋ด์ ์ค์ ์ฐ๋ ๋์์ ๋์์์ผ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ถ๋ถ
์์ฑ ๋ฉ์๋
Executors.newFixedThreadPool(10) : ์ต๋ ์ฐ๋ ๋๋ฅผ 10๊ฐ๊น์ง ๋ง๋๋ ํ
Executors.newCachedThreadPool() : ์ฐ๋ ๋ ์์ ์ ํ์ ๋์ง ์๋ ํ๋ก ์ฐ๋ ๋ ์์ ์์ฒญ์ด ๋ค์ด์ฌ๋ ์์ฑํ๊ณ ์ข ๋ฃ์์ ๋ฐ๋ก ์ฃฝ์ง์๊ณ ์งง์ ์๊ฐ(1๋ถ)๋์ ์ด์์๋ ๋ฐฉ๋ฒ์ ํ
Executors.newSingleThreadExecutor() : ํ๋์ ์ฐ๋ ๋๋ฅผ ์์ฑํ๋ ํ๋ก ์ฐ๋ ๋ ์์ ์ค์ ์์ธ์ํฉ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์์ธ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฐ๋ ๋์ฉ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ค.
Executors.newScheduledThreadPool() : ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ๋ฐ๋ณตํด์ผํ๋ ์ค๋ ๋๋ฅผ ์ฌ๋ฌ๊ฐ ์์ฑํ๊ธฐ ์ํ ํ
์ ์ ์ค๋ ๋ํ์ ์ฌ์ด์ฆ๋ ์ด๋ป๊ฒ ์๊น?
Reference
https://nesoy.github.io/articles/2018-09/OS-Concurrency-Parallelism
https://ryan-han.com/post/java/java-thread/
https://zbomoon.tistory.com/12
https://widevery.tistory.com/28
https://goscala.tistory.com/171
https://tourspace.tistory.com/54
Last updated