thread

Thread

์“ฐ๋ ˆ๋“œ๋ผ๋Š” ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœ์„ธ์Šค์™€ ๋ณ‘ํ–‰์„ฑ(Concurrency)์˜ ๊ฐœ๋…์„ ์•Œ๋ฉด ๋” ์ข‹์„ ๊ฒƒ๊ฐ™๋‹ค.

ํ”„๋กœ์„ธ์Šค

ํ”„๋กœ์„ธ์Šค์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ๊ฐ™์€ ์‹œ๊ฐ„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋„์šฐ๋Š” ์‹œ๋ถ„ํ•  ๋ฐฉ์‹์„ ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํŠน์ง•

  • ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋‹จ์œ„

  • ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ ์‹คํ–‰ ๋  ๋•Œ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋ณ€์ˆ˜๋‚˜ ์ž๋ฃŒ ๊ตฌ์กฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

  • ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋ณ„๋„์˜ ์ฃผ์†Œ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋œ๋‹ค.

  • ์ปดํ“จํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋˜์–ด ์‹คํ–‰๋˜์–ด ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•œ๋‹ค.

  • ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋Š” ์ƒ์„ฑ, ์‹คํ–‰, ์ค€๋น„, ๋Œ€๊ธฐ, ์ข…๋ฃŒ๊ฐ€ ์žˆ๋‹ค.

๋ณ‘ํ–‰์„ฑ (Concurrency) == ๋™์‹œ์„ฑ

๋ณ‘๋ ฌ์„ฑ๊ณผ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ณ‘ํ–‰์„ฑ์€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์œผ๋กœ ์‹ฑ๊ธ€์ฝ”์–ด์—์„œ๋Š” ์‹œ๋ถ„ํ• ๊ธฐ๋ฒ•์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฉ€ํ‹ฐ์ฝ”์–ด์—์„œ๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ณ‘๋ ฌ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ‘๋ ฌ์„ฑ(Parallelism)์€ ์‹ค์ œ๋กœ ๋™์‹œ์— ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฉ€ํ‹ฐ์ฝ”์—์—์„œ๋งŒ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์“ฐ๋ ˆ๋“œ

ํ”„๋กœ์„ธ์Šค์˜ ํŠน์ •ํ•œ ์ˆ˜ํ–‰ ๊ฒฝ๋กœ๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น ๋ฐ›์€ ์ž์›์„ ์ด์šฉํ•˜๋Š” ์‹คํ–‰์˜ ๋‹จ์œ„๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํŠน์ง•

  • ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์Šคํƒ/๋ ˆ์ง€์Šคํ„ฐ๋งŒ ๊ฐ๊ฐ ํ• ๋‹น ๋ฐ›๊ณ  ๋‚˜๋จธ์ง€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ ๊ณต์œ ํ•œ๋‹ค. ์Šคํƒ์€ ๊ฐ๊ฐ ํ• ๋‹นํ•˜๋Š” ์ด์œ  : ์Šค๋ ˆ๋“œ๋Š” ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ์จ ์ตœ์†Œํ•œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ(์Šคํƒ)์€ ๊ฐ๊ฐ ํ• ๋‹นํ•ด์•ผ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Thread ํด๋ž˜์Šค์™€ Runnable ์ธํ„ฐํŽ˜์ด์Šค

์ž๋ฐ”์—์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” Thread ํด๋ž˜์Šค์™€ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

Thread ํด๋ž˜์Šค extends

Thread ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” threadํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ th1๊ณผ th2์™€ ๊ฐ™์ด ์ต๋ช… ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€ ๊ฐ€ ์กด์žฌํ•˜๊ณ  ๋‘๋ฒˆ์งธ๋ฐฉ๋ฒ•์ธ ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์˜ค์ง ํ•œ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ ๋ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Runnable ์ธํ„ฐํŽ˜์ด์Šค implements

Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•œ Thread์ƒ์„ฑ๋ฐฉ๋ฒ•๋„ ๋‘๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  1. Runnalbe ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ implementsํ•œ class๋ฅผ ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

  2. Runnable ์ธํ„ฐํŽ˜์ด์Šค๋Š” run๋ฉ”์„œ๋“œ๋ฐ–์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ ์„ ์ด์šฉํ•˜์—ฌ ๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•ด ๋ฐ”๋กœ run๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

