Multithread Concurrency
์ํ๋์ ๊น์ํ์ ์ค์  ์๋ฐ - ๊ณ ๊ธ 1ํธ, ๋ฉํฐ์ค๋ ๋์ ๋์์ฑ ๊ฐ์๋ฅผ ์์ฝํ ๋ด์ฉ์ ๋๋ค.
Process And Thread
๋ฉํฐํ์คํน๊ณผ ๋ฉํฐํ๋ก์ธ์ฑ
ํ๋ก๊ทธ๋จ ์คํ
ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ์ฝ๋๋ฅผ ์์๋๋ก CPU์์ ์ฐ์ฐ(์คํ)ํ๋ ์ผ
- CPU ์ฝ์ด๊ฐ ํ๋์ผ ๊ฒฝ์ฐ, ํ ๋ฒ์ ํ๋์ ํ๋ก๊ทธ๋จ ์ฝ๋๋ง ์คํ 
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ๋์ CPU ์ฝ์ด๋ก ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ ๋์์ ์คํํ๋ - Multitasking๊ธฐ์ ๋ฑ์ฅ
โน๏ธ Multitasking
ํ๋์ ์ปดํจํฐ ์์คํ ์ด ๋์์ ์ฌ๋ฌ ์์ ์ ์ํํ๋ ๋ฅ๋ ฅ
- ์ด์์ฒด์ ๊ฐ ์ค์ผ์ค๋ง์ ์ํํ๊ณ , CPU๋ฅผ ์ต๋ํ ์ฌ์ฉํ๋ฉด์ ์์ ์ด ๊ณจ๊ณ ๋ฃจ ์ํ๋ ์ ์๊ฒ ์ต์ ํ 
- ํ๋์ CPU๋ ์ด๋น ์์ญ์ต ๋ฒ ์ด์์ ์ฐ์ฐ์ ์ํ - CPU๊ฐ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ ํ๋ก๊ทธ๋จ์ ์ฝ๋๋ฅผ ๋ฒ๊ฐ์ ์ํํ๋ค๋ฉด, ์ฌ๋์ด ๋๋ ๋ ๋ ํ๋ก๊ทธ๋จ์ด ๋์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง 
- ์๋ถํ (Time Sharing) ๊ธฐ๋ฒ: ํ๋ก๊ทธ๋จ์ ์คํ ์๊ฐ์ ๋ถํ ํด์ ๋ง์น ๋์์ ์คํ๋๋ ๊ฒ ์ฒ๋ผ ํ๋ ๊ธฐ๋ฒ 
 
...
โน๏ธ Multiprocessing
์ปดํจํฐ ์์คํ ์์ ๋ ์ด์์ ํ๋ก์ธ์(CPU Core)๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ธฐ์
- ํ๋์ CPU ์์ ๋ณดํต 2๊ฐ ์ด์์ ์ฝ์ด 
- ๋ฉํฐํ๋ก์ธ์ฑ ์์คํ ์ ํ๋์ CPU ์ฝ์ด๋ง์ ์ฌ์ฉํ๋ ์์คํ ๋ณด๋ค ๋์์ ๋ ๋ง์ ์์ ์ ์ฒ๋ฆฌ 
Multiprocessing VS. Multitasking
์ฌ๋ฌ CPU(์ฌ๋ฌ CPU ์ฝ์ด)๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ ์ฌ๋ฌ ์์ ์ ์ํํ๋ ๊ฒ์ ์๋ฏธ
๋จ์ผ CPU(๋จ์ผ CPU ์ฝ์ด)๊ฐ ์ฌ๋ฌ ์์ ์ ๋์์ ์ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ๊ฒ
ํ๋์จ์ด ๊ธฐ๋ฐ์ผ๋ก ์ฑ๋ฅ์ ํฅ์
์ํํธ์จ์ด ๊ธฐ๋ฐ์ผ๋ก CPU ์๊ฐ์ ๋ถํ ํ์ฌ ๊ฐ ์์ ์ ํ ๋น
๋ค์ค ์ฝ์ด ํ๋ก์ธ์๋ฅผ ์ฌ์ฉํ๋ ํ๋ ์ปดํจํฐ ์์คํ 
ํ๋ ์ด์ ์ฒด์ ์์ ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์์ ์คํ๋๋ ํ๊ฒฝ
ํ๋ก์ธ์ค์ ์ค๋ ๋
โน๏ธ Proccess
์ด์์ฒด์  ์์์ ์คํ์ค์ธ ํ๋ก๊ทธ๋จ
- ํ๋ก์ธ์ค๋ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ์ธ์คํด์ค - ๊ฐ ํ๋ก์ธ์ค๋ ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ๊ณ ์์ผ๋ฉฐ, ์ด์์ฒด์ ์์ ๋ณ๋์ ์์ ๋จ์๋ก ๋ถ๋ฆฌํด์ ๊ด๋ฆฌ 
- ํ๋ก์ธ์ค๊ฐ ์๋ก์ ๋ฉ๋ชจ๋ฆฌ์ ์ง์  ์ ๊ทผ/๊ฐ์ญํ ์ ์๋ค 
 
- ์๋ฐ ์ธ์ด๋ก ๋น์ ๋ฅผ ํ์๋ฉด ํด๋์ค๋ ํ๋ก๊ทธ๋จ์ด๊ณ , ์ธ์คํด์ค๋ ํ๋ก์ธ์ค 
ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ฑ
- Code Section: ์คํํ ํ๋ก๊ทธ๋จ์ ์ฝ๋๊ฐ ์ ์ฅ๋๋ ๋ถ๋ถ 
- Data Section: ์ ์ญ ๋ณ์ ๋ฐ ์ ์  ๋ณ์๊ฐ ์ ์ฅ๋๋ ๋ถ๋ถ 
- Heap: ๋์ ์ผ๋ก ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ 
- Stack: ๋ฉ์๋(ํจ์) ํธ์ถ ์ ์์ฑ๋๋ ์ง์ญ ๋ณ์์ ๋ฐํ ์ฃผ์๊ฐ ์ ์ฅ๋๋ ์์ญ(์ค๋ ๋์ ํฌํจ) 
...
โน๏ธ Thread
ํ๋ก์ธ์ค ๋ด์์ ์คํ๋๋ ์์ ์ ๋จ์
- ํ๋ก์ธ์ค๋ ํ๋ ์ด์์ ์ค๋ ๋๋ฅผ ๋ฐ๋์ ํฌํจ - ํ ํ๋ก์ธ์ค ๋ด์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์กด์ฌํ ์ ์์ผ๋ฉฐ, ์ด๋ค์ ํ๋ก์ธ์ค๊ฐ ์ ๊ณตํ๋ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ณต์ (๋จ์ผ ์ค๋ ๋, ๋ฉํฐ ์ค๋ ๋) 
- ํ๋ก์ธ์ค๋ณด๋ค ๋จ์ํ๋ฏ๋ก ์์ฑ ๋ฐ ๊ด๋ฆฌ๊ฐ ๋จ์ํ๊ณ ๊ฐ๋ณ 
 
- ํ๋์ ํ๋ก๊ทธ๋จ๋ ๊ทธ ์์์ ๋์์ ์ฌ๋ฌ ์์ ์ด ํ์ํ๋ฏ๋ก ๋ฉํฐ์ค๋ ๋๊ฐ ํ์ 
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ฑ
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ: ๊ฐ์ ํ๋ก์ธ์ค์ ์ฝ๋ ์น์ , ๋ฐ์ดํฐ ์น์ , ํ(๋ฉ๋ชจ๋ฆฌ)์ ํ๋ก์ธ์ค ์์ ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ 
- ๊ฐ๋ณ ์คํ: ๊ฐ ์ค๋ ๋๋ ์์ ์ ์คํ์ ๋ณด์ 
ํ๋ก์ธ์ค๋ ์คํ ํ๊ฒฝ๊ณผ ์์์ ์ ๊ณตํ๋ ์ปจํ
์ด๋ ์ญํ , ์ค๋ ๋๋ CPU๋ฅผ ์ฌ์ฉํด์ ์ฝ๋๋ฅผ ํ๋ํ๋ ์คํํ๋ ์ญํ 
์ค๋ ๋์ ์ค์ผ์ค๋ง
๋จ์ผ ์ฝ์ด ์ค์ผ์ค๋ง
- ์ด์์ฒด์ ๋ ๋ด๋ถ์ ์ค์ผ์ค๋ง ํ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๊ฐ ์ค๋ ๋๋ ์ค์ผ์ค๋ง ํ์์ ๋๊ธฐ 
- ๊ฐ ์ค๋ ๋๋ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์ฝ๋๋ฅผ ์คํ 
๋ฉํฐ ์ฝ์ด ์ค์ผ์ค๋ง
- CPU ์ฝ์ด๊ฐ 2๊ฐ ์ด์์ด๋ฉด ํ ๋ฒ์ ๋ ๋ง์ ์ค๋ ๋๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋์์ ์คํ 
ํ๋ก์ธ์ค, ์ค๋ ๋์ ์ค์ผ์ค๋ง
- ๋ฉํฐํ์คํน๊ณผ ์ค์ผ์ค๋ง - ๋ฉํฐํ์คํน์ ๋์์ ์ฌ๋ฌ ์์ ์ ์ํํ๋ ๊ฒ์ ์๋ฏธ
- ์ด๋ฅผ ์ํด ์ด์์ฒด์ ๋ - ์ค์ผ์ค๋ง์ด๋ผ๋ ๊ธฐ๋ฒ์ ์ฌ์ฉ
- ์ค์ผ์ค๋ง์ CPU ์๊ฐ์ ์ฌ๋ฌ ์์ ์ ๋๋์ด ๋ฐฐ๋ถํ๋ ๋ฐฉ๋ฒ
 
- ํ๋ก์ธ์ค์ ์ค๋ ๋ - ํ๋ก์ธ์ค๋ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ์ธ์คํด์ค- ๊ฐ ํ๋ก์ธ์ค๋ ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ง๋ฉฐ, ์ด์์ฒด์ ์์ ๋ ๋ฆฝ๋ ์คํ ๋จ์๋ก ์ทจ๊ธ 
 
- ์ค๋ ๋๋ ํ๋ก์ธ์ค ๋ด์์ ์คํ๋๋ ์์ ๋จ์- ์ฌ๋ฌ ์ค๋ ๋๋ ํ๋์ ํ๋ก์ธ์ค ๋ด์์ ์์์ ๊ณต์ ํ๋ฉฐ, ํ๋ก์ธ์ค์ ์ฝ๋, ๋ฐ์ดํฐ, ์์คํ  ์์๋ฑ์ ๊ณต์ 
- ์ค์ ๋ก CPU์ ์ํด ์คํ๋๋ ๋จ์๋ ์ค๋ ๋ 
 
 
- ํ๋ก์ธ์ค์ ์ญํ - ํ๋ก์ธ์ค๋ ์คํ ํ๊ฒฝ(์ปจํ ์ด๋ ์ญํ )์ ์ ๊ณต- ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ, ํ์ผ ํธ๋ค, ์์คํ  ์์(๋คํธ์ํฌ ์ฐ๊ฒฐ) ๋ฑ์ด ํฌํจ 
 
- ํ๋ก์ธ์ค ์์ฒด๋ ์ด์์ฒด์ ์ ์ค์ผ์ค๋ฌ์ ์ํด ์ง์  ์คํ๋์ง ์์ผ๋ฉฐ, ํ๋ก์ธ์ค ๋ด์ ์ค๋ ๋๊ฐ ์คํ - 1๊ฐ์ ํ๋ก์ธ์ค ์์ ํ๋์ ์ค๋ ๋๋ง ์คํ๋๋ ๊ฒฝ์ฐ๋ ์๊ณ , ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์คํ๋๋ ๊ฒฝ์ฐ๋ ์กด์ฌ 
 
 
์ปจํ
์คํธ ์ค์์นญ
์ปจํ ์คํธ ์ค์์นญ(context switching)
- ์ค๋ ๋A๋ฅผ ๋ฉ์ถ๋ ์์ ์ CPU์์ ์ฌ์ฉํ๋ ๊ฐ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด๋์ด์ผ ํ๋ค. 
- ๊ทธ๋ฆฌ๊ณ ์ดํ์ ์ค๋ ๋A๋ฅผ ๋ค์ ์คํํ ๋ ์ด ๊ฐ๋ค์ CPU์ ๋ค์ ๋ถ๋ฌ์ค๋ ๊ณผ์  
๋ฉํฐ์ค๋ ๋๋ ๋๋ถ๋ถ ํจ์จ์ ์ด์ง๋ง, ์ปจํ ์คํธ ์ค์์นญ ๊ณผ์ ์ด ํ์ํ๋ฏ๋ก ํญ์ ํจ์จ์ ์ธ ๊ฒ์ ์๋๋ค
- ํ์ฌ ์์ ํ๋ ๋ฌธ๋งฅ์ด ๋ณํ๊ธฐ ๋๋ฌธ์ ์ปจํ ์คํธ(ํ์ฌ ์์ ํ๋ ๋ฌธ๋งฅ) ์ค์์นญ - ์ปจํ ์คํธ ์ค์์นญ ๊ณผ์ ์์ ์ด์ ์ ์คํ ์ค์ธ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊น ์ ์ฅํ๊ณ , 
- ์ดํ์ ๋ค์ ์คํํ๋ ์์ ์ ์ ์ฅํ ๊ฐ์ CPU์ ๋ค์ ๋ถ๋ฌ์์ผ ํ๋ค. 
 
- ์ปจํ ์คํธ ์ค์์นญ ๊ณผ์ ์๋ ์ฝ๊ฐ์ ๋น์ฉ์ด ๋ฐ์ - ์ฐ์ฐ ์๊ฐ + ์ปจํ ์คํธ ์ค์์นญ ์๊ฐ 
 
- ์ค์ ๋ก ์ปจํ ์คํธ ์ค์์นญ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์์ฃผ ์งง์ง๋ง ์ค๋ ๋๊ฐ ๋งค์ฐ ๋ง๋ค๋ฉด ์ด ๋น์ฉ์ด ์ปค์ง ์ ์์ 
CPU์ ์ค๋ ๋์ ๊ด๊ณ
CPU 4๊ฐ / ์ค๋ ๋ 2๊ฐ
์ค๋ ๋์ ์ซ์๊ฐ ๋๋ฌด ์ ์ผ๋ฉด ๋ชจ๋  CPU๋ฅผ 100% ๋ค ํ์ฉํ  ์ ์์ง๋ง, 
์ค๋ ๋๊ฐ ๋ช ๊ฐ ์์ผ๋ฏ๋ก ์ปจํ
์คํธ ์ค์์นญ ๋น์ฉ์ด ์ค์ด๋ ๋ค.
CPU 4๊ฐ / ์ค๋ ๋ 100๊ฐ
์ค๋ ๋์ ์ซ์๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด CPU๋ฅผ 100% ๋ค ํ์ฉํ  ์ ์์ง๋ง ์ปจํ
์คํธ ์ค์์นญ ๋น์ฉ์ด ๋์ด๋๋ค.
CPU 4๊ฐ / ์ค๋ ๋ 4๊ฐ
์ค๋ ๋์ ์ซ์๋ฅผ CPU์ ์ซ์์ ๋ง์ถ๋ค๋ฉด CPU๋ฅผ 100% ํ์ฉํ  ์ ์๊ณ , ์ปจํ
์คํธ ์ค์์นญ ๋น์ฉ๋ ์์ฃผ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ต์ ์ ์ํ๊ฐ ๋๋ค. 
์ด์์ ์ผ๋ก๋ CPU ์ฝ์ด ์ + 1๊ฐ ์ ๋๋ก ์ค๋ ๋๋ฅผ ๋ง์ถ๋ฉด ํน์  ์ค๋ ๋๊ฐ ์ ์ ๋๊ธฐํ  ๋ ๋จ์ ์ค๋ ๋๋ฅผ ํ์ฉํ  ์ ์๋ค.CPU ๋ฐ์ด๋ ์์ vs I/O ๋ฐ์ด๋ ์์
๊ฐ ์ค๋ ๋๊ฐ ํ๋ ์์ ์ ํฌ๊ฒ 2๊ฐ์ง๋ก ๊ตฌ๋ถ
- CPU-bound tasks- CPU์ ์ฐ์ฐ ๋ฅ๋ ฅ์ ๋ง์ด ์๊ตฌํ๋ ์์ ์ ์๋ฏธ 
- ๊ณ์ฐ, ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์๊ณ ๋ฆฌ์ฆ ์คํ ๋ฑ CPU์ ์ฒ๋ฆฌ ์๋๊ฐ ์์ ์๋ฃ ์๊ฐ์ ๊ฒฐ์  
- ex. ๋ณต์กํ ์ํ ์ฐ์ฐ, ๋ฐ์ดํฐ ๋ถ์, ๋น๋์ค ์ธ์ฝ๋ฉ, ๊ณผํ์  ์๋ฎฌ๋ ์ด์  ๋ฑ. 
 