์ฐจ์ด์ 

  1. Thread ํด๋ž˜์Šค๋ฅผ extendsํ•˜๋Š” ๋ฐฉ๋ฒ•์€ class๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ์ธ ๋งŒํผ Thread์˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋“ค์„ ์ด์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‹ค๋ฅธ class๋ฅผ ์ƒ์†๋ฐ›์ง€ ๋ชปํ•˜์ง€๋งŒ, Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ class๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ  ์กฐ๊ธˆ ๋” ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด๋‹ค.

  2. Threadํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” class๋Š” run ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ•์€ Thread ํด๋ž˜์Šค๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ž™์…˜์ด ๋˜๋”๋ผ๋„ ๊ตฌํ˜„์ฒด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ž™์…˜์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  3. 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 single thread

single process multi thread

single process multi thread

multi process single thread

multi process single thread

multi process multi 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์„ ๊ฑฐ๋Š”๋ฐ ๋‹ค์ˆ˜์˜ ํŠธ๋žœ์ ์…˜์ด ๋™์‹œ์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ คํ•œ๋‹ค๋ฉด ๋ฐ๋“œ๋ฝ์— ๋น ์งˆ ์œ„ํ—˜์ด ์žˆ๋‹ค.

๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ์กฐ๊ฑด(์ด์œ )

  1. Mutual Exclusion(Mutex) : ์ž์›์— ๋™์‹œ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ

  2. Hold & Wait : ์ ์œ ํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ธฐ (์ž์›์„ ์ ์œ ํ•œ์ฑ„๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์˜ ์ž์›์„ ๋ฐ˜๋‚ฉ๋ฐ›๊ธธ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ)

  3. No Preemption : ์ž์›์„ ๊ฐ•์ œ๋กœ ๋บ์–ด์˜ค์ง€ ๋ชปํ•จ

  4. Circular Wait : ์ˆœํ™˜ ํ˜•ํƒœ๋กœ ๋Œ€๊ธฐ

๋ฐ๋“œ๋ฝ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  1. ๋ฐ๋“œ๋ฝ ์˜ˆ๋ฐฉ : ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ์กฐ๊ฑด 4๊ฐ€์ง€๋ฅผ ์›์ฒœ ๋ด‰์‡„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  2. ๋ฐ๋“œ๋ฝ์˜ ํšŒํ”ผ : ์ž์›์ด ์–ด๋–ป๊ฒŒ ์š”์ฒญ๋ ์ง€์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ž์› ํ• ๋‹น์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

  3. ๋ฐ๋“œ๋ฝ ํƒ์ง€ & ํšŒ๋ณต : ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ–ˆ์„๋•Œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

  4. ๋ฐ๋“œ๋ฝ ๋ฌด์‹œ : ์•„์ฃผ ์ ์€ ํ™•๋ฅ ๋กœ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ๋ฌด์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ์žฌ์‹คํ–‰ํ•˜๋Š” ํŽธ์ด ์ž์›์ ์œผ๋กœ ๋” ์ด๋“์„ ๋ณผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฐ๋“œ๋ฝ ๋ฐฉ์ง€ ๋ฐฉ๋ฒ•๋“ค

  1. ๋ฝ ์ •๋ ฌ : ๋ชจ๋“  ๋ฝ์ด ํ•ญ์ƒ ๊ฐ™์€ ์ˆœ์„œ๋กœ ํš๋“๋œ๋‹ค๋ฉด ๋ฐ๋“œ๋ฝ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํšจ๊ณผ์ ์ด๋‚˜ ๋ฝ์˜ ์ˆœ์„œ๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ์ƒํƒœ์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (๋ฐ๋“œ๋ฝ ์˜ˆ๋ฐฉ)

  2. ๋ฝ ํƒ€์ž„ ์•„์›ƒ : ๋ฝ์„ ํš๋“ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ •ํ•ด๋†“๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„์—๋Š” ๋ฝ์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋Š” ๋ฐฉ๋ฒ• (๋ฐ๋“œ๋ฝ ํƒ์ง€&ํšŒ๋ณต)

๊ฐ™์€ ๋ฝ์„ ํš๋“ํ•˜๋ ค๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ์—๊ฒŒ ๊ธฐํšŒ๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์ •์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ๋˜๊ณ , ๋ฐ๋“œ๋ฝ ๋ฟ๋งŒ์ด ์•„๋‹Œ ์ž‘์—…์„ ์ฒ˜๋ฆฌ์ค‘์—๋„ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

  1. ๋ฐ๋“œ๋ฝ ๊ฐ์ง€ : ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฝ์„ ํš๋“ํ•˜๋ฉด ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ์ด์šฉํ•ด ๋ฐ๋“œ๋ฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด, ๋ฝ์„ ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•

  2. Atomic Variable : volatile ํ‚ค์›Œ๋“œ๋‚˜ java.util.concurrent.atomic ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์›์ž ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์“ฐ๋ ˆ๋“œ ํ’€

์“ฐ๋ ˆ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ํ•„์š”ํ• ๋•Œ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐ˜๋‚ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ’€์žฅ์˜ ๊ฐœ๋…

java.util.concurrent.Executors์—์„œ ์Šค๋ ˆ๋“œํ’€ ๊ด€๋ จ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์žฅ์ 

  • ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ/์ˆ˜๊ฑฐํ•˜๋Š”๋ฐ ๋น„์šฉ์ด ์ ๋‹ค.

  • ์œ„์˜ ์ด์œ ๋กœ ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ• ๋•Œ ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹จ์ 

  • ์‚ฌ์šฉํ•˜๋Š” ์–‘๋ณด๋‹ค ๋งŽ์ด ์ƒ์„ฑํ•ด๋‘๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋œ๋‹ค.

  • ๋…ธ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์“ฐ๋ ˆ๋“œ ํ’€์˜ ๊ตฌ์กฐ

  1. Task์˜ ์š”์ฒญ์„ ๋ฐ›๋Š” Queue

  2. ์‹ค์ œ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” manager

  3. Queue ์•ˆ์—์„œ Task๋ฅผ ๊บผ๋‚ด์™€ ์‹ค์ œ ์“ฐ๋ ˆ๋“œ์œ„์— ๋™์ž‘์‹œ์ผœ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋ถ€๋ถ„

์ƒ์„ฑ ๋ฉ”์„œ๋“œ

  1. Executors.newFixedThreadPool(10) : ์ตœ๋Œ€ ์“ฐ๋ ˆ๋“œ๋ฅผ 10๊ฐœ๊นŒ์ง€ ๋งŒ๋“œ๋Š” ํ’€

  2. Executors.newCachedThreadPool() : ์“ฐ๋ ˆ๋“œ ์ˆ˜์˜ ์ œํ•œ์„ ๋‘์ง€ ์•Š๋Š” ํ’€๋กœ ์“ฐ๋ ˆ๋“œ ์‹œ์ž‘ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ๋•Œ ์ƒ์„ฑํ•˜๊ณ  ์ข…๋ฃŒ์‹œ์— ๋ฐ”๋กœ ์ฃฝ์ง€์•Š๊ณ  ์งง์€ ์‹œ๊ฐ„(1๋ถ„)๋™์•ˆ ์‚ด์•„์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ํ’€

  3. Executors.newSingleThreadExecutor() : ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ’€๋กœ ์“ฐ๋ ˆ๋“œ ์ž‘์—…์ค‘์— ์˜ˆ์™ธ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์“ฐ๋ ˆ๋“œ์šฉ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

  4. 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