- I/O-bound tasks- ๋์คํฌ, ๋คํธ์ํฌ, ํ์ผ ์์คํ  ๋ฑ๊ณผ ๊ฐ์ ์ ์ถ๋ ฅ(I/O) ์์ ์ ๋ง์ด ์๊ตฌํ๋ ์์ 
- I/O ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐ ์๊ฐ์ด ๋ง์ด ๋ฐ์ํ๋ฉฐ, CPU๋ ์๋์ ์ผ๋ก ์ ํด(๋๊ธฐ) ์ํ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์(์ค๋ ๋๊ฐ CPU๋ฅผ ์ฌ์ฉํ์ง ์๊ณ I/O ์์ ์ด ์๋ฃ๋ ๋ ๊น์ง ๋๊ธฐ) 
- ex. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ฒ๋ฆฌ, ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ, ๋คํธ์ํฌ ํต์ , ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ ๋ฑ. 
 
์ค๋ ๋ ์ค์ 
์ค๋ ๋์ ์ซ์๋ CPU-๋ฐ์ด๋ ์์ ์ด ๋ง์์ง, I/O-๋ฐ์ด๋ ์์ ์ด ๋ง์์ง์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ค์ ์ด ํ์
- CPU-bound tasks: CPU ์ฝ์ด ์ + 1๊ฐ- CPU๋ฅผ ๊ฑฐ์ 100% ์ฌ์ฉํ๋ ์์ ์ด๋ฏ๋ก ์ค๋ ๋๋ฅผ CPU ์ซ์์ ์ต์ ํ 
 
- I/O-bound tasks: CPU ์ฝ์ด ์ ๋ณด๋ค ๋ง์ ์ค๋ ๋๋ฅผ ์์ฑ(CPU๋ฅผ ์ต๋ํ ์ฌ์ฉํ ์ ์๋ ์ซ์๊น์ง ์ค๋ ๋ ์์ฑ)- CPU๋ฅผ ๋ง์ด ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์ฑ๋ฅ ํ ์คํธ๋ฅผ ํตํด CPU๋ฅผ ์ต๋ํ ํ์ฉํ๋ ์ซ์๊น์ง ์ค๋ ๋ ์์ฑ 
- ๋จ, ๋๋ฌด ๋ง์ ์ค๋ ๋๋ฅผ ์์ฑํ๋ฉด ์ปจํ ์คํธ ์ค์์นญ ๋น์ฉ๋ ํจ๊ป ์ฆ๊ฐํ๋ฏ๋ก ์ ์ ํ ์ฑ๋ฅ ํ ์คํธ ํ์ 
 
์น ์ ํ๋ฆฌ์ผ์ด์  ์๋ฒ๋ผ๋ ์ํฉ์ ๋ฐ๋ผ CPU ๋ฐ์ด๋ ์์ ์ด ๋ง์ ์ ์๋ค.
์ด ๊ฒฝ์ฐ CPU-๋ฐ์ด๋ ์์ ์ ์ต์ ํ๋ CPU ์ซ์๋ฅผ ๊ณ ๋ ค
Thread creation and execution
์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ

๋ฉ์๋ ์์ญ(Method Area)
- ๋ฉ์๋ ์์ญ์ ํ๋ก๊ทธ๋จ์ ์คํํ๋๋ฐ ํ์ํ ๊ณตํต ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ , ํ๋ก๊ทธ๋จ์ ๋ชจ๋ ์์ญ์์ ๊ณต์ - ํด๋์ค ์ ๋ณด: ํด๋์ค์ ์คํ ์ฝ๋(๋ฐ์ดํธ ์ฝ๋), ํ๋, ๋ฉ์๋์ ์์ฑ์ ์ฝ๋๋ฑ ๋ชจ๋ ์คํ ์ฝ๋ ์กด์ฌ 
- static ์์ญ: static ๋ณ์๋ค์ ๋ณด๊ด 
- ๋ฐํ์ ์์ ํ: ํ๋ก๊ทธ๋จ์ ์คํํ๋๋ฐ ํ์ํ ๊ณตํต ๋ฆฌํฐ๋ด ์์๋ฅผ ๋ณด๊ด 
 
์คํ ์์ญ(Stack Area)
- ์๋ฐ ์คํ ์, ํ๋์ ์คํ ์คํ์ด ์์ฑ๋๊ณ , ๊ฐ ์คํ ํ๋ ์์ ์ง์ญ ๋ณ์, ์ค๊ฐ ์ฐ์ฐ ๊ฒฐ๊ณผ, ๋ฉ์๋ ํธ์ถ ์ ๋ณด ๋ฑ์ ํฌํจ - ์คํ ํ๋ ์: ์คํ ์์ญ์ ์์ด๋ ๋ค๋ชจ ๋ฐ์ค๊ฐ ํ๋์ ์คํ ํ๋ ์. ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ง๋ค ํ๋์ ์คํ ํ๋ ์์ด ์์ด๊ณ , ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๋ฉด ํด๋น ์คํ ํ๋ ์์ด ์ ๊ฑฐ 
 
- ์คํ ์์ญ์ ๋ ์ ํํ ๊ฐ ์ค๋ ๋๋ณ๋ก ํ๋์ ์คํ ์คํ์ด ์์ฑ. ๋ฐ๋ผ์ ์ค๋ ๋ ์ ๋งํผ ์คํ์ด ์์ฑ 
ํ ์์ญ(Heap Area)
- ๊ฐ์ฒด(์ธ์คํด์ค)์ ๋ฐฐ์ด์ด ์์ฑ๋๋ ์์ญ์ด๋ค 
- ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ด ์ด๋ฃจ์ด์ง๋ ์ฃผ์ ์์ญ์ด๋ฉฐ, ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ GC์ ์ํด ์ ๊ฑฐ 
extends Thread
Thread ํด๋์ค๋ฅผ ์์ ๋ฐ๊ฑฐ๋ Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ์ค๋ ๋๋ฅผ ์์ฑ
Thread.start()
- ์ค๋ ๋ ์คํ ๋ฉ์๋ 
- HelloThread ์ค๋ ๋๊ฐ ๋ณ๋์ ์ค๋ ๋์์ run() ๋ฉ์๋๋ฅผ ์คํ 
- main ์ค๋ ๋๋ start() ๋ฉ์๋๋ฅผ ํตํด Thread-n ์ค๋ ๋์๊ฒ ์คํ์ ์ง์ - main ์ค๋ ๋๊ฐ run() ์ ํธ์ถํ ๊ฒฝ์ฐ ๋ณ๋์ ์ค๋ ๋๊ฐ ์๋ main ์ค๋ ๋์์ ์ง์  ์คํ 
 
์ค๋ ๋๋ ์์์ ์คํ ๊ธฐ๊ฐ์ ๋ชจ๋ ๋ณด์ฅํ์ง ์๋๋ค.
Daemon Thread
์ค๋ ๋๋ User Thread, Daemon Thread 2๊ฐ์ง ์ข ๋ฅ๋ก ๊ตฌ๋ถ
User Thread(non-daemon Thread)
- ํ๋ก๊ทธ๋จ์ ์ฃผ์ ์์ ์ ์ํ 
- ์์ ์ด ์๋ฃ๋ ๋๊น์ง ์คํ 
- ๋ชจ๋ user thread๊ฐ ์ข ๋ฃ๋๋ฉด JVM๋ ์ข ๋ฃ 
Daemon Thread
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ณด์กฐ์ ์ธ ์์ ์ ์ํ 
- ๋ชจ๋ user thread๊ฐ ์ข ๋ฃ๋๋ฉด daemon thread๋ ์๋์ผ๋ก ์ข ๋ฃ 
implements Runnable
์ค๋ฌด์์๋ ๋ณดํต Runnable์ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ
- ์คํ ๊ฒฐ๊ณผ๋ ๊ธฐ์กด๊ณผ ๋์ผ 
- ์ค๋ ๋์ ํด๋น ์ค๋ ๋๊ฐ ์คํํ ์์ ์ด ์๋ก ๋ถ๋ฆฌ๋์ด ์๋ค๋ ์ฐจ์ด - ์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋, ์คํํ ์์ ์ ์์ฑ์๋ก ์ ๋ฌ 
 
Thread ํด๋์ค ์์ ๋ฐฉ์
์ฅ์ 
- ๊ฐ๋จํ ๊ตฌํ: Thread ํด๋์ค๋ฅผ ์์๋ฐ์ run() ๋ฉ์๋๋ง ์ฌ์ ์ 
๋จ์ 
- ์์์ ์ ํ: ์๋ฐ๋ ๋จ์ผ ์์๋ง์ ํ์ฉ 
- ์ ์ฐ์ฑ ๋ถ์กฑ: ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋นํด ์ ์ฐ์ฑ ๊ฐ์ 
Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ ๋ฐฉ์
์ฅ์ 
- ์์์ ์์ ๋ก์: ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์๋ฐ์๋ ๋ฌธ์ ์์ด ๊ตฌํ ๊ฐ๋ฅ 
- ์ฝ๋์ ๋ถ๋ฆฌ: ์ค๋ ๋์ ์คํํ ์์ ์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ํฅ์ 
- ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์ผํ Runnable ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ ์ ์์ด ์์ ๊ด๋ฆฌ์ ํจ์จ์  
๋จ์ 
- ์ฝ๋๊ฐ ์ฝ๊ฐ ๋ณต์ก: Runnable ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ Thread ์ ์ ๋ฌํ๋ ๊ณผ์ ์ด ์ถ๊ฐ 
Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์.
์ค๋ ๋์ ์คํํ ์์ ์ ๋ช ํํ ๋ถ๋ฆฌํ๊ณ , ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฏ๋ก Thread ํด๋์ค๋ฅผ ์ง์  ์์ํ๋ ๋ฐฉ์๋ณด๋ค ๋ ์ ์ฐํ๊ณ ์ ์ง๋ณด์ ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค.
์ค๋ ๋ ์ ์ด์ ์๋ช
 ์ฃผ๊ธฐ
์ค๋ ๋์ ๊ธฐ๋ณธ ์ ๋ณด
Thread ํด๋์ค๋ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณต
/** main Thread */
Thread mainThread = Thread.currentThread();
/**
 * Thread[#1,main,5,main]
 * [threadId, threadName, threadPriority, threadGroup]
 */
log("mainThread = " + mainThread);
/**
 * 1
 * ์ค๋ ๋์ ๊ณ ์  ์๋ณ์๋ฅผ ๋ฐํํ๋ ๋ฉ์๋(๊ฐ ์ค๋ ๋์ ๋ํด ์ ์ผํ ID) โ ID๋ ์ค๋ ๋๊ฐ ์์ฑ๋  ๋ ํ ๋น๋๋ฉฐ, ์ง์  ์ง์ ํ  ์ ์๋ค
 */
log("mainThread.threadId() = " + mainThread.threadId());
/**
 * main
 * ์ค๋ ๋์ ์ด๋ฆ์ ๋ฐํํ๋ ๋ฉ์๋
 * ์ค๋ ๋ ID๋ ์ค๋ณต๋์ง ์์ง๋ง, ์ค๋ ๋ ์ด๋ฆ์ ์ค๋ณต๋  ์ ์๋ค.
 */
log("mainThread.getName() = " + mainThread.getName());
/**
 * 5
 * ์ค๋ ๋์ ์ฐ์ ์์๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
 * ์ฐ์ ์์๋ 1(๊ฐ์ฅ ๋ฎ์)์์ 10(๊ฐ์ฅ ๋์)๊น์ง์ ๊ฐ์ผ๋ก ์ค์ ํ  ์ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ 5
 * setPriority() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ฐ์ ์์๋ฅผ ๋ณ๊ฒฝ ๊ฐ๋ฅ
 * ์ฐ์ ์์๋ ์ค๋ ๋ ์ค์ผ์ค๋ฌ๊ฐ ์ด๋ค ์ค๋ ๋๋ฅผ ์ฐ์  ์คํํ ์ง ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ. ํ์ง๋ง ์ค์  ์คํ ์์๋ JVM ๊ตฌํ๊ณผ ์ด์์ฒด์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค.
 */
log("mainThread.getPriority() = " + mainThread.getPriority());
/**
 * java.lang.ThreadGroup[name=main,maxpri=10]
 * ์ค๋ ๋๊ฐ ์ํ ์ค๋ ๋ ๊ทธ๋ฃน์ ๋ฐํํ๋ ๋ฉ์๋
 * ์ค๋ ๋ ๊ทธ๋ฃน์ ์ค๋ ๋๋ฅผ ๊ทธ๋ฃนํํ์ฌ ๊ด๋ฆฌํ  ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต
 * ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋  ์ค๋ ๋๋ ๋ถ๋ชจ ์ค๋ ๋์ ๋์ผํ ์ค๋ ๋ ๊ทธ๋ฃน์ ์ํจ
 * ์ค๋ ๋ ๊ทธ๋ฃน์ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ ํน์  ์์
(์: ์ผ๊ด ์ข
๋ฃ, ์ฐ์ ์์ ์ค์  ๋ฑ)์ ์ํ ๊ฐ๋ฅ
 * 
 * ๋ถ๋ชจ ์ค๋ ๋(Parent Thread)
 * ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํ๋ ์ค๋ ๋๋ฅผ ์๋ฏธ
 * ์ค๋ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์ค๋ ๋์ ์ํด ์์ฑ. ์ด๋ฌํ ์์ฑ ๊ด๊ณ์์ ์๋ก ์์ฑ๋ ์ค๋ ๋๋ ์์ฑํ ์ค๋ ๋๋ฅผ ๋ถ๋ชจ๋ก ๊ฐ์ฃผ
 */
log("mainThread.getThreadGroup() = " + mainThread.getThreadGroup());
/**
 * RUNNABLE
 * ์ค๋ ๋์ ํ์ฌ ์ํ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
 * ๋ฐํ๋๋ ๊ฐ์ Thread.State ์ด๊ฑฐํ์ ์ ์๋ ์์ ์ค ํ๋
 * - NEW: ์ค๋ ๋๊ฐ ์์ง ์์๋์ง ์์ ์ํ
 * - RUNNABLE: ์ค๋ ๋๊ฐ ์คํ ์ค์ด๊ฑฐ๋ ์คํ๋  ์ค๋น๊ฐ ๋ ์ํ
 * - WAITING: ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋์ ํน์  ์์
์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ํ
 * - TIMED_WAITING: ์ผ์  ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ
 * - BLOCKED: ์ค๋ ๋๊ฐ ๋๊ธฐํ ๋ฝ์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ์ด
 * - TERMINATED: ์ค๋ ๋๊ฐ ์คํ์ ๋ง์น ์ํ
 */
log("mainThread.getState() = " + mainThread.getState());์ค๋ ๋์ ์๋ช
 ์ฃผ๊ธฐ
์ค๋ ๋๋ ์์ฑํ๊ณ ์์ํ๊ณ , ์ข ๋ฃ๋๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ค.

โน๏ธ New (์๋ก์ด ์ํ)
- ์ค๋ ๋๊ฐ ์์ฑ๋๊ณ ์์ง ์์๋์ง ์์ ์ํ 
- Thread ๊ฐ์ฒด๊ฐ ์์ฑ๋์์ง๋ง start() ๋ฉ์๋๊ฐ ํธ์ถ๋์ง ์์ ์ํ 
- Thread thread = new Thread(runnable);
โน๏ธ Runnable (์คํ ๊ฐ๋ฅ ์ํ)
- ์ค๋ ๋๊ฐ ์คํ๋ ์ค๋น๊ฐ ๋์ด CPU์์ ์คํ๋ ์ ์๋ ์ํ - thread.start()๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ์ค๋ ๋๋ Runnable ์ํ๋ก ์ ์ด
 
- Runnable ์ํ์ ์๋ ๋ชจ๋ ์ค๋ ๋๊ฐ ๋์์ ์คํ๋๋ ๊ฒ์ ์๋๋ค. - ์ด์์ฒด์ ์ ์ค์ผ์ค๋ฌ๊ฐ ๊ฐ ์ค๋ ๋์ CPU ์๊ฐ์ ํ ๋นํ์ฌ ์คํํ๊ธฐ ๋๋ฌธ์, 
- Runnable ์ํ์ ์๋ ์ค๋ ๋๋ ์ค์ผ์ค๋ฌ์ ์คํ ๋๊ธฐ์ด์ ํฌํจ๋์ด ์๋ค๊ฐ ์ฐจ๋ก๋ก CPU์์ ์คํ 
 
- ์ด์์ฒด์  ์ค์ผ์ค๋ฌ์ ์คํ ๋๊ธฐ์ด์ ์๋ , CPU์์ ์ค์  ์คํ๋๊ณ ์๋ ๋ชจ๋ RUNNABLE ์ํ - ์๋ฐ์์ ๋์ ๊ตฌ๋ถํด์ ํ์ธํ ์ ์์ด์ ๋ณดํต ์คํ ์ํ๋ผ๊ณ ๋ถ๋ฆ 
 
โน๏ธ Blocked (์ฐจ๋จ ์ํ)
- ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋์ ์ํด ๋๊ธฐํ ๋ฝ์ ์ป๊ธฐ ์ํด ๊ธฐ๋ค๋ฆฌ๋ ์ํ - synchronized ๋ธ๋ก์ ์ง์ ํ๊ธฐ ์ํด ๋ฝ์ ์ป์ด์ผ ํ๋ ๊ฒฝ์ฐ 
 
โน๏ธ Waiting (๋๊ธฐ ์ํ)
- ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋์ ํน์  ์์ ์ด ์๋ฃ๋๊ธฐ๋ฅผ ๋ฌด๊ธฐํ ๊ธฐ๋ค๋ฆฌ๋ ์ํ - wait(),- join()๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ Waiting ์ํ๋ก ์ ์ด
 
- ๋ค๋ฅธ ์ค๋ ๋๊ฐ - notify()or- notifyAll()๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋,- join()์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐ
โน๏ธ Timed Waiting (์๊ฐ ์ ํ ๋๊ธฐ ์ํ)
- ์ค๋ ๋๊ฐ ํน์  ์๊ฐ ๋์ ๋ค๋ฅธ ์ค๋ ๋์ ์์ ์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ํ - sleep(long millis),- wait(long timeout),- join(long millis)๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ Timed Waiting ์ํ๋ก ์ ์ด
 
- ์ฃผ์ด์ง ์๊ฐ์ด ๊ฒฝ๊ณผํ๊ฑฐ๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ํด๋น ์ค๋ ๋๋ฅผ ๊นจ์ฐ๋ฉด ์ด ์ํ์์ ๋ฒ์ด๋จ 
โน๏ธ Terminated (์ข ๋ฃ ์ํ)
- ์ค๋ ๋์ ์คํ์ด ์๋ฃ๋ ์ํ - ์ค๋ ๋๊ฐ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋๊ฑฐ๋, ์์ธ๊ฐ ๋ฐ์ํ์ฌ ์ข ๋ฃ๋ ๊ฒฝ์ฐ Terminated ์ํ๋ก ์ ์ด 
 
- ์ค๋ ๋๋ ํ ๋ฒ ์ข ๋ฃ๋๋ฉด ๋ค์ ์์ํ ์ ์์ 
public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(new MyRunnable(), "myThread");
    log("myThread.state1 = " + thread.getState()); // (1) NEW
    log("myThread.start()");
    thread.start();
    Thread.sleep(1000);
    log("myThread.state3 = " + thread.getState()); // (3) TIMED_WAITING (Thread.sleep())
    Thread.sleep(4000);
    log("myThread.state5 = " + thread.getState()); // (5) TERMINATED
    log("end");
}
static class MyRunnable implements Runnable {
    public void run() {
        try {
            log("start");
            log("myThread.state2 = " + Thread.currentThread().getState()); // (2) RUNNABLE
            log("sleep() start");
            Thread.sleep(3000);
            log("sleep() end");
            log("myThread.state4 = " + Thread.currentThread().getState()); // (4) RUNNABLE
            log("end");
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}์ฐธ๊ณ . ์๋ฐ์์ ๋ฉ์๋ ์ฌ์ ์ ์, ์ฌ์ ์ ๋ฉ์๋๊ฐ ์ง์ผ์ผํ ์์ธ์ ๊ด๋ จ๋ ๊ท์น
- ์ฒดํฌ ์์ธ - ๋ถ๋ชจ ๋ฉ์๋๊ฐ ์ฒดํฌ ์์ธ๋ฅผ ๋์ง์ง ์๋ ๊ฒฝ์ฐ, ์ฌ์ ์๋ ์์ ๋ฉ์๋๋ ์ฒดํฌ ์์ธ๋ฅผ ๋์ง ์ ์์ 
- ์์ ๋ฉ์๋๋ ๋ถ๋ชจ ๋ฉ์๋๊ฐ ๋์ง ์ ์๋ ์ฒดํฌ ์์ธ์ ํ์ ํ์ ๋ง ๋์ง ์ ์์ 
 
- ์ธ์ฒดํฌ(๋ฐํ์) ์์ธ - ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ์ง ์์ผ๋ฏ๋ก ์๊ด์์ด ๋์ง ์ ์์ 
 
run() ๋ฉ์๋๋ ์ฒดํฌ ์์ธ๋ฅผ ๋์ง ์ ์๋๋ก ๊ฐ์ ํ์ฌ ํ๋ก๊ทธ๋จ์ด ๋น์ ์ ์ข ๋ฃ๋๋ ์ํฉ์ ๋ฐฉ์ง
๋ฉํฐ ์ค๋ ๋ฉ ํ๊ฒฝ์์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํจ์ผ๋ก์จ ์ค๋ ๋์ ์์ ์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ ์ง
์ต๊ทผ์๋ ์ฒดํฌ ์์ธ๋ณด๋ค๋ ์ธ์ฒดํฌ ์์ธ๋ฅผ ์ ํธ
...
โน๏ธ Join
- ๊ธฐ๋์ ๋ค๋ฅด๊ฒ ๋ ๊ฒฐ๊ณผ ๋ชจ๋ 0์ด ๋์จ๋ค. 
Waiting (๋๊ธฐ ์ํ)
- ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋์ ํน์  ์์ ์ด ์๋ฃ๋๊ธฐ๋ฅผ ๋ฌด๊ธฐํ ๊ธฐ๋ค๋ฆฌ๋ ์ํ 
- join()์ ํธ์ถํ๋ ์ค๋ ๋๋ ๋์ ์ค๋ ๋๊ฐ- TERMINATED์ํ๊ฐ ๋ ๋ ๊น์ง ๋๊ธฐ- ๋์ ์ค๋ ๋๊ฐ - TERMINATED์ํ๊ฐ ๋๋ฉด ํธ์ถ ์ค๋ ๋๋ ๋ค์- RUNNABLE์ํ๊ฐ ๋๋ฉด์ ๋ค์ ์ฝ๋๋ฅผ ์ํ
 
ํน์  ์ค๋ ๋๊ฐ ์๋ฃ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ์ํฉ์ด๋ผ๋ฉด join() ์ ์ฌ์ฉํ์.
๋ค๋ฅธ ์ค๋ ๋์ ์์ ์ ์ผ์  ์๊ฐ ๋์๋ง ๊ธฐ๋ค๋ฆด ๊ฒฝ์ฐ
- join(): ํธ์ถ ์ค๋ ๋๋ ๋์ ์ค๋ ๋๊ฐ ์๋ฃ๋ ๋ ๊น์ง ๋ฌดํ์  ๋๊ธฐ
- join(ms): ํธ์ถ ์ค๋ ๋๋ ํน์  ์๊ฐ ๋งํผ๋ง ๋๊ธฐ- ํธ์ถ ์ค๋ ๋๋ ์ง์ ํ ์๊ฐ์ด ์ง๋๋ฉด ๋ค์ RUNNABLE ์ํ๊ฐ ๋๋ฉด์ ๋ค์ ์ฝ๋๋ฅผ ์ํ 
 
...
โน๏ธ Interrupt
์ธํฐ๋ฝํธ๋ฅผ ์ฌ์ฉํ๋ฉด
WAITING,TIMED_WAITING๊ฐ์ ๋๊ธฐ ์ํ์ ์ค๋ ๋๋ฅผ ์ง์  ๊นจ์์,์๋ํ๋
RUNNABLE์ํ๋ก ๋ง๋ค ์ ์๋ค.
์ค๋ ๋๊ฐ ์ธํฐ๋ฝํธ ์ํ์ผ ๋
- InterruptedException ์ ๋์ง๋ ๋ฉ์๋(ex. Thread.sleep())๋ฅผ ํธ์ถํ๊ฑฐ๋ 
- ์ด๋ฏธ ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๋๊ธฐ์ค์ด๋ผ๋ฉด InterruptedException ๋ฐ์ 
Thread.currentThread().isInterrupted()
- ์ค๋ ๋์ ์ธํฐ๋ฝํธ ์ํ๋ฅผ ๋จ์ํ ํ์ธ 
Thread.interrupted()
- ์ธํฐ๋ฝํธ๋ฅผ ์ง์  ์ฒดํฌํด์ ์ฌ์ฉํ ๊ฒฝ์ฐ - ์ค๋ ๋๊ฐ ์ธํฐ๋ฝํธ ์ํ์ผ ๊ฒฝ์ฐ, - true ๋ฐํํ ํด๋น ์ค๋ ๋์ ์ธํฐ๋ฝํธ- ์ํ๋ฅผ false ๋ก ๋ณ๊ฒฝ
- ์ค๋ ๋๊ฐ ์ธํฐ๋ฝํธ ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ, - false ๋ฐํํ ํด๋น ์ค๋ ๋์ ์ธํฐ๋ฝํธ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์
 
์ธํฐ๋ฝํธ ์์ธ๊ฐ ๋ฐ์ํ๊ณ , ์ค๋ ๋์ ์ธํฐ๋ฝํธ ์ํ๋ฅผ ์ ์(false)์ผ๋ก ๋๋ฆฌ์ง ์์ผ๋ฉด, ์ดํ์๋ ๊ณ์ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์
๊ทธ๋ฌ๋ฏ๋ก, ์๋ฐ์์ ์ธํฐ๋ฝํธ ์์ธ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ธํฐ๋ฝํธ์ ๋ชฉ์ ์ ๋ฌ์ฑํ๋ฉด, ์ค๋ ๋์ ์ธํฐ๋ฝํธ ์ํ๋ฅผ ๋ค์ ์ ์(false)์ผ๋ก ๋๋ฆฐ๋ค.
InterruptedException
Thread.interrupted()
ํ๋ฆฐํฐ ์์ 
- ์ข ๋ฃ ์ ๋ ฅ ์ ๋ฐ๋ก ๋ฐ์ํ์ง ์๋ ๋ฌธ์  
 
- ์ข ๋ฃ(q)๋ฅผ ์ ๋ ฅํ๋ฉด ์ฆ์ ์ข ๋ฃ 
 
- Thread.interrupted() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ค๋ ๋๊ฐ ์ธํฐ๋ฝํธ ์ํ์ธ์ง ์๋์ง ํ์ธํ๊ณ , ์ค๋ ๋์ ์ธํฐ๋ฝํธ ์ํ๋ฅผ ๋ค์ ์ ์์ผ๋ก ์ ํ 
 
- yield๋ฅผ ํ์ฉํ CPU ์์ ์๋ณด - ์์ ์ด ๋น์ด์์ผ๋ฉด ๋ค๋ฅธ ์ค๋ ๋์ ์์ ์ ์๋ณด 
 
...
โน๏ธ Yield
ํ์ฌ ์คํ ์ค์ธ ์ค๋ ๋๊ฐ ์๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ์ค๋ ๋์๊ฒ CPU๋ฅผ ์๋ณด
yield() ๋ฉ์๋๋ฅผ ํธ์ถํ ์ค๋ ๋๋ RUNNABLE ์ํ๋ฅผ ์ ์ง
์๋ฐ์์ Thread.yield() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ํ์ฌ ์คํ ์ค์ธ ์ค๋ ๋๊ฐ CPU๋ฅผ ์๋ณดํ๋๋ก ํํธ ์ ๊ณต
- ๋ค๋ฅธ ์ค๋ ๋์๊ฒ ์คํ ๊ธฐํ๋ฅผ ์ ๊ณต 
- RUNNABLE์ํ๋ฅผ ์ ์งํ๊ธฐ ๋๋ฌธ์, ์๋ณดํ ์ค๋ ๋๊ฐ ์๋ค๋ฉด ๋ณธ์ธ ์ค๋ ๋๊ฐ ๊ณ์ ์คํ
...
โน๏ธ volatile
๋ฉ๋ชจ๋ฆฌ ๊ฐ์์ฑ(memory visibility)
๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ํ ์ค๋ ๋๊ฐ ๋ณ๊ฒฝํ ๊ฐ์ด ๋ค๋ฅธ ์ค๋ ๋์์ ์ธ์  ๋ณด์ด๋์ง์ ๋ํ ๋ฌธ์ 
์ด๋ฆ ๊ทธ๋๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ณ๊ฒฝํ ๊ฐ์ด ๋ณด์ด๋๊ฐ, ๋ณด์ด์ง ์๋๊ฐ์ ๋ฌธ์ 
๋ฉ๋ชจ๋ฆฌ ๊ฐ์์ฑ(memory visibility) ๋ฌธ์ 
- ์ค๋ ๋๊ฐ while ๋ฌธ์์ ๋น ์ ธ๋์ค์ง ๋ชปํ๊ณ ๊ณ์ ์คํ ์ํ 
.
volatile
์ฌ๋ฌ ์ค๋ ๋์์ ๊ฐ์ ๊ฐ์ ์ฝ๊ณ ์จ์ผ ํ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ ํค์๋
- ์บ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด CPU ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๊ฐ์ ํ์ง๋ง, ๋๋ก๋ ์ฑ๋ฅ ํฅ์๋ณด๋ค ์ฌ๋ฌ ์ค๋ ๋์์ ๊ฐ์ ์์ ์ ์ ํํ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๊ฒ์ด ๋ ์ค์ํ ์ ์์ 
- ์ด ๊ฒฝ์ฐ, ์ฑ๋ฅ์ ์ฝ๊ฐ ํฌ๊ธฐํ๋ ๋์ ๊ฐ์ ์ฝ๊ณ ์ธ ๋ ๋ชจ๋ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ง์  ์ ๊ทผํ๋๋ก ์๋ฐ์์๋ - volatileํค์๋ ์ ๊ณต

Java Memory Model
โน๏ธ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์์ฑ(memory visibility)
- ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ํ ์ค๋ ๋๊ฐ ๋ณ๊ฒฝํ ๊ฐ์ด ๋ค๋ฅธ ์ค๋ ๋์์ ์ธ์  ๋ณด์ด๋์ง์ ๋ํ ๊ฒ 
- ๋ฉ๋ชจ๋ฆฌ์ ๋ณ๊ฒฝํ ๊ฐ์ด ๋ณด์ด๋๊ฐ, ๋ณด์ด์ง ์๋๊ฐ์ ๋ฌธ์  
...
โน๏ธ Java Memory Model
- Java Memory Model(JMM)์ ์๋ฐ ํ๋ก๊ทธ๋จ์ด ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๋์ง๋ฅผ ๊ท์  
- ํนํ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์์ ์ค๋ ๋ ๊ฐ์ ์ํธ์์ฉ์ ์ ์ 
- ํต์ฌ์ ์ฌ๋ฌ ์ค๋ ๋๋ค์ ์์ ์์๋ฅผ ๋ณด์ฅํ๋ happens-before ๊ด๊ณ์ ๋ํ ์ ์ 
...
โน๏ธ happens-before
- Java Memory Model(JMM)์์ ์ค๋ ๋ ๊ฐ์ ์์ ์์๋ฅผ ์ ์ํ๋ ๊ฐ๋  
- ํ ์ค๋ ๋์์ ์ํํ ์์ ์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ฐธ์กฐํ ๋ ์ต์ ์ํ๊ฐ ๋ณด์ฅ 
- ex. A ์์ ์์ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ B ์์ ์ด ์์๋๊ธฐ ์ ์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ 
.
happens-before ๊ด๊ณ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
- ํ๋ก๊ทธ๋จ ์์ ๊ท์น 
- volatile ๋ณ์ ๊ท์น 
- ์ค๋ ๋ ์์/์ข ๋ฃ/์ธํฐ๋ฝํธ ๊ท์น 
- ๊ฐ์ฒด ์์ฑ ๊ท์น 
- ๋ชจ๋ํฐ ๋ฝ ๊ท์น 
- ์ ์ด ๊ท์น 
- ... 
volatile ๋๋ ์ค๋ ๋ ๋๊ธฐํ ๊ธฐ๋ฒ(synchronized, ReentrantLock ..)์ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ฐ์์ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค
synchronized
์๋ฐ์์ ๋๊ธฐํ(synchronization)๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ ์ ์๋ ์์(์: ๊ฐ์ฒด, ๋ฉ์๋)์ ๋ํด ์ผ๊ด์ฑ ์๊ณ ์์ ํ ์ ๊ทผ์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ
๋๊ธฐํ๋ ์ฃผ๋ก ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ (๋ฐ์ดํฐ ์์์ด๋ ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ)๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ
- ์๋ฐ๋ ๋ฉํฐ์ค๋ ๋๋ฅผ ๊ณ ๋ คํ๊ณ ๋์จ ์ธ์ด๋ก JDK 1.0 ๋ถํฐ synchronized ๊ฐ์ ๋๊ธฐํ ๋ฐฉ๋ฒ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฌธ๋ฒ์ ํฌํจํด์ ์ ๊ณต 
์ฅ์ .
- ํธ๋ฆฌํจ: ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฌธ๋ฒ์ผ๋ก ์ ๊ณตํ์ฌ - ํธ๋ฆฌํ ์ฌ์ฉ
- ์๋ ์ ๊ธ ํด์ : synchronized ๋ฉ์๋๋ ๋ธ๋ก์ด ์๋ฃ๋๋ฉด ์๋์ผ๋ก ๋ฝ์ ๋๊ธฐ์ค์ธ ๋ค๋ฅธ ์ค๋ ๋์ - ์ ๊ธ์ด ํด์ - ๊ฐ๋ฐ์๊ฐ ์ง์  ํน์  ์ค๋ ๋๋ฅผ ๊นจ์ฐ๋๋ก ๊ด๋ฆฌํด์ผ ํ๋ค๋ฉด, ๋งค์ฐ ์ด๋ ต๊ณ ๋ฒ๊ฑฐ๋ก์ 
 
๋จ์ 
- ๋จ์ํ ๊ธฐ๋ฅ: ํธ๋ฆฌํ์ง๋ง ์ ๊ณตํ๋ - ๊ธฐ๋ฅ์ด ๋๋ฌด ๋จ์
- ๋ฌดํ ๋๊ธฐ: BLOCKED ์ํ์ ์ค๋ ๋๋ ๋ฝ์ด ํ๋ฆด ๋ ๊น์ง - ๋ฌดํ ๋๊ธฐ- ํ์์์์ด๋ ์ค๊ฐ์ ์ธํฐ๋ฝํธ ๋ถ๊ฐ 
 
- ๊ณต์ ์ฑ: ๋ฝ์ด ๋์์์ ๋ BLOCKED ์ํ์ ์ฌ๋ฌ ์ค๋ ๋ ์ค์ ์ด๋ค ์ค๋ ๋๊ฐ ๋ฝ์ ํ๋ํ ์ง ์ ์ ์์ 
๋ ์ ์ฐํ๊ณ , ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅํ ๋๊ธฐํ ๋ฐฉ๋ฒ๋ค์ด ํ์ํ๊ฒ ๋์ด JDK 1.5 ๋ถํฐ ๋์์ฑ ๋ฌธ์  ํด๊ฒฐ์ ์ํ java.util.concurrent ํจํค์ง๊ฐ ์ถ๊ฐ
Concurrency Issue
๋ฉํฐ์ค๋ ๋๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ์ฃผ์ํด์ผ ํ ์ ์, ๊ฐ์ ์์(๋ฆฌ์์ค)์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ ๋์์ฑ ๋ฌธ์ 
- ๊ณต์ ์์: ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ ๊ทผํ๋ ์์ - ๋ํ์ ์ธ ๊ณต์ ์์์ ์ธ์คํด์ค์ ํ๋(๋ฉค๋ฒ ๋ณ์) 
 
- ๋ฉํฐ์ค๋ ๋ ์ฌ์ฉ ์ ๊ณต์ ์์์ ๋ํ ์ ๊ทผ์ ์ ์ ํ๊ฒ ๋๊ธฐํ(synchronization)ํด์ ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ๋ฐฉ์งํ๋ ๊ฒ์ด ์ค์ 
์ถ๊ธ ์์  ๋์์ฑ ๋ฌธ์ 
...
โน๏ธ ์๊ณ ์์ญ(critical section)
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ๋ฉด ๋ฐ์ดํฐ ๋ถ์ผ์น๋ ์์์น ๋ชปํ ๋์์ด ๋ฐ์ํ ์ ์๋ ์ํํ๊ณ , ์ค์ํ ์ฝ๋
- ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํด์๋ ์ ๋๋ ๊ณต์ ์์์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ๋ ๋ถ๋ถ - ex. ๊ณต์ ๋ณ์๋ ๊ณต์ ๊ฐ์ฒด๋ฅผ ์์  
 
- ์๊ณ ์์ญ์ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๋๋ก ์์ ํ๊ฒ ๋ณดํธ๊ฐ ํ์ 
- ์๋ฐ๋ synchronized ํค์๋๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ์๊ณ ์์ญ์ ๋ณดํธ 
synchronized method
๋ฉ์๋๋ฅผ synchronized ๋ก ์ ์ธํด์, ๋ฉ์๋์ ์ ๊ทผํ๋ ์ค๋ ๋๊ฐ ํ๋๋ฟ์ด๋๋ก ๋ณด์ฅ
public synchronized void synchronizedMethod() {
    // something
}- ๋ชจ๋ ๊ฐ์ฒด(์ธ์คํด์ค)๋ ๋ด๋ถ์ ์์ ๋ง์ ๋ฝ(lock)์ ๋ณด์ - aka. ๋ชจ๋ํฐ ๋ฝ(monitor lock) 
- ๊ฐ์ฒด ๋ด๋ถ์ ์๋ค๋ณด๋ ํ์ธํ๊ธฐ๋ ์ด๋ ค์ 
 
- ์ค๋ ๋๊ฐ synchronized ํค์๋๊ฐ ์๋ ๋ฉ์๋์ ์ง์ ํ๋ ค๋ฉด ๋ฐ๋์ ํด๋น ์ธ์คํด์ค์ ๋ฝ์ด ํ์ - (thread1) synchronized ๋ฉ์๋ ํธ์ถ ์ ๋ฝ ํ๋ ์๋ 
- (thread2) ๋ฝ์ด ์์ ๊ฒฝ์ฐ ํ๋ํ ๋๊น์ง BLOCKED ์ํ๋ก ๋๊ธฐ 
- (thread1) ๋ฉ์๋ ํธ์ถ์ด ๋๋๋ฉด ๋ฝ์ ๋ฐ๋ฉ 
- (thread2) ๋ฝ ํ๋์ ๋๊ธฐํ๋ ์ค๋ ๋๋ ์๋์ผ๋ก ๋ฝ์ ํ๋ 
 
- ์ฐธ๊ณ ) ๋ฝ์ ํ๋ํ๋ ์์๋ ๋ณด์ฅ๋์ง ์์ 
- ์ฐธ๊ณ ) ์๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์์ฑ ๋ฌธ์ ๋ ์๋์ผ๋ก ํด๊ฒฐ 
synchronized code block
์ฝ๋ ๋ธ๋ก์ synchronized ๋ก ๊ฐ์ธ์, ๋๊ธฐํ๋ฅผ ๊ตฌํ
public void method() {
    synchronized(this) {
        // synchronized code
    }
}- synchronized ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ด์ ๋จ์ ์ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์คํํ ์ ์๋ค๋ ์  
- ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์คํํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์, ์ ์ฒด๋ก ๋ณด๋ฉด ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์์ 
- ๋ฐ๋ผ์ - synchronized๋ฅผ ํตํด ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๋์์ ์คํํ ์ ์๋ ์ฝ๋ ๊ตฌ๊ฐ์ ๊ผญ ํ์ํ ๊ณณ์ผ๋ก ํ์ ํด์ ์ค์ ์ด ํ์- synchronized code block์ผ๋ก ํ์ํ ๋ถ๋ถ์ ์๊ณ ์์ญ์ ์ง์  ๊ฐ๋ฅ
- ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ํ๋๋ ๋ถ๋ถ์ ๋ ๋๋ ค์, ์ ์ฒด์ ์ผ๋ก ์ฑ๋ฅ์ ํฅ์ 
 
synchronized code block ์ ์ฉ
...
๋๊ธฐํ๋ฅผ ์ฌ์ฉํด์ ํด๊ฒฐํ  ์ ์๋ ๋ฌธ์ ๋ค
- ๊ฒฝํฉ ์กฐ๊ฑด(Race condition) - ๋ ๊ฐ ์ด์์ ์ค๋ ๋๊ฐ ๊ฒฝ์์ ์ผ๋ก ๋์ผํ ์์์ ์์ ํ ๋ ๋ฐ์ํ๋ ๋ฌธ์  
 
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ - ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ฝ๊ณ , ์ฐ๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์ง 
- ๋๊ธฐํ๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ํ์์ ์ธ ๊ธฐ๋ฅ์ด์ง๋ง, ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ - ๊ผญ ํ์ํ ๊ณณ์ ์ ์ ํ ์ฌ์ฉ ํ์ 
 
 
concurrent.Lock
LockSupport
LockSupport ์
ReentrantLock์์ ํ์ฉ๋์ด synchronized ์ ๋จ์ ์ ๊ทน๋ณตํ๋ฉด์๋๋งค์ฐ ํธ๋ฆฌํ๊ฒ ์๊ณ ์์ญ์ ๋ค๋ฃฐ ์ ์๋ ๋ค์ํ ๊ธฐ๋ฅ ์ ๊ณต
์๋ฐ 1.0๋ถํฐ ์กด์ฌํ synchronized ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ์ ์ฐํ๊ณ , ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ๋ค์ด ํ์
- ์๋ฐ 1.5๋ถํฐ java.util.concurrent ๋ผ๋ ๋์์ฑ ๋ฌธ์  ํด๊ฒฐ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจํค์ง๊ฐ ์ถ๊ฐ 
.
synchronized ๋จ์ 
- ๋ฌดํ ๋๊ธฐ: BLOCKED ์ํ์ ์ค๋ ๋๋ ๋ฝ์ด ํ๋ฆด ๋ ๊น์ง ๋ฌดํ ๋๊ธฐ- ํน์  ์๊ฐ๊น์ง๋ง ๋๊ธฐํ๋ ํ์์์ ๋ถ๊ฐ - โ LockSupport.parkNanos() ๋ฅผ ์ฌ์ฉํ๋ฉด ํน์  ์๊ฐ๊น์ง๋ง ๋๊ธฐ ๊ฐ๋ฅ 
 
- ์ค๊ฐ์ ์ธํฐ๋ฝํธ ๋ถ๊ฐ - โ park(), parkNanos() ๋ ์ธํฐ๋ฝํธ๋ฅผ ๊ฑธ ์ ์์ 
 
 
- ๊ณต์ ์ฑ: ๋ฝ์ด ๋์์์ ๋ BLOCKED ์ํ์ ์ฌ๋ฌ ์ค๋ ๋ ์ค์ ์ด๋ค ์ค๋ ๋๊ฐ ๋ฝ์ ํ๋ํ ์ง ์ ์ ์์- ์ต์ ์ ๊ฒฝ์ฐ ํน์  ์ค๋ ๋๊ฐ ๋๋ฌด ์ค๋๊ธฐ๊ฐ ๋ฝ์ ํ๋ํ์ง ๋ชปํ ์ ์์ 
 
.
LockSupport ๋ํ ๊ธฐ๋ฅ
- park(): ์ค๋ ๋๋ฅผ WAITING ์ํ๋ก ๋ณ๊ฒฝ- ๋๊ฐ ๊นจ์์ฃผ๊ธฐ ์ ๊น์ง๋ ๊ณ์ ๋๊ธฐ 
- CPU ์คํ ์ค์ผ์ค๋ง์ ๋ค์ด๊ฐ์ง ์์ 
 
- parkNanos(nanos): ์ค๋ ๋๋ฅผ ๋๋ ธ์ด ๋์๋ง TIMED_WAITING ์ํ๋ก ๋ณ๊ฒฝ- ์ง์ ํ ๋๋ ธ์ด๊ฐ ์ง๋๋ฉด TIMED_WAITING ์ํ์์ ๋น ์ ธ๋์ค๊ณ RUNNABLE ์ํ๋ก ๋ณ๊ฒฝ 
 
- unpark(thread): WAITING ์ํ์ ๋์ ์ค๋ ๋๋ฅผ RUNNABLE ์ํ๋ก ๋ณ๊ฒฝ
LockSupport.unpark example LockSupport.parkNanos(nanos) example
...
โน๏ธ BLOCKED vs WAITING
BLOCKED , WAITING , TIMED_WAITING ์ํ ๋ชจ๋ ์ค๋ ๋๊ฐ ๋๊ธฐ
- ์คํ ์ค์ผ์ค๋ง์ ๋ค์ด๊ฐ์ง ์๊ธฐ ๋๋ฌธ์, CPU ์ ์ฅ์์ ๋ณด๋ฉด ์คํํ์ง ์๋ ๋น์ทํ ์ํ 
BLOCKED ์ํ
- synchronized ์์ ๋ฝ์ ํ๋ํ๊ธฐ ์ํด ๋๊ธฐํ ๋ ์ฌ์ฉ - synchronized ์์๋ง ์ฌ์ฉํ๋ ํน๋ณํ ๋๊ธฐ ์ํ 
 
- ์ธํฐ๋ฝํธ๊ฐ ๊ฑธ๋ ค๋ ๋๊ธฐ ์ํ๋ฅผ ๋น ์ ธ๋์ค์ง ๋ชปํจ 
WAITING, TIMED_WAITING ์ํ
- ๋ฒ์ฉ์ ์ผ๋ก ํ์ฉํ ์ ์๋ ๋๊ธฐ ์ํ 
- ์ธํฐ๋ฝํธ๊ฐ ๊ฑธ๋ฆฌ๋ฉด ๋๊ธฐ ์ํ๋ฅผ ๋น ์ ธ๋์ค๊ณ , RUNNABLE ์ํ๋ก ๋ณ๊ฒฝ 
- ๋ค์ํ ์ํฉ์์ ์ฌ์ฉ - Thread.join() , Thread.join(long millis) 
- Thread.park() , Thread.parkNanos(long millis) 
- Object.wait() , Object.wait(long timeout) 
 
ReentrantLock
synchronized ์ BLOCKED ์ํ๋ฅผ ํตํ ํตํ ์๊ณ ์์ญ ๊ด๋ฆฌ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด
์๋ฐ 1.5๋ถํฐ Lock ์ธํฐํ์ด์ค์ ReentrantLock ๊ตฌํ์ฒด๋ฅผ ์ ๊ณต
์ฐธ๊ณ . ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ ๋ฝ์ ๊ฐ์ฒด ๋ด๋ถ์ ์๋ ๋ชจ๋ํฐ ๋ฝ์ด ์๋
- Lock ์ธํฐํ์ด์ค์ ReentrantLock ์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ 
- ๋ชจ๋ํฐ ๋ฝ๊ณผ BLOCKED ์ํ๋ synchronized ์์๋ง ์ฌ์ฉ 
...
โน๏ธ Lock Interface
- ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์์ ์ฐ์ด๋ ์์ ํ ์๊ณ ์์ญ์ ์ํ ๋ฝ์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ - synchronized ์ ๋จ์ ์ธ ๋ฌดํ ๋๊ธฐ ๋ฌธ์  ํด๊ฒฐ 
 
- ๊ณ ์์ค์ ๋๊ธฐํ ๊ธฐ๋ฒ์ ๊ตฌํ ๊ฐ๋ฅ - ๋ฝ์ ํน์  ์๊ฐ ๋งํผ๋ง ์๋ํ๊ฑฐ๋, ์ธํฐ๋ฝํธ ๊ฐ๋ฅํ ๋ฝ์ ์ฌ์ฉํ ๋ ์ ์ฉ 
- ๊ฐ๋ฐ์์๊ฒ ๋ค์ํ ์ ํ๊ถ์ ์ ๊ณต 
 
- ๋ํ์ ์ธ ๊ตฌํ์ฒด๋ก ReentrantLock 
public interface Lock {
    /** 
     * ๋ฝ์ ํ๋
     * - ๋ง์ฝ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ด๋ฏธ ๋ฝ์ ํ๋ํ๋ค๋ฉด, ๋ฝ์ด ํ๋ฆด ๋๊น์ง ํ์ฌ ์ค๋ ๋๋ WAITING
     * - ์ธํฐ๋ฝํธ์ ์๋ตํ์ง ์์
     */
    void lock();
    /**
     * ๋ฝ ํ๋์ ์๋ํ๋, ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ธํฐ๋ฝํธํ  ์ ์๋๋ก ํจ
     * - ๋ง์ฝ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ด๋ฏธ ๋ฝ์ ํ๋ํ๋ค๋ฉด, ํ์ฌ ์ค๋ ๋๋ ๋ฝ์ ํ๋ํ  ๋๊น์ง ๋๊ธฐ
     * - ๋๊ธฐ ์ค์ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ฉด InterruptedException ์ด ๋ฐ์ํ๋ฉฐ ๋ฝ ํ๋์ ํฌ๊ธฐ
     */
    void lockInterruptibly() throws InterruptedException;
    /**
     * ํ๋์ ์๋ํ๊ณ , ์ฆ์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ฐํ
     * - ๋ง์ฝ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ด๋ฏธ ๋ฝ์ ํ๋ํ๋ค๋ฉด false ๋ฐํ
     * - ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฝ์ ํ๋ํ๊ณ  true ๋ฐํ
     */
    boolean tryLock();
    /**
     * ์ฃผ์ด์ง ์๊ฐ ๋์ ๋ฝ ํ๋ ์๋
     * - ์ฃผ์ด์ง ์๊ฐ ์์ ๋ฝ์ ํ๋ํ๋ฉด true ๋ฐํ
     * - ์ฃผ์ด์ง ์๊ฐ์ด ์ง๋๋ ๋ฝ์ ํ๋ํ์ง ๋ชปํ ๊ฒฝ์ฐ false ๋ฐํ
     * - ๋๊ธฐ ์ค ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ฉด InterruptedException ์ด ๋ฐ์ํ๋ฉฐ ๋ฝ ํ๋์ ํฌ๊ธฐ
     */
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    /**
     * ๋ฝ์ ํด์ 
     * - ๋ฝ์ ํด์ ํ๋ฉด ๋ฝ ํ๋์ ๋๊ธฐ ์ค์ธ ์ค๋ ๋ ์ค ํ๋๊ฐ ๋ฝ์ ํ๋ํ  ์ ์๊ฒ ๋จ
     * - ๋ฝ์ ํ๋ํ ์ค๋ ๋๊ฐ ํธ์ถํด์ผ ํ๋ฉฐ
     * - ๊ทธ๋ ์ง ์์ผ๋ฉด IllegalMonitorStateException ๋ฐ์
     */
    void unlock();
    /**
     * Condition ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฐํ
     * - Condition ๊ฐ์ฒด๋ ๋ฝ๊ณผ ๊ฒฐํฉ๋์ด ์ฌ์ฉ
     * - ์ค๋ ๋๊ฐ ํน์  ์กฐ๊ฑด์ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ ํธ๋ฅผ ๋ฐ์ ์ ์๋๋ก ํจ
     * - Object.wait(), notify(), notifyAll() ๋ฉ์๋์ ์ ์ฌํ ์ญํ 
     */
    Condition newCondition();
}...
โน๏ธ ๊ณต์ ์ฑ
Lock ์ธํฐํ์ด์ค์ ๋ํ์ ์ธ ๊ตฌํ์ฒด ReentrantLock ํด๋์ค๋
์ค๋ ๋๊ฐ ๊ณต์ ํ๊ฒ ๋ฝ์ ์ป์ ์ ์๋ ๋ชจ๋๋ฅผ ์ ๊ณต
ReentrantLock ๋ฝ์ ๊ณต์ ์ฑ(fairness) ๋ชจ๋์ ๋น๊ณต์ (non-fair) ๋ชจ๋๋ก ์ค์  ๊ฐ๋ฅ
- ์ด ๋ ๋ชจ๋๋ ๋ฝ์ ํ๋ํ๋ ๋ฐฉ์์์ ์ฐจ์ด 
.
๋น๊ณต์  ๋ชจ๋(Non-fair mode)
- ReentrantLock ์ ๊ธฐ๋ณธ ๋ชจ๋ 
- ๋ฝ์ ๋จผ์  ์์ฒญํ ์ค๋ ๋๊ฐ ๋ฝ์ ๋จผ์  ํ๋ํ๋ค๋ ๋ณด์ฅ์ด ์์ - ๋ฝ์ ํ์์ ๋, ๋๊ธฐ ์ค์ธ ์ค๋ ๋ ์ค ์๋ฌด๋ ๋ฝ์ ํ๋ 
- ๋ฝ์ ๋นจ๋ฆฌ ํ๋ํ ์ ์์ง๋ง, ํน์  ์ค๋ ๋๊ฐ ์ฅ๊ธฐ๊ฐ ๋ฝ์ ํ๋ํ์ง ๋ชปํ ๊ฐ๋ฅ์ฑ๋ ์กด์ฌ 
- ๊ทธ๋๋, ๋ด๋ถ์์ ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ - ์ค๋ ๋ ๊ฒฝํฉ์ด ์ฌํ ๋ ์๋ก์ด ์ค๋ ๋๊ฐ ๊ฐ๋ ๋ช ๊ฐ์ฉ ๋จผ์  ์คํ๋๋ ์ ๋ 
 
 
๋น๊ณต์  ๋ชจ๋ ํน์ง
- ์ฑ๋ฅ ์ฐ์: ๋ฝ์ ํ๋ ์๋๊ฐ ๋น ๋ฆ
- ์ ์  ๊ฐ๋ฅ: ์๋ก์ด ์ค๋ ๋๊ฐ ๊ธฐ์กด ๋๊ธฐ ์ค๋ ๋๋ณด๋ค ๋จผ์  ๋ฝ์ ํ๋ํ ์ ์์
- ๊ธฐ์ ํ์ ๊ฐ๋ฅ์ฑ: ํน์  ์ค๋ ๋๊ฐ ๊ณ์ํด์ ๋ฝ์ ํ๋ํ์ง ๋ชปํ ์ ์์
.
๊ณต์  ๋ชจ๋(Fair mode)
- ๋ฝ์ ์์ฒญํ ์์๋๋ก ์ค๋ ๋๊ฐ ๋ฝ์ ํ๋ 
- ๋จผ์  ๋๊ธฐํ ์ค๋ ๋๊ฐ ๋จผ์  ๋ฝ์ ํ๋ํ๊ฒ ๋์ด ์ค๋ ๋ ๊ฐ์ ๊ณต์ ์ฑ์ ๋ณด์ฅ - ๊ทธ๋ฌ๋ ์ด๋ก ์ธํด ์ฑ๋ฅ ์ ํ 
 
๊ณต์  ๋ชจ๋ ํน์ง
- ๊ณต์ ์ฑ ๋ณด์ฅ: ๋๊ธฐ ํ์์ ๋จผ์  ๋๊ธฐํ ์ค๋ ๋๊ฐ ๋ฝ์ ๋จผ์  ํ๋
- ๊ธฐ์ ํ์ ๋ฐฉ์ง: ๋ชจ๋ ์ค๋ ๋๊ฐ ์ธ์ ๊ฐ ๋ฝ์ ํ๋ํ ์ ์๊ฒ ๋ณด์ฅ
- ์ฑ๋ฅ ์ ํ: ์ฐ์ ์์ ์ ์ ์ ์ํด ๋ฝ์ ํ๋ํ๋ ์๋๊ฐ ๋๋ ค์ง ์ ์์
ReentrantLock fair mode example
์์ฐ์ ์๋น์ ๋ฌธ์ 
์์ฐ์(Producer)
- ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ์ญํ 
- ex. ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ฑฐ๋ ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ์ค๋ ๋ 
์๋น์(Consumer)
- ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ญํ 
- ex. ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ์ ์ฅํ๋ ์ค๋ ๋s 
๋ฒํผ(Buffer)
- ์์ฐ์๊ฐ ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ์ผ์์ ์ผ๋ก ์ ์ฅํ๋ ๊ณต๊ฐ 
- ํ์ ๋ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ์์ฐ์์ ์๋น์๊ฐ ์ด ๋ฒํผ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ 
.
์์ฐ์/์๋น์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ์ํฉ
์์ฐ์๊ฐ ๋๋ฌด ๋น ๋ฅผ ๋
- ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ์ ๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ์ ์์ ๋๊น์ง ์์ฐ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑ 
- ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐฌ ๊ฒฝ์ฐ ์์ฐ์๋ ๋ฒํผ์ ๋น ๊ณต๊ฐ์ด ์๊ธธ ๋๊น์ง ๋๊ธฐ 
์๋น์๊ฐ ๋๋ฌด ๋น ๋ฅผ ๋
- ๋ฒํผ๊ฐ ๋น์ด์ ๋ ์ด์ ์๋นํ ๋ฐ์ดํฐ๊ฐ ์์ ๋๊น์ง ์๋น์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ 
- ๋ฒํผ๊ฐ ๋น์ด์์ ๋ ์๋น์๋ ๋ฒํผ์ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ ๋๊น์ง ๋๊ธฐ 
.
์์ฐ์-์๋น์ ๋ฌธ์ (producer-consumer problem)
- ์์ฐ์-์๋น์ ๋ฌธ์ ๋, ์์ฐ์ ์ค๋ ๋์ ์๋น์ ์ค๋ ๋๊ฐ ํน์  ์์์ ํจ๊ป ์์ฐํ๊ณ , ์๋นํ๋ฉด์ ๋ฐ์ํ๋ ๋ฌธ์  
ํ์ ๋ ๋ฒํผ ๋ฌธ์ (bounded-buffer problem)
- ์ด ๋ฌธ์ ๋ ๊ฒฐ๊ตญ ์ค๊ฐ์ ์๋ ๋ฒํผ์ ํฌ๊ธฐ๊ฐ ํ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ 
- ํ์ ๋ ๋ฒํผ ๋ฌธ์ ๋ผ๊ณ ๋ ๋ถ๋ฆผ 
Object wait(), notify()
Object.wait()
- ํ์ฌ ์ค๋ ๋๊ฐ ๊ฐ์ง ๋ฝ์ ๋ฐ๋ฉํ๊ณ ๋๊ธฐ(WAITING) ์ํ๋ก ์ ํ 
- ํ์ฌ ์ค๋ ๋๊ฐ synchronized ๋ธ๋ก์ด๋ ๋ฉ์๋์์ ๋ฝ์ ์์ ํ๊ณ ์์ ๋๋ง ํธ์ถ ๊ฐ๋ฅ 
- ๋๊ธฐ ์ํ๋ก ์ ํ๋ ์ค๋ ๋๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ notify() or notifyAll()์ ํธ์ถํ ๋๊น์ง ๋๊ธฐ ์ํ๋ฅผ ์ ์ง 
Object.notify()
- ๋๊ธฐ ์ค์ธ ์ค๋ ๋ ์ค ํ๋๋ฅผ ๊นจ์ - ๋๊ธฐ ์ค์ธ ์ค๋ ๋๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ ๊ทธ ์ค ํ๋๋ง ๊นจ์ 
 
- synchronized ๋ธ๋ก์ด๋ ๋ฉ์๋์์ ํธ์ถ๋์ด์ผ ํจ 
- ๊นจ์ด ์ค๋ ๋๋ ๋ฝ์ ๋ค์ ํ๋ํ ๊ธฐํ๋ฅผ ์ป์ 
Object.notifyAll()
- ๋๊ธฐ ์ค์ธ ๋ชจ๋ ์ค๋ ๋๋ฅผ ๊นจ์ 
- synchronized ๋ธ๋ก์ด๋ ๋ฉ์๋์์ ํธ์ถ๋์ด์ผ ํจ 
- ๋ชจ๋ ๋๊ธฐ ์ค์ธ ์ค๋ ๋๊ฐ ๋ฝ์ ํ๋ํ ์ ์๋ ๊ธฐํ๋ฅผ ์ป์ 
- ๋ชจ๋ ์ค๋ ๋๋ฅผ ๊นจ์์ผ ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉ 
.
Object wait(), notify()์ ํ๊ณ
- ์ค๋ ๋ ๋๊ธฐ ์งํฉ ํ๋์ ์์ฐ์, ์๋น์ ์ค๋ ๋๋ฅผ ๋ชจ๋ ๊ด๋ฆฌํ๊ณ , - notify()๋ฅผ ํธ์ถํ ๋ ์์์ ์ค๋ ๋๊ฐ ์ ํ- ํ์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ํฉ์ ์๋น์๊ฐ ๊ฐ์ ์๋น์๋ฅผ ๊นจ์ฐ๊ฑฐ๋ 
- ํ์ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ ์ฐจ์๋๋ฐ ์์ฐ์๊ฐ ๊ฐ์ ์์ฐ์๋ฅผ ๊นจ์ฐ๋ ๋นํจ์จ ๋ฐ์ 
 
- ๋๊ธฐ ์ํ์ ์ค๋ ๋๊ฐ ์คํ ์์๋ฅผ ๊ณ์ ์ป์ง ๋ชปํด์ ์คํ๋์ง ์๋ ์ํฉ์ด ์ฌ ์ ์์ โ ์ค๋ ๋ ๊ธฐ์(starvation) ์ํ - notify()๋์- notifyAll()์ ์ฌ์ฉํด์ ์ค๋ ๋ ๊ธฐ์ ๋ฌธ์ ๋ ๋ง์ ์ ์์ง๋ง, ๋นํจ์จ์ ๋ง์ง ๋ชปํจ
 
.
Example
- ์์ฐ์ ์๋น์ ๋ฌธ์  ๋ฐ์ - ์ค๋ ๋๋ฅผ ์ ์ดํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ ๋ ๋ฒํผ ์ํฉ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ - ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐฌ ๊ฒฝ์ฐ: ์์ฐ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฒ๋ฆฐ๋ค. 
- ๋ฒํผ์ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ: ์๋น์๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ํ ์ ์๋ค.(null) 
 
 
- ์์ฐ์ ์๋น์ ๋ฌธ์  DeadLock - ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด์ ์ค๋ ๋๋ฅผ ๋๊ธฐํ๋ ๋ฐฉ๋ฒ 
- ์๊ณ ์์ญ ์์์ ๋ฝ์ ๋ค๊ณ ๋๊ธฐํ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์๊ณ ์์ญ์ ์ ๊ทผํ ์ ์์ 
- ๋๋จธ์ง ์ค๋ ๋๋ ๋ชจ๋ BLOCKED ์ํ๊ฐ ๋๊ณ , ์ค๋ ๋๋ค์ด ๋ฉ์ถ๋ ๋ฌธ์  ๋ฐ์ 
 
- ์์ฐ์ ์๋น์ ๋ฌธ์  Object wait(), notify() ์ ์ฉ - wait(), notify(), notifyAll()์ ์ฌ์ฉํด์ ๋ฌธ์  ํด๊ฒฐ 
- ํ์ง๋ง, ์ํ๋ ์ค๋ ๋๋ฅผ ์ ํํด์ ๊นจ์ธ ์ ์์ด ๋นํจ์จ ๋ฐ์ 
 
Lock Condition
Example


Object.notify() vs Condition.signal()
Object.notify()
- ๋๊ธฐ ์ค์ธ ์ค๋ ๋ ์ค ์์์ ํ๋๋ฅผ ์ ํํด์ ๊นจ์ - ์ค๋ ๋๊ฐ ๊นจ์ด๋๋ ์์๋ ์ ์๋์ด ์์ง ์๊ณ , JVM ๊ตฌํ์ ๋ฐ๋ผ ์ฐจ์ด 
- ๋ณดํต์ ๋จผ์  ๋ค์ด์จ ์ค๋ ๋๊ฐ ๋จผ์  ์ํ๋์ง๋ง ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ 
 
- synchronized ๋ธ๋ก ๋ด์์ ๋ชจ๋ํฐ ๋ฝ์ ๊ฐ์ง๊ณ ์๋ ์ค๋ ๋๊ฐ ํธ์ถํด์ผ ํจ 
Condition.signal()
- ๋๊ธฐ ์ค์ธ ์ค๋ ๋ ์ค ํ๋๋ฅผ ๊นจ์ - ์ผ๋ฐ์ ์ผ๋ก๋ FIFO ์์๋ก ๊นจ์ฐ๊ณ , ์๋ฐ ๋ฒ์ ๊ณผ ๊ตฌํ์ ๋ฐ๋ผ ์ฐจ์ด 
- ๋ณดํต Condition ๊ตฌํ์ Queue ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ FIFO ์์ 
 
- ReentrantLock ์ ๊ฐ์ง๊ณ ์๋ ์ค๋ ๋๊ฐ ํธ์ถํด์ผ ํจ 
์ค๋๋์ ๋๊ธฐ
synchronized ๋๊ธฐ
- ๋๊ธฐ1: ๋ชจ๋ํฐ ๋ฝ ํ๋ ๋๊ธฐ - ์๋ฐ ๊ฐ์ฒด ๋ด๋ถ์ ๋ฝ ๋๊ธฐ ์งํฉ(๋ชจ๋ํฐ ๋ฝ ๋๊ธฐ ์งํฉ)์์ ๊ด๋ฆฌ 
- BLOCKED์ํ๋ก ๋ฝ ํ๋ ๋๊ธฐ
- synchronized ๋ฅผ ์์ํ ๋ ๋ฝ์ด ์์ผ๋ฉด ๋๊ธฐ 
- ๋ค๋ฅธ ์ค๋ ๋๊ฐ synchronized ๋ฅผ ๋น ์ ธ๋๊ฐ ๋ ๋ฝ์ ํ๋ ์๋ - ๋ฝ์ ํ๋ํ๋ฉด ๋ฝ ๋๊ธฐ ์งํฉ ํ์ถ 
 
 
- ๋๊ธฐ2: wait() ๋๊ธฐ - wait()ํธ์ถ ์ ์๋ฐ ๊ฐ์ฒด ๋ด๋ถ์ ์ค๋ ๋ ๋๊ธฐ ์งํฉ์์ ๊ด๋ฆฌ
- WAITING์ํ๋ก ๋๊ธฐ
- ๋ค๋ฅธ ์ค๋ ๋๊ฐ notify() ํธ์ถ ์ ์ค๋ ๋ ๋๊ธฐ ์งํฉ ํ์ถ 
 

์๋ฐ(synchronized)์ ๋ชจ๋ ๊ฐ์ฒด ์ธ์คํด์ค๋ ๋ฉํฐ์ค๋ ๋์ ์๊ณ ์์ญ์ ๋ค๋ฃจ๊ธฐ ์ํด ๋ด๋ถ์ 3๊ฐ์ง ๊ธฐ๋ณธ ์์๋ฅผ ๊ฐ์ง
๋ชจ๋ํฐ ๋ฝ
๋ฝ ๋๊ธฐ ์งํฉ(๋ชจ๋ํฐ ๋ฝ ๋๊ธฐ ์งํฉ) / 1์ฐจ ๋๊ธฐ์
์ค๋ ๋ ๋๊ธฐ ์งํฉ / 2์ฐจ ๋๊ธฐ์
...
ReentrantLock ๋๊ธฐ
- ๋๊ธฐ1: ReentrantLock ๋ฝ ํ๋ ๋๊ธฐ - ReentrantLock ์ ๋๊ธฐ ํ์์ ๊ด๋ฆฌ 
- WAITING์ํ๋ก ๋ฝ ํ๋ ๋๊ธฐ
- lock.lock()ํธ์ถ ์ ๋ฝ์ด ์์ผ๋ฉด ๋๊ธฐ
- ๋ค๋ฅธ ์ค๋ ๋๊ฐ - lock.unlock()ํธ์ถ ์ ๋๊ธฐ๊ฐ ํ๋ฆฌ๋ฉฐ ๋ฝ ํ๋ ์๋- ๋ฝ์ ํ๋ํ๋ฉด ๋๊ธฐ ํ ํ์ถ 
 
 
- ๋๊ธฐ2: await() ๋๊ธฐ - condition.await()ํธ์ถ ์ condition ๊ฐ์ฒด์ ์ค๋ ๋ ๋๊ธฐ ๊ณต๊ฐ์์ ๊ด๋ฆฌ
- WAITING์๋๋ก ๋๊ธฐ
- ๋ค๋ฅธ ์ค๋ ๋๊ฐ - condition.signal()ํธ์ถ ์ condition ๊ฐ์ฒด์ ์ค๋ ๋ ๋๊ธฐ ๊ณต๊ฐ์์ ํ์ถ
 

BlockingQueue
์๋ฐ๋ ์์ฐ์ ์๋น์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
java.util.concurrent.BlockingQueue๋ผ๋ ํน๋ณํ ๋ฉํฐ์ค๋ ๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ ๊ณต
ํ๊ฐ ํน์  ์กฐ๊ฑด์ด ๋ง์กฑ๋ ๋๊น์ง ์ค๋ ๋์ ์์ ์ ์ฐจ๋จ(blocking)
- ๋ฐ์ดํฐ ์ถ๊ฐ ์ฐจ๋จ - ํ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ๋ฐ์ดํฐ ์ถ๊ฐ ์์ ( - put())์ ์๋ํ๋ ์ค๋ ๋๋ ๊ณต๊ฐ์ด ์๊ธธ ๋๊น์ง ์ฐจ๋จ
 
- ๋ฐ์ดํฐ ํ๋ ์ฐจ๋จ - ํ๊ฐ ๋น์ด ์์ผ๋ฉด ํ๋ ์์ ( - take())์ ์๋ํ๋ ์ค๋ ๋๋ ํ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ ๋๊น์ง ์ฐจ๋จ
 
BlockingQueue ์ธํฐ์ด์ค ์ฃผ์ ๋ฉ์๋
public interface BlockingQueue<E> extends Queue<E> {
  // ๋ฐ์ดํฐ ์ถ๊ฐ
  boolean add(E e);
  boolean offer(E e);
  void put(E e) throws InterruptedException;
  boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;
  // ๋ฐ์ดํฐ ํ๋
  E take() throws InterruptedException;
  E poll(long timeout, TimeUnit unit) throws InterruptedException;
  boolean remove(Object o);
  //...
}๋ํ์ ์ธ ๊ตฌํ์ฒด
- ArrayBlockingQueue 
- LinkedBlockingQueue 
- BlockingDeque 
...
BlockingQueue ๊ธฐ๋ฅ
ํ๊ฐ ๊ฐ๋ ์ฐผ์ ๋ ์๊ฐํ ์ ์๋ ์ ํ์ง
- ์์ธ๋ฅผ ๋์ง๊ณ , ์์ธ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌ 
- ๋๊ธฐํ์ง ์๊ณ , ์ฆ์ false ๋ฐํ 
- ๋๊ธฐ 
- ํน์  ์๊ฐ ๋งํผ๋ง ๋๊ธฐ 
Insert
add(e)
offer(e)
put(e)
offer(e, time, unit)
Remove
remove()
poll()
take()
poll(time, unit)
Examine
element()
peek()
not applicable
not applicable
Throws Exception / ๋๊ธฐ ์ ์์ธ
- add(e): ์ง์ ๋ ์์๋ฅผ ํ์ ์ถ๊ฐ - ํ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด IllegalStateException ์์ธ 
 
- remove(): ํ์์ ์์๋ฅผ ์ ๊ฑฐํ๋ฉฐ ๋ฐํ - ํ๊ฐ ๋น์ด ์์ผ๋ฉด NoSuchElementException ์์ธ 
 
- element(): ํ์ ๋จธ๋ฆฌ ์์๋ฅผ ๋ฐํํ์ง๋ง, ์์๋ฅผ ํ์์ ์ ๊ฑฐํ์ง ์์ - ํ๊ฐ ๋น์ด ์์ผ๋ฉด NoSuchElementException ์์ธ 
 
Special Value / ๋๊ธฐ ์ ์ฆ์ ๋ฐํ
- offer(e): ์ง์ ๋ ์์๋ฅผ ํ์ ์ถ๊ฐํ๋ ค๊ณ ์๋ - ํ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด false ๋ฐํ 
 
- poll(): ํ์์ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐํ - ํ๊ฐ ๋น์ด ์์ผ๋ฉด null ๋ฐํ 
 
- peek(): ํ์ ๋จธ๋ฆฌ ์์๋ฅผ ๋ฐํํ์ง๋ง, ์์๋ฅผ ํ์์ ์ ๊ฑฐํ์ง ์์ - ํ๊ฐ ๋น์ด ์์ผ๋ฉด null ๋ฐํ 
 
Blocks / ๋๊ธฐ
- put(e): ์ง์ ๋ ์์๋ฅผ ํ์ ์ถ๊ฐํ ๋๊น์ง ๋๊ธฐ - ํ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ๊ณต๊ฐ์ด ์๊ธธ ๋๊น์ง ๋๊ธฐ 
 
- take(): ํ์์ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐํ - ํ๊ฐ ๋น์ด ์์ผ๋ฉด ์์๊ฐ ์ค๋น๋ ๋๊น์ง ๋๊ธฐ 
 
- Examine (๊ด์ฐฐ): ํด๋น ์ฌํญ ์์. 
Times Out / ์๊ฐ ๋๊ธฐ
- offer(e, time, unit): ์ง์ ๋ ์์๋ฅผ ํ์ ์ถ๊ฐํ๋ ค๊ณ ์๋ - ์ง์ ๋ ์๊ฐ ๋์ ํ๊ฐ ๋น์์ง๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ์๊ฐ์ด ์ด๊ณผ๋๋ฉด false ๋ฐํ 
 
- poll(time, unit): ํ์์ ์์๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐํ - ํ์ ์์๊ฐ ์๋ค๋ฉด ์ง์ ๋ ์๊ฐ ๋์ ์์๊ฐ ์ค๋น๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ์๊ฐ์ด ์ด๊ณผ๋๋ฉด null ๋ฐํ 
 
- Examine (๊ด์ฐฐ): ํด๋น ์ฌํญ ์์ 
.
๊ธฐ๋ฅ ํ ์คํธ
CAS / ์์์  ์ฐ์ฐ
์์์  ์ฐ์ฐ(atomic operation)
- ํด๋น ์ฐ์ฐ์ด ๋ ์ด์ ๋๋ ์ ์๋ ๋จ์๋ก ์ํ๋๋ค๋ ๊ฒ์ ์๋ฏธ 
- ์ค๋จ๋์ง ์๊ณ , ๋ค๋ฅธ ์ฐ์ฐ๊ณผ ๊ฐ์ญ ์์ด ์์ ํ ์คํ๋๊ฑฐ๋ ์ ํ ์คํ๋์ง ์๋ ์ฑ์ง 
- ๋ฉํฐ์ค๋ ๋ ์ํฉ์์ ๋ค๋ฅธ ์ค๋ ๋์ ๊ฐ์ญ ์์ด ์์ ํ๊ฒ ์ฒ๋ฆฌ๋๋ ์ฐ์ฐ 
volatile int i = 0;
i = 1; // ์์์  ์ฐ์ฐ O
i = i + 1; // ์์์ น ์ฐ์ฐ Xcommit
- ๋ฉํฐ์ค๋ ๋ ์ํฉ์ ์์ ํ ์ฆ๊ฐ, ๊ฐ์ ์ฐ์ฐ ์ ๊ณต 
- AtomicLong, AtomicBoolean ๋ฑ ๋ค์ํ Atomic ํด๋์ค ์กด์ฌ 
 
...
CAS ์ฐ์ฐ
์ฐ๋ฆฌ๊ฐ ์ง์  CAS ์ฐ์ฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๊ธฐ ๋๋ฌธ์ ์ฐธ๊ณ ๋ง
AtomicInteger์ ๊ฐ์ CAS ์ฐ์ฐ์ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ ์ฌ์ฉํ๋ ์ ๋๋ฉด ์ถฉ๋ถ
CAS(CompareAnd-Swap, Compare-And-Set) ์ฐ์ฐ
- ๋ฝ์ ๊ฑธ์ง ์๊ณ - ์์์ ์ธ ์ฐ์ฐ์ ์ํ- ๋ฝ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ - lock-free๊ธฐ๋ฒ
 
- ๋ฝ์ ์์ ํ ๋์ฒดํ๋ ๊ฒ์ ์๋๊ณ , ์์ ๋จ์์ ์ผ๋ถ ์์ญ์ ์ ์ฉ ๊ฐ๋ฅ - ๊ธฐ๋ณธ์ ๋ฝ์ ์ฌ์ฉํ๊ณ , ํน๋ณํ ๊ฒฝ์ฐ์ CAS๋ฅผ ์ ์ฉ 
 
AtomicInteger atomicInteger = new AtomicInteger();
// atomicInteger ๊ฐ์ด 0์ผ ๊ฒฝ์ฐ 1๋ก ๋ณ๊ฒฝ(์์์ ์ผ๋ก ์คํ)
boolean result1 = atomicInteger.compareAndSet(0, 1);.
CPU ํ๋์จ์ด์ ์ง์
- CAS ์ฐ์ฐ์ ์์์ ์ด์ง ์์ ๋ ๊ฐ์ ์ฐ์ฐ์ CPU ํ๋์จ์ด ์ฐจ์์์ ํ๋์ ์์์ ์ธ ์ฐ์ฐ์ผ๋ก ๋ฌถ์ด์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ - ์ค๊ฐ์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ถ๊ฐ 
- CPU ์ ์ฅ์์ ๋ณด๋ฉด ์์ฃผ ์ฐฐ๋์ ์๊ฐ์ด๋ฏ๋ก ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ผ์น์ง๋ ์์ 
 
- ์ํํธ์จ์ด๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ์๋๋ผ ํ๋์จ์ด๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ 
- ๋๋ถ๋ถ์ ํ๋ CPU๋ค์ CAS ์ฐ์ฐ์ ์ํ ๋ช ๋ น์ด๋ฅผ ์ ๊ณต 
- CPU๋ ๋ ์ฐ์ฐ์ ๋ฌถ์ด์ ํ๋์ ์์์ ์ธ ๋ช ๋ น์ผ๋ก ๋ง๋ค์ด๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์ 
.
CAS(Compare-And-Swap)์ ๋ฝ(Lock) ๋ฐฉ์์ ๋น๊ต
๋ฝ(Lock) ๋ฐฉ์
- ๋น๊ด์ (pessimistic) ์ ๊ทผ๋ฒ 
- ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ ์ ํญ์ ๋ฝ์ ํ๋ 
- ๋ค๋ฅธ ์ค๋ ๋์ ์ ๊ทผ์ ๋ง์ - "๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ฐฉํดํ ๊ฒ์ด๋ค"๋ผ๊ณ ๊ฐ์  
 
- ์ถฉ๋ ์ ๋์ - ์ค๋ ๋ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด 1,000๊ฐ์ ์ค๋ ๋๊ฐ ๋ชจ๋ ๋ฝ์ ํ๋ํ๊ณ ๋ฐํ 
- ๋ฝ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ 1,000๊ฐ์ ์ค๋ ๋๋ ์์๋๋ก ํ๋์ฉ ์ํ 
- ์ค๋ ๋์ ์ํ๊ฐ ๊ณ์ ์ ํ๋๋ฉด์ OS๋ Context switch ๋ก ํฐ ์ค๋ฒํค๋ ๋ฐ์ ๊ฐ๋ฅ 
 
CAS(Compare-And-Swap) ๋ฐฉ์
- ๋๊ด์ (optimistic) ์ ๊ทผ๋ฒ 
- ๋ฝ์ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ์ดํฐ์ ๋ฐ๋ก ์ ๊ทผ 
- ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๊ทธ๋ ์ฌ์๋ - "๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ถฉ๋์ด ์์ ๊ฒ์ด๋ค"๋ผ๊ณ ๊ฐ์  
 
- ์ถฉ๋์ด ๋ง์ด ์๋ ๊ฒฝ์ฐ์ CAS ์ฐ์ฐ์ด ๋น ๋ฅธ ์ฑ๋ฅ 
- ์ถฉ๋ ์ ๋์ - 1000๊ฐ์ ์ค๋ ๋๋ฅผ ๋ชจ๋ ํ ๋ฒ์ ์คํ 
- ์ถฉ๋์ด ๋๋ 50๊ฐ์ ๊ฒฝ์ฐ๋ง ์ฌ์๋ 
- ์ถฉ๋์ด ์ ์ ๊ฐ๋จํ CPU ์ฐ์ฐ์๋ ์ข์ ์ฑ๋ฅ 
 
...
CAS ๋ฝ
CAS๋ ๋จ์ํ ์ฐ์ฐ ๋ฟ๋ง ์๋๋ผ, ๋ฝ์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ
commit
- ์์์ ์ด์ง ์์์ ๋์์ฑ ๋ฌธ์  ๋ฐ์ - ๋ฝ ์ฌ์ฉ ์ฌ๋ถ ํ์ธ, ๋ฝ์ ๊ฐ ๋ณ๊ฒฝ 
 
 
- ์์์ ์ผ๋ก ์ฐ์ฐ - ๋ฝ์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋ฝ์ ๊ฐ์ ๋ณ๊ฒฝ 
 
 
while(
    if (!lock) { //1. ๋ฝ ์ฌ์ฉ ์ฌ๋ถ ํ์ธ
        lock = true; //2. ๋ฝ์ ๊ฐ ๋ณ๊ฒฝ
    }
)
...
while(lock.compareAndSet(false, true)) {}๋๊ธฐํ ๋ฝ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ค๋ ๋๊ฐ ๋ฝ์ ํ๋ํ์ง ๋ชปํ๋ฉด BLOCKED, WAITING ๋ฑ์ผ๋ก ์ํ๊ฐ ์ ํ
- ๋๊ธฐ ์ํ์ ์ค๋ ๋๋ฅผ ๊นจ์์ผ ํ๋ ๋ฌด๊ฒ๊ณ ๋ณต์กํ ๊ณผ์ ์ด ์ถ๊ฐ๋ก ๋์ 
- ๋ฐ๋ผ์ ์ฑ๋ฅ์ด ์๋์ ์ผ๋ก ๋๋ฆด ์ ์์ 
๋ฐ๋ฉด, CAS๋ฅผ ํ์ฉํ ๋ฝ ๋ฐฉ์์ ๋ฝ์ด ์๋ ๋ฐฉ์
- ๋จ์ํ while๋ฌธ์ ๋ฐ๋ณต 
- ๋ฐ๋ผ์ ๋๊ธฐํ๋ ์ค๋ ๋๋ RUNNABLE ์ํ๋ฅผ ์ ์งํ๋ฉด์ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ์๋ 
...
โน๏ธ ์คํ ๋ฝ
- ๋ฝ์ ํ๋ํ๊ธฐ ์ํด ์์์ ์๋ชจํ๋ฉด์ ๋ฐ๋ณต์ ์ผ๋ก ํ์ธ(์คํ)ํ๋ ๋ฝ ๋ฉ์ปค๋์ฆ - ์ค๋ ๋๊ฐ ๋ฝ์ ํ๋ ํ ๋ ๊น์ง ๋๊ธฐํ๋ ๊ฒ์ ์คํ ๋๊ธฐ(spin-wait) 
- ๋๋ CPU ์์์ ๊ณ์ ์ฌ์ฉํ๋ฉด์ ๋ฐ์๊ฒ ๋๊ธฐํ๋ค๊ณ ํด์ ๋ฐ์ ๋๊ธฐ(busy-wait)๋ผ๊ณ ๋ถ๋ฆผ 
- ๋ฐ๋ผ์, ์คํ ๋ฝ ๋ฐฉ์์ ์์ฃผ ์งง์ CPU ์ฐ์ฐ์ ์ํํ ๋ ์ฌ์ฉํด์ผ ํจ์จ์  
- ์๋ชป ์ฌ์ฉํ๋ฉด ์คํ๋ ค CPU ์์์ ๋ ๋ง์ด ์ฌ์ฉ 
 
- CAS๋ฅผ ์ฌ์ฉํด์ ๊ตฌํ 
...
๋ฝ VS CAS ์ฌ์ฉ ๋ฐฉ์
๋๊ธฐํ ๋ฝ(synchronized , Lock(ReentrantLock))์ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ CAS๋ฅผ ํ์ฉํ๋ ๋ฝ ํ๋ฆฌ ๋ฐฉ์์ ์ฅ๋จ์  ๋น๊ต
CAS
์ฅ์ 
- ๋๊ด์  ๋๊ธฐํ - ๋ฝ์ ๊ฑธ์ง ์๊ณ ๋ ๊ฐ์ ์์ ํ๊ฒ ์ ๋ฐ์ดํธ 
- CAS๋ ์ถฉ๋์ด ์์ฃผ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ์ฌ ์ถฉ๋์ด ์ ์ ํ๊ฒฝ์์ ๋์ ์ฑ๋ฅ์ ๋ฐํ 
 
- ๋ฝ ํ๋ฆฌ(Lock-Free) - ๋ฝ์ ํ๋ํ๊ธฐ ์ํด ๋๊ธฐํ๋ ์๊ฐ์ด ์์ 
- ๋ฐ๋ผ์ ์ค๋ ๋๊ฐ ๋ธ๋กํน๋์ง ์์ผ๋ฉฐ, ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ๋ ํจ์จ์ ์ผ ์ ์์ 
 
๋จ์ 
- ์ถฉ๋์ด ๋น๋ฒํ ๊ฒฝ์ฐ - ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๋์ผํ ๋ณ์์ ์ ๊ทผํ์ฌ ์ ๋ฐ์ดํธ๋ฅผ ์๋ํ ๋ ์ถฉ๋ ๋ฐ์ 
- ์ถฉ๋ ๋ฐ์ ์ CAS๋ ๋ฃจํ๋ฅผ ๋๋ฉฐ ์ฌ์๋, ์ด์ ๋ฐ๋ผ CPU ์์์ ๊ณ์ ์๋ชจ 
- ๋ฐ๋ณต์ ์ธ ์ฌ์๋๋ก ์ธํด ์ค๋ฒํค๋๊ฐ ๋ฐ์ ๊ฐ๋ฅ์ฑ ์กด์ฌ 
 
- ์คํ๋ฝ๊ณผ ์ ์ฌํ ์ค๋ฒํค๋ - ์ถฉ๋ ์ ๋ฐ๋ณต์ ์ธ ์ฌ์๋๋ก ๊ณ์ ๋ฐ๋ณต๋๋ฉด ์คํ๋ฝ๊ณผ ์ ์ฌํ ์ฑ๋ฅ ์ ํ ๋ฐ์ 
- ํนํ ์ถฉ๋ ๋น๋๊ฐ ๋์์๋ก ์ด๋ฐ ํ์์ด ๋๋๋ฌ์ง 
 
์ฌ์ฉ ์ฌ๋ก
- CPU ์ฌ์ดํด์ด ๊ธ๋ฐฉ ๋๋์ง๋ง ์์ ํ ์๊ณ ์์ญ/์์์ ์ธ ์ฐ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ - ์ซ์ ๊ฐ์ ์ฆ๊ฐ 
- ์๋ฃ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ ์ถ๊ฐ/์ญ์  
 
.
๋๊ธฐํ ๋ฝ
์ฅ์ 
- ์ถฉ๋ ๊ด๋ฆฌ - ๋ฝ์ ์ฌ์ฉํ๋ฉด ํ๋์ ์ค๋ ๋๋ง ๋ฆฌ์์ค์ ์ ๊ทผํ์ฌ ์ถฉ๋ ๋ฐฉ์ง 
- ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฒฝ์ํ ๊ฒฝ์ฐ์๋ ์์ ์ ์ผ๋ก ๋์ 
 
- ์์ ์ฑ - ๋ณต์กํ ์ํฉ์์๋ ์ผ๊ด์ฑ ์๋ ๋์์ ๋ณด์ฅ 
 
- ์ค๋ ๋ ๋๊ธฐ - ๋ฝ์ ๋๊ธฐํ๋ ์ค๋ ๋๋ CPU๋ฅผ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ 
 
๋จ์ 
- ๋ฝ ํ๋ ๋๊ธฐ ์๊ฐ - ์ค๋ ๋๊ฐ ๋ฝ์ ํ๋ํ๊ธฐ ์ํด ๋๊ธฐํ์ฌ, ๋๊ธฐ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ 
 
- ์ปจํ ์คํธ ์ค์์นญ ์ค๋ฒํค๋ - ๋ฝ ํ๋์ ๋๊ธฐํ๋ ์์ ๊ณผ ๋ ๋ฝ์ ํ๋ํ๋ ์์ ์ ์ค๋ ๋์ ์ํ๊ฐ ๋ณ๊ฒฝ 
- ์ด๋ ์ปจํ ์คํธ ์ค์์นญ์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ก ์ธํด ์ค๋ฒํค๋๊ฐ ์ฆ๊ฐ 
 
์ฌ์ฉ ์ฌ๋ก
- ์ค๋ ๊ธฐ๋ค๋ฆฌ๋ ์์ - ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๊ธฐ 
- ๋ค๋ฅธ ์๋ฒ์ ์์ฒญ ๋๊ธฐ 
 
์ง์  CAS ์ฐ์ฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๊ณ , ๋๋ถ๋ถ ๋ณต์กํ ๋์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด CAS ์ฐ์ฐ์ ์ฌ์ฉ
AtomicInteger์ ๊ฐ์ CAS ์ฐ์ฐ์ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ ์ฌ์ฉํ๋ ์ ๋๋ฉด ์ถฉ๋ถ
๋์์ฑ ์ปฌ๋ ์
์ปฌ๋ ์  ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ ๋๋ถ๋ถ์ ์ฐ์ฐ์ ์์์ ์ธ ์ฐ์ฐ์ด ์๋๋ฏ๋ก ์ค๋ ๋ ์ธ์ดํ ํ์ง ์๋ค.
commit
- ์ปฌ๋ ์  ๋๊ธฐํ๋ฅผ ์ํ synchronized ์ ์ฉ - ๋ชจ๋ ์ปฌ๋ ์ ์ ๋ณต์ฌํด์ ๋๊ธฐํ์ฉ์ผ๋ก ์๋ก ๊ตฌํํด์ผ ํ๋ ๋ฌธ์ ์  
 
- ์ปฌ๋ ์  ๋๊ธฐํ๋ฅผ ์ํ ํ๋ก์ ํจํด ๋์ - ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๊ธฐ ์ํด ๋๋ฆฌ์ธ/์ธํฐํ์ด์ค ์ญํ ์ ํ๋ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ ํจํด 
 
ํ๋ก์ ํจํด์ ์ฃผ์ ๋ชฉ์ 
- ์ ๊ทผ ์ ์ด: ์ค์  ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ํํ๊ฑฐ๋ ํต์  
- ์ฑ๋ฅ ํฅ์: ์ค์  ๊ฐ์ฒด์ ์์ฑ์ ์ง์ฐ์ํค๊ฑฐ๋ ์บ์ฑํ์ฌ ์ฑ๋ฅ์ ์ต์ ํ 
- ๋ถ๊ฐ ๊ธฐ๋ฅ ์ ๊ณต: ์ค์  ๊ฐ์ฒด์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ(๋ก๊น , ์ธ์ฆ, ๋๊ธฐํ ๋ฑ)์ ํฌ๋ช ํ๊ฒ ์ ๊ณต 
.
์๋ฐ synchronized ํ๋ก์
- Collections๋ ๋ค์ํ synchronized ๋๊ธฐํ ๋ฉ์๋ ์ง์ 
- List, Collection, Map, Set ๋ฑ ๋ค์ํ ๋๊ธฐํ ํ๋ก์ ์์ฑ ๊ฐ๋ฅ - synchronizedList()
- synchronizedCollection()
- synchronizedMap()
- synchronizedSet()
- synchronizedNavigableMap()
- synchronizedNavigableSet()
- synchronizedSortedMap()
- synchronizedSortedSet()
 
synchronized ํ๋ก์ ๋ฐฉ์์ ๋จ์ 
- ๋๊ธฐํ ์ค๋ฒํค๋ ๋ฐ์ 
- ์ ์ฒด ์ปฌ๋ ์ ์ ๋ํด ๋๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ฏ๋ก ์ ๊ธ ๋ฒ์๊ฐ ๋์ด์ง 
- ์ ๊ตํ ๋๊ธฐํ ๋ถ๊ฐ 
.
์๋ฐ ๋์์ฑ ์ปฌ๋ ์ 
- java.util.concurrentํจํค์ง์๋ ๊ณ ์ฑ๋ฅ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์ ์ง์ํ๋ ๋ค์ํ ๋์์ฑ ์ปฌ๋ ์  ํด๋์ค๋ค์ ์ ๊ณต
- synchronized, Lock(ReentrantLock), CAS, ๋ถํ ์ ๊ธ ๊ธฐ์ (segment lock)๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ ์์ด์ ๋งค์ฐ ์ ๊ตํ ๋๊ธฐํ๋ฅผ ๊ตฌํํ๋ฉด์ ๋์์ ์ฑ๋ฅ๋ ์ต์ ํ 
๋์์ฑ ์ปฌ๋ ์ ์ ์ข ๋ฅ
- List - CopyOnWriteArrayList โ ArrayList ๋์ 
 
- Set - CopyOnWriteArraySet โ HashSet ๋์ 
- ConcurrentSkipListSet โ TreeSet ๋์(์ ๋ ฌ๋ ์์ ์ ์ง, Comparator ์ฌ์ฉ ๊ฐ๋ฅ) 
 
- Map - ConcurrentHashMap โ HashMap ๋์ 
- ConcurrentSkipListMap โ TreeMap ๋์(์ ๋ ฌ๋ ์์ ์ ์ง, Comparator ์ฌ์ฉ ๊ฐ๋ฅ) 
 
- Queue - ConcurrentLinkedQueue: ๋์์ฑ ํ, ๋น ์ฐจ๋จ(non-blocking) ํ 
 
- Deque - ConcurrentLinkedDeque: ๋์์ฑ ๋ฐํฌ, ๋น ์ฐจ๋จ(non-blocking) ํ 
 
LinkedHashSet, LinkedHashMap ์ฒ๋ผ ์ ๋ ฅ ์์๋ฅผ ์ ์งํ๋ฉด์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋ ๊ตฌํ์ฒด๋ ์ ๊ณตํ์ง ์๊ณ , ํ์ํ๋ค๋ฉด Collections.synchronizedXxx() ์ฌ์ฉ
์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ ๋ธ๋กํน ํ(BlockingQueue)
- ArrayBlockingQueue - ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋ ๋ธ๋กํน ํ 
- ๊ณต์ (fair) ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ. ๋จ, ๊ณต์  ๋ชจ๋ ์ฌ์ฉ ์ ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ์ฑ 
 
- LinkedBlockingQueue - ํฌ๊ธฐ๊ฐ ๋ฌดํํ๊ฑฐ๋ ๊ณ ์ ๋ ๋ธ๋กํน ํ 
 
- PriorityBlockingQueue - ์ฐ์ ์์๊ฐ ๋์ ์์๋ฅผ ๋จผ์  ์ฒ๋ฆฌํ๋ ๋ธ๋กํน ํ 
 
- SynchronousQueue - ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์๋ ๋ธ๋กํน ํ 
- ์์ฐ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ฉด ์๋น์๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋๊น์ง ๋๊ธฐ 
- ์์ฐ์-์๋น์ ๊ฐ์ ์ง์ ์ ์ธ ํธ๋์คํ(hand-off) ๋ฉ์ปค๋์ฆ ์ ๊ณต - ์ค๊ฐ์ ํ ์์ด ์์ฐ์, ์๋น์๊ฐ ์ง์  ๊ฑฐ๋ 
 
 
- DelayQueue - ์ง์ฐ๋ ์์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ธ๋กํน ํ 
- ๊ฐ ์์๋ ์ง์ ๋ ์ง์ฐ ์๊ฐ์ด ์ง๋ ํ์์ผ ์๋น 
- ์ผ์  ์๊ฐ์ด ์ง๋ ํ ์์ ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์ค์ผ์ค๋ง ์์ ์ ์ฌ์ฉ 
 
Thread Pool And Executor
โน๏ธ ์ค๋ ๋๋ฅผ ์ง์  ์ฌ์ฉํ  ๊ฒฝ์ฐ์ ๋ฌธ์ ์ 
1). ์ค๋ ๋ ์์ฑ ์๊ฐ์ผ๋ก ์ธํ ์ฑ๋ฅ ๋ฌธ์ 
- ๋ฉ๋ชจ๋ฆฌ ํ ๋น: - ๊ฐ ์ค๋ ๋๋ ์์ ๋ง์ ํธ์ถ ์คํ(call stack)์ ๊ฐ์ง๊ณ ์์ด์ผ ํจ - ์ด ํธ์ถ ์คํ์ ์ค๋ ๋๊ฐ ์คํ๋๋ ๋์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ 
 
- ๋ฐ๋ผ์ ์ค๋ ๋๋ฅผ ์์ฑํ ๋๋ ์ด ํธ์ถ ์คํ์ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น 
 
- ์ด์์ฒด์  ์์ ์ฌ์ฉ: - ์ค๋ ๋๋ฅผ ์์ฑํ๋ ์์ ์ ์ด์์ฒด์  ์ปค๋ ์์ค์์ ์ด๋ฃจ์ด์ง๋ฉฐ 
- ์์คํ  ์ฝ(system call)์ ํตํด ์ฒ๋ฆฌ 
- ์ด๋ CPU์ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค๋ฅผ ์๋ชจํ๋ ์์ 
 
- ์ด์์ฒด์  ์ค์ผ์ค๋ฌ ์ค์ : - ์๋ก์ด ์ค๋ ๋๊ฐ ์์ฑ๋๋ฉด ์ด์์ฒด์ ์ ์ค์ผ์ค๋ฌ๋ ์ด ์ค๋ ๋๋ฅผ ๊ด๋ฆฌํ๊ณ ์คํ ์์๋ฅผ ์กฐ์ ํด์ผ ํจ 
- ์ด๋ ์ด์์ฒด์ ์ ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ์ถ๊ฐ์ ์ธ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ - ์ฐธ๊ณ ๋ก ์ค๋ ๋ ํ๋๋ ๋ณดํต 1MB ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉ 
 
 
2). ์ค๋ ๋ ๊ด๋ฆฌ ๋ฌธ์ 
- ์๋ฒ์ CPU, ๋ฉ๋ชจ๋ฆฌ ์์์ ํ์ ๋์ด ์์ผ๋ฏ๋ก ์ค๋ ๋๋ ๋ฌดํํ๊ฒ ๋ง๋ค ์ ์์ 
- ์์คํ ์ด ๋ฒํธ ์ ์๋ ์ต๋ ์ค๋ ๋์ ์ ๊น์ง๋ง ์ค๋ ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ๊ด๋ฆฌ ํ์ 
- ์ธํฐ๋ฝํธ ๋ฑ์ ์ ํธ๋ฅผ ํตํด ์ค๋ ๋๋ฅผ ์ข ๋ฃํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ค๋ ๋ ๊ด๋ฆฌ๊ฐ ํ์ 
3). Runnable ์ธํฐํ์ด์ค์ ๋ถํธํจ
- ๋ฐํ ๊ฐ์ด ์์: - ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด์๋ ๋ณ๋์ ๋ฉ์ปค๋์ฆ ํ์ 
- ์ค๋ ๋๊ฐ ์คํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉค๋ฒ ๋ณ์์ ๋ฃ์ด๋๊ณ , join() ๋ฑ์ ์ฌ์ฉํด์ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๊ธธ ๊ธฐ๋ค๋ฆฐ ํ ๋ฉค๋ฒ ๋ณ์์ ๋ณด๊ดํ ๊ฐ์ ๋ฐ์์ผ ํจ 
 
- ์์ธ ์ฒ๋ฆฌ: - ์ฒดํฌ ์์ธ(checked exception)๋ฅผ ๋์ง ์ ์์ 
- ์ฒดํฌ ์์ธ์ ์ฒ๋ฆฌ๋ ๋ฉ์๋ ๋ด๋ถ์์ ์ฒ๋ฆฌ ํ์ 
 
Executor Framework
๋ฉํฐ์ค๋ ๋ฉ ๋ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋๋ ๊ธฐ๋ฅ์ ๋ชจ์
์์ ์คํ ๊ด๋ฆฌ, ์ค๋ ๋ ํ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํด์ ๊ฐ๋ฐ์๊ฐ ์ง์  ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋ณต์กํจ ํด์
์ค๋ ๋ ํ, ์ค๋ ๋ ๊ด๋ฆฌ, Runnable์ ๋ฌธ์ ์ , ์์ฐ์ ์๋น์ ๋ฌธ์ ๊น์ง ํด๊ฒฐํด์ฃผ๋ ์๋ฐ ๋ฉํฐ์ค๋ ๋ ์ต๊ณ ์ ๋๊ตฌ
package java.util.concurrent;
public interface Executor {
    void execute(Runnable command);
}
Executor
/** ExecutorService
 * Executor Framework ์ฌ์ฉ ์ ๋๋ถ๋ถ ExecutorService ์ธํฐํ์ด์ค ์ฌ์ฉ
 * ExecutorService ์ธํฐํ์ด์ค์ ๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ ThreadPoolExecutor
 */
public interface ExecutorService extends Executor, AutoCloseable {
    <T> Future<T> submit(Callable<T> task);
    
    @Override
    default void close(){...}
    ...
}ExecutorService

Runnable๊ณผ Callable ๋น๊ต
.
ExecutorService ์ค๋ฃ ๋ฉ์๋
- ์๋น์ค ์ข ๋ฃ - void shutdown()- ์๋ก์ด ์์ ์ ๋ฐ์ง ์๊ณ , ์ด๋ฏธ ์ ์ถ๋ ์์ ์ ๋ชจ๋ ์๋ฃํ ํ์ ์ข ๋ฃ 
- ๋ ผ ๋ธ๋กํน ๋ฉ์๋ 
 
- List<Runnable> shutdownNow()- ์คํ ์ค์ธ ์์ ์ ์ค๋จํ๊ณ , ๋๊ธฐ ์ค์ธ ์์ ์ ๋ฐํํ๋ฉฐ ์ฆ์ ์ข ๋ฃ 
- ์คํ ์ค์ธ ์์ ์ ์ค๋จํ๊ธฐ ์ํด ์ธํฐ๋ฝํธ ๋ฐ์ 
- ๋ ผ ๋ธ๋กํน ๋ฉ์๋ 
 
 
- ์๋น์ค ์ํ ํ์ธ - boolean isShutdown()- ์๋น์ค๊ฐ ์ข ๋ฃ๋์๋์ง ํ์ธ 
 
- boolean isTerminated()- shutdown(), shutdownNow() ํธ์ถ ํ, ๋ชจ๋ ์์ ์ด ์๋ฃ๋์๋์ง ํ์ธ 
 
 
- ์์ ์๋ฃ ๋๊ธฐ - boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException- ์๋น์ค ์ข ๋ฃ ์ ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐ 
- ์ด๋ ์ง์ ๋ ์๊ฐ๊น์ง๋ง ๋๊ธฐ 
- ๋ธ๋กํน ๋ฉ์๋ 
 
- close()- ์๋ฐ 19๋ถํฐ ์ง์ํ๋ ์๋น์ค ์ข ๋ฃ ๋ฉ์๋ 
- shutdown() ๊ณผ ๋์ผ 
- ์ ํํ shutdown() ํธ์ถ ํ, ํ๋ฃจ๋ฅผ ๊ธฐ๋ค๋ ค๋ ์์ ์ด ์๋ฃ๋์ง ์์ผ๋ฉด shutdownNow() ํธ์ถ 
- ํธ์ถํ ์ค๋ ๋์ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํด๋ shutdownNow() ํธ์ถ 
 
 
example
Future
์์ ์ ๋ฏธ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์๋ ๊ฐ์ฒด
Future Interface
package java.util.concurrent;
public interface Future<V> {
  /** ์์ง ์๋ฃ๋์ง ์์ ์์
์ ์ทจ์
   * ์์
์ด ์คํ ์ค์ด ์๋๊ฑฐ๋ ์์ง ์์๋์ง ์์์ผ๋ฉด ์ทจ์ 
   * ์คํ ์ค์ธ ์์
์ ๊ฒฝ์ฐ mayInterruptIfRunning=true ๋ฉด ์ค๋จ ์๋
   * - ์ทจ์ ์ํ์ Future ์ Future.get() ์ ํธ์ถํ๋ฉด CancellationException ๋ฐํ์ ์์ธ ๋ฐ์
   * 
   * [๋งค๊ฐ๋ณ์]
   * mayInterruptIfRunning = true
   * - Future ๋ฅผ ์ทจ์ ์ํ๋ก ๋ณ๊ฒฝ
   * - ์ด๋ ์์
์ด ์คํ์ค์ด๋ผ๋ฉด Thread.interrupt()๋ฅผ ํธ์ถํด์ ์์
 ์ค๋จ 
   *
   * mayInterruptIfRunning = false
   * - Future ๋ฅผ ์ทจ์ ์ํ๋ก ๋ณ๊ฒฝ
   * - ๋จ, ์ด๋ฏธ ์คํ ์ค์ธ ์์
์ ์ค๋จํ์ง๋ ์์
   * 
   * [๋ฐํ๊ฐ]
   * - ์์
์ด ์ฑ๊ณต์ ์ผ๋ก ์ทจ์๋ ๊ฒฝ์ฐ true
   * - ์ด๋ฏธ ์๋ฃ๋์๊ฑฐ๋ ์ทจ์ํ  ์ ์๋ ๊ฒฝ์ฐ false
   */
  boolean cancel(boolean mayInterruptIfRunning);
  /** ์์
์ด ์ทจ์ ์ฌ๋ถ ํ์ธ
   * ์์
์ด cancel() ๋ฉ์๋์ ์ํด ์ทจ์๋ ๊ฒฝ์ฐ์ true ๋ฐํ
   * - ์์
์ด ์ทจ์๋ ๊ฒฝ์ฐ true, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ false
   */
  boolean isCancelled();
  /**  ์์
 ์๋ฃ ์ฌ๋ถ ํ์ธ
   * ์์
์ด ์ ์์ ์ผ๋ก ์๋ฃ๋์๊ฑฐ๋, ์ทจ์๋์๊ฑฐ๋, ์์ธ๊ฐ ๋ฐ์ํ์ฌ ์ข
๋ฃ๋ ๊ฒฝ์ฐ true ๋ฐํ
   * - ์์
์ด ์๋ฃ๋ ๊ฒฝ์ฐ true, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ false
   */
  boolean isDone();
  
  /** ์์
์ด ์๋ฃ๋  ๋๊น์ง ๋๊ธฐํ๊ณ , ์๋ฃ๋๋ฉด ์์
 ๊ฒฐ๊ณผ ๋ฐํ
   * ์์
์ด ์๋ฃ๋  ๋๊น์ง get()์ ํธ์ถํ ํ์ฌ ์ค๋ ๋๋ฅผ ๋๊ธฐ(๋ธ๋กํน)
   * ์์
์ด ์๋ฃ๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
   * 
   * [์์ธ]
   * - InterruptedException: ๋๊ธฐ ์ค์ ํ์ฌ ์ค๋ ๋๊ฐ ์ธํฐ๋ฝํธ๋ ๊ฒฝ์ฐ ๋ฐ์
   * - ExecutionException : ์์
 ๊ณ์ฐ ์ค์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ฐ์
   */
  V get() throws InterruptedException, ExecutionException;
  /** get() ๊ณผ ๊ฐ์๋ฐ, ์๊ฐ ์ด๊ณผ๋๋ฉด ์์ธ๋ฅผ ๋ฐ์
   * ์ง์ ๋ ์๊ฐ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋๊ธฐ
   * ์๊ฐ์ด ์ด๊ณผ๋๋ฉด TimeoutException ๋ฐ์
   * 
   * [๋งค๊ฐ๋ณ์]
   * - timeout : ๋๊ธฐํ  ์ต๋ ์๊ฐ
   * - unit: timeout ๋งค๊ฐ๋ณ์์ ์๊ฐ ๋จ์ ์ง์ 
   * 
   * [์์ธ]
   * - InterruptedException : ๋๊ธฐ ์ค์ ํ์ฌ ์ค๋ ๋๊ฐ ์ธํฐ๋ฝํธ๋ ๊ฒฝ์ฐ ๋ฐ์
   * - ExecutionException : ๊ณ์ฐ ์ค์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ฐ์
   * - TimeoutException : ์ฃผ์ด์ง ์๊ฐ ๋ด์ ์์
์ด ์๋ฃ๋์ง ์์ ๊ฒฝ์ฐ ๋ฐ์
   */
  V get(long timeout, TimeUnit unit)
  throws InterruptedException, ExecutionException, TimeoutException;
  
  enum State {
      RUNNING,
      SUCCESS,
      FAILED,
      CANCELLED
  }
  
  default State state() {}
}Future<Integer> future = es.submit(new MyCallable()); - submit() ํธ์ถ ์ future ๋ ์ฆ์ ๋ฐํ 
- ๋๋ถ์ ์์ฒญ ์ค๋ ๋๋ ๋ธ๋กํน ๋์ง ์๊ณ , ํ์ํ ์์ ์ ์ํ 
Integer result = future.get();- ์์ ์ ๊ฒฐ๊ณผ๊ฐ ํ์ํ๋ฉด Future.get() ํธ์ถ 
- Future๊ฐ ์๋ฃ ์ํ: - Future ์ ๊ฒฐ๊ณผ๋ ํฌํจ โ ์์ฒญ ์ค๋ ๋๋ ๋๊ธฐํ์ง ์๊ณ , ๊ฐ์ ์ฆ์ ๋ฐํ 
 
- Future๊ฐ ๋ฏธ์๋ฃ ์ํ: - ์์ ์ด ์์ง ์ํ๋์ง ์์๊ฑฐ๋ ์ํ ์ค โ ์์ฒญ ์ค๋ ๋๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ธฐ ์ํด ๋ธ๋กํน ์ํ๋ก ๋๊ธฐ 
 
Future ๋์
- Future ๋ฏธ์ฌ์ฉ: ๋ ์ค๋ ๋๊ฐ - ์์ฐจ์ ์ผ๋ก์ํ
- Future ์ฌ์ฉ: ๋ ์ค๋ ๋๊ฐ - ๋์์์ํ
 
Last updated





