๐ŸŽฏ F-lab Java 4์ฃผ์ฐจ ํ•™์Šต ์ปค๋ฆฌํ˜๋Ÿผ

4์ฃผ์ฐจ ์ž๋ฃŒ์˜ ๋ชจ๋“  ํ† ํ”ฝ์„ "๊ธฐ์ดˆ โ†’ ๋™๊ธฐํ™” โ†’ ํ˜‘๋ ฅ โ†’ ์ถ”์ƒํ™”" ์ˆœ์„œ๋กœ ์žฌ๋ฐฐ์—ดํ•œ ํ•™์Šต ๊ฒฝ๋กœ.
1~3์ฃผ์ฐจ์—์„œ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ๋ฆ„์„ ๋ดค๋‹ค๋ฉด, 4์ฃผ์ฐจ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์›€์ง์ด๋Š” ์„ธ๊ณ„ ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃฌ๋‹ค.
๋ฉด์ ‘ยท์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์˜์—ญ์ด๋ฉฐ, ๋ถ„๋Ÿ‰๋„ ๊ฐ€์žฅ ๋งŽ๋‹ค.


๐Ÿ“Š ํ•™์Šต ๊ฒฝ๋กœ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

[Phase 1] ๋™์‹œ์„ฑ์˜ ๊ธฐ์ดˆ โ€” ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ
   โ†“
[Phase 2] Sync/Async ร— Blocking/Non-Blocking 4๋ถ„๋ฉด
   โ†“
[Phase 3] ์Šค๋ ˆ๋“œ ๋งŒ๋“ค๊ณ  ๋‹ค๋ฃจ๊ธฐ
   โ†“
[Phase 4] ๋™๊ธฐํ™” โ€” synchronized์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์‹œ์„ฑ  โ—„โ”€โ”€ 4์ฃผ์ฐจ 1์ฐจ ์ •์ 
   โ†“
[Phase 5] ์ •๊ตํ•œ ๋ฝ โ€” LockSupport์™€ ReentrantLock
   โ†“
[Phase 6] ์Šค๋ ˆ๋“œ ๊ฐ„ ํ˜‘๋ ฅ โ€” ์ƒ์‚ฐ์ž/์†Œ๋น„์ž, ์ธํ„ฐ๋ŸฝํŠธ, yield
   โ†“
[Phase 7] ์ง์ ‘ ์‚ฌ์šฉ์˜ ํ•œ๊ณ„์™€ Executor ํ”„๋ ˆ์ž„์›Œํฌ  โ—„โ”€โ”€ 4์ฃผ์ฐจ 2์ฐจ ์ •์ 
   โ†“
[Phase 8] ๊ณ ๊ธ‰ ๋น„๋™๊ธฐ โ€” CompletableFuture์™€ ForkJoinPool

์ด 8 Phase ร— 35 Unit โ€” ์‹ค์Šต ๋น„์ค‘์ด ๋งค์šฐ ๋†’์•„ ์••์ถ• 7์ผ ๋˜๋Š” ์—ฌ์œ  14์ผ ๊ถŒ์žฅ.

๐Ÿ”— 1ยท2ยท3์ฃผ์ฐจ์™€์˜ ๊ด€๊ณ„

์˜์—ญ1์ฃผ์ฐจ2์ฃผ์ฐจ3์ฃผ์ฐจ4์ฃผ์ฐจ (์ง€๊ธˆ)
๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธHeap/StackMethod Area 3๋ถ„ํ• (์—†์Œ)์Šค๋ ˆ๋“œ๋ณ„ ์บ์‹œ vs ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ, volatile
์ปฌ๋ ‰์…˜๊ฐœ์š”๋‚ด๋ถ€ ๊ตฌ์กฐ์ „์ฒด ์ง€๋„ConcurrentHashMap, ConcurrentLinkedQueue
I/O๊ฐœ์š”(์—†์Œ)NIO/Stream/ChannelBlocking vs Non-Blocking ๊นŠ์ด
์‹ ๊ทœOOPReflection๋žŒ๋‹ค/์ŠคํŠธ๋ฆผsynchronized, Lock, Executor, CompletableFuture, ForkJoin

๐Ÿ—“๏ธ ๊ถŒ์žฅ ํ•™์Šต ์ผ์ • (์••์ถ• 7์ผ)

DayPhaseํ•™์Šต ๋ชฉํ‘œ
1์ผ์ฐจPhase 1 + 2ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ ๊ธฐ์ดˆ + 4๋ถ„๋ฉด ๋งคํŠธ๋ฆญ์Šค
2์ผ์ฐจPhase 3Thread/Runnable, ๋ฐ๋ชฌ, join()
3์ผ์ฐจPhase 4synchronized + volatile (โ˜… 1์ฐจ ์ •์ )
4์ผ์ฐจPhase 5LockSupport, ReentrantLock, tryLock
5์ผ์ฐจPhase 6wait/notify, ์ธํ„ฐ๋ŸฝํŠธ, yield
6์ผ์ฐจPhase 7Executor ํ”„๋ ˆ์ž„์›Œํฌ ์ „์ฒด (โ˜… 2์ฐจ ์ •์ )
7์ผ์ฐจPhase 8CompletableFuture, ForkJoinPool

์—ฌ์œ  ์ผ์ • (14์ผ): Phase 4ยท7์€ ๊ฐ 2์ผ์”ฉ ๋ฐฐ์ •. ๋™์‹œ์„ฑ์€ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋Œ๋ ค๋ด์•ผ ์ฒดํ™”๋จ.


๐Ÿ“š Phase 1 โ€” ๋™์‹œ์„ฑ์˜ ๊ธฐ์ดˆ: ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ

๋ชฉํ‘œ: ๋ฉ€ํ‹ฐํƒœ์Šคํ‚นยท๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑยทํ”„๋กœ์„ธ์Šคยท์Šค๋ ˆ๋“œ์˜ ์ •์˜์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํžˆ ์žก๋Š”๋‹ค.

Unit 1.1 โ€” ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น vs ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ

์„ ์ˆ˜ ์ง€์‹: 1์ฃผ์ฐจ Phase 4 (JVM)

ํ•ต์‹ฌ ๊ฐœ๋…

๊ตฌ๋ถ„๋ฉ€ํ‹ฐํƒœ์Šคํ‚น๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ
์ •์˜1๊ฐœ CPU(์ฝ”์–ด)๊ฐ€ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ฒˆ๊ฐˆ์•„ ์‹คํ–‰์—ฌ๋Ÿฌ CPU(์ฝ”์–ด)๊ฐ€ ๋™์‹œ์— ์ž‘์—…
๊ธฐ๋ฐ˜์†Œํ”„ํŠธ์›จ์–ด (์‹œ๋ถ„ํ•  ์Šค์ผ€์ค„๋ง)ํ•˜๋“œ์›จ์–ด (๋‹ค์ค‘ ์ฝ”์–ด)
์˜ˆ์‹œOS์˜ ๋ฉ€ํ‹ฐํ”„๋กœ๊ทธ๋žจ ํ™˜๊ฒฝํ˜„๋Œ€ ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU
  • ์‹œ๋ถ„ํ• (Time Sharing): CPU ์‹œ๊ฐ„์„ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ์•„๊ฐ€๋ฉฐ ํ• ๋‹น โ†’ "๋™์‹œ ์‹คํ–‰์ฒ˜๋Ÿผ" ๋А๊ปด์ง
  • ์Šค์ผ€์ค„๋ง: ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ์–ผ๋งˆ๋‚˜ ์‹คํ–‰ํ• ์ง€ OS๊ฐ€ ๊ฒฐ์ •

์ž๊ธฐ ์ ๊ฒ€

  • ์ฝ”์–ด๊ฐ€ 1๊ฐœ์ธ ์‹œ์Šคํ…œ์—์„œ๋„ "๋™์‹œ ์‹คํ–‰"์ด ๊ฐ€๋Šฅํ•ด ๋ณด์ด๋Š” ์ด์œ ๋Š”?
  • ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น๊ณผ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ์€ ํ•จ๊ป˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ๊ฐ€?

Unit 1.2 โ€” ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ

์„ ์ˆ˜ ์ง€์‹: Unit 1.1

ํ•ต์‹ฌ ๊ฐœ๋…

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

  • ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ (๋””์Šคํฌ์˜ ํŒŒ์ผ์ด ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜ฌ๋ผ์˜จ ๊ฒƒ)
  • ๋…๋ฆฝ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋ณด์œ 
  • OS๊ฐ€ ๋ณ„๋„์˜ ์ž‘์—… ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ
  • ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จ

์Šค๋ ˆ๋“œ:

  • ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ์‹คํ–‰ํ•˜๋Š” ํ๋ฆ„
  • "์‹ค(thread)์ด ์ฝ”๋“œ๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ๊ฟฐ๋Š”" ๋น„์œ 

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์„ฑ:

ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ
โ”œโ”€โ”€ ์ฝ”๋“œ ์„น์…˜      โ”
โ”œโ”€โ”€ ๋ฐ์ดํ„ฐ ์„น์…˜    โ”‚ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ 
โ”œโ”€โ”€ ํž™(Heap)      โ”˜
โ””โ”€โ”€ ์Šคํƒ(Stack)   โ† ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๊ฐœ๋ณ„ ํ• ๋‹น

์ž๊ธฐ ์ ๊ฒ€

  • ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ๋ฅผ ํด๋ž˜์Šค/์ธ์Šคํ„ด์Šค์— ๋น„์œ ํ•˜๋ฉด?
  • ์Šค๋ ˆ๋“œ๋“ค์ด ํž™์€ ๊ณต์œ ํ•˜๊ณ  ์Šคํƒ์€ ๋”ฐ๋กœ ๊ฐ–๋Š” ์ด์œ ๋Š”?

Unit 1.3 โ€” ๋ณ€์ˆ˜ ์ข…๋ฅ˜์™€ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜ (4์ฃผ์ฐจ ๊ด€์ )

์„ ์ˆ˜ ์ง€์‹: Unit 1.2, 2์ฃผ์ฐจ Phase 1

ํ•ต์‹ฌ ๊ฐœ๋…

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ด€์ ์—์„œ์˜ ๋ณ€์ˆ˜ ๋งคํ•‘:

๋ณ€์ˆ˜์ €์žฅ ์œ„์น˜๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ด€์ 
์ง€์—ญ ๋ณ€์ˆ˜Stack (์Šค๋ ˆ๋“œ๋ณ„)์Šค๋ ˆ๋“œ ์•ˆ์ „ (๊ณต์œ  ์•ˆ ๋จ)
์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜Heap๊ณต์œ  โ†’ ๋™๊ธฐํ™” ํ•„์š”
ํด๋ž˜์Šค ๋ณ€์ˆ˜ (static)Method Area (Data)๊ณต์œ  โ†’ ๋™๊ธฐํ™” ํ•„์š”
์ „์—ญ ๋ณ€์ˆ˜ (static)Method Area (Data)๊ณต์œ  โ†’ ๋™๊ธฐํ™” ํ•„์š”

ํ•ต์‹ฌ ํ†ต์ฐฐ: "์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•œ๊ฐ€?"์˜ ๋‹ต์€ ๋Œ€๋ถ€๋ถ„ "๊ณต์œ ๋˜๋Š”๊ฐ€?" ์™€ ๊ฐ™๋‹ค.

์ž๊ธฐ ์ ๊ฒ€

  • ๋ฉ”์„œ๋“œ ์•ˆ์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?
  • static ๋ณ€์ˆ˜์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ๋™๊ธฐํ™” ์šฐ๋ ค๋Š” ๊ฐ™์€๊ฐ€, ๋‹ค๋ฅธ๊ฐ€?

Unit 1.4 โ€” ์Šค์ผ€์ค„๋ง ํ์™€ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ

์„ ์ˆ˜ ์ง€์‹: Unit 1.2

ํ•ต์‹ฌ ๊ฐœ๋…

์Šค์ผ€์ค„๋ง ํ:

  • OS ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” ๋Œ€๊ธฐ ์ค„
  • ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ํ์—์„œ ์ž๊ธฐ ์ฐจ๋ก€๋ฅผ ๊ธฐ๋‹ค๋ฆผ
  • ์ฝ”์–ด๊ฐ€ N๊ฐœ๋ฉด ๋™์‹œ์— N๊ฐœ ์Šค๋ ˆ๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅ

์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(Context Switching):

  • ์Šค๋ ˆ๋“œ A โ†’ B๋กœ ์ „ํ™˜ ์‹œ
  • A์˜ CPU ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ
  • B์˜ ์ด์ „ ์ƒํƒœ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋กœ๋“œ
  • ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ (์žฆ์œผ๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜)

์ž๊ธฐ ์ ๊ฒ€

  • ์Šค๋ ˆ๋“œ๋ฅผ ๋ฌดํ•œํžˆ ๋งŽ์ด ๋งŒ๋“ค๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ ๋Š”?
  • ์ฝ”์–ด 4๊ฐœ์— ์Šค๋ ˆ๋“œ 4๊ฐœ์™€ ์Šค๋ ˆ๋“œ 100๊ฐœ์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋Š”?

๐Ÿ“š Phase 2 โ€” Sync/Async ร— Blocking/Non-Blocking 4๋ถ„๋ฉด

๋ชฉํ‘œ: 4๊ฐ€์ง€ ์šฉ์–ด๊ฐ€ ๋ฉด์ ‘์—์„œ ์ž์ฃผ ํ—ท๊ฐˆ๋ฆฌ๋Š”๋ฐ, "๋ฌด์—‡์ด ๋‹ค๋ฅธ ์ถ•์ธ๊ฐ€" ๋ฅผ ๋ช…ํ™•ํžˆ ์žก๋Š”๋‹ค.

Unit 2.1 โ€” Sync vs Async (์ž‘์—… ์ˆœ์„œ ๊ด€์ )

์„ ์ˆ˜ ์ง€์‹: Phase 1

ํ•ต์‹ฌ ๊ฐœ๋…

  • Sync(๋™๊ธฐ): ์ž‘์—… A ์™„๋ฃŒ ํ›„์— B ์‹คํ–‰ (์ˆœ์„œ ๋ณด์žฅ)
  • Async(๋น„๋™๊ธฐ): A์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  B ์‹คํ–‰ (์ˆœ์„œ ๋ฌด๊ด€)

ํ•ต์‹ฌ ์งˆ๋ฌธ: "๋‹ค์Œ ์ž‘์—…์„ ์œ„ํ•ด ์ด์ „ ์ž‘์—…์˜ ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ํ•˜๋Š”๊ฐ€?"

์ž๊ธฐ ์ ๊ฒ€

  • "DB ์ฟผ๋ฆฌ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ"ํ•œ๋‹ค๋Š” ๋ง์˜ ์˜๋ฏธ๋Š”?
  • ๋น„๋™๊ธฐ๊ฐ€ ํ•ญ์ƒ ๋” ๋น ๋ฅธ๊ฐ€? (ํžŒํŠธ: ๋‹จ์ผ ์ž‘์—…์˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ vs ์‹œ์Šคํ…œ ์ฒ˜๋ฆฌ๋Ÿ‰)

Unit 2.2 โ€” Blocking vs Non-Blocking (์ œ์–ด๊ถŒ ๊ด€์ )

์„ ์ˆ˜ ์ง€์‹: Unit 2.1

ํ•ต์‹ฌ ๊ฐœ๋…

  • Blocking: ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ํ˜ธ์ถœ์ž๋Š” ์ œ์–ด๊ถŒ์„ ์žƒ๊ณ  ๋Œ€๊ธฐ
  • Non-Blocking: ํ˜ธ์ถœ ์ฆ‰์‹œ ์ œ์–ด๊ถŒ ๋ฐ˜ํ™˜ โ†’ ํ˜ธ์ถœ์ž๋Š” ๋‹ค๋ฅธ ์ผ ๊ฐ€๋Šฅ

ํ•ต์‹ฌ ์งˆ๋ฌธ: "OS(๋˜๋Š” ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜)๊ฐ€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ ธ๊ฐ”๋Š”๊ฐ€, ์ฆ‰์‹œ ๋Œ๋ ค์คฌ๋Š”๊ฐ€?"

์ œ์–ด๊ถŒ์˜ ์˜๋ฏธ:

  • ํ•จ์ˆ˜์˜ ์‹คํ–‰ ํ๋ฆ„์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒ๋ฆฌ
  • ์ œ์–ด๊ถŒ์ด ๋„˜์–ด๊ฐ€๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” "ํ•  ์ผ์ด ์—†๋Š” ์ƒํƒœ" = ๋ธ”๋กœํ‚น

์ž๊ธฐ ์ ๊ฒ€

  • Sync์™€ Blocking์˜ ์ฐจ์ด๋ฅผ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…ํ•˜๋ผ
  • Non-Blocking ์ฝ”๋“œ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? (ํžŒํŠธ: polling, callback)

Unit 2.3 โ€” 4๋ถ„๋ฉด ๋งคํŠธ๋ฆญ์Šค (์‹ค์ „ ์˜ˆ์ œ)

์„ ์ˆ˜ ์ง€์‹: Unit 2.1, Unit 2.2

ํ•ต์‹ฌ ๊ฐœ๋…

BlockingNon-Blocking
Sync๊ฐ€์žฅ ๋‹จ์ˆœ (์ „ํ†ต IO)Polling ๋ฐฉ์‹
AsyncFuture.get()CompletableFuture, Callback

4๊ฐ€์ง€ ์กฐํ•ฉ ์ •๋ฆฌ:

  1. Sync + Blocking โ€” ์ „ํ†ต IO (Socket.read())
    • ๊ฐ€์žฅ ์ง๊ด€์ , ๊ฐ€์žฅ ๋น„ํšจ์œจ
  2. Sync + Non-Blocking โ€” NIO Polling
    • socketChannel.read() ๊ฐ€ 0 ๋ฐ˜ํ™˜ ์‹œ ๋‹ค๋ฅธ ์ผ
  3. Async + Blocking โ€” Future.get()
    • ์ž‘์—…์€ ๋น„๋™๊ธฐ, ๊ฒฐ๊ณผ ๋ฐ›์„ ๋•Œ ๋ธ”๋กœํ‚น
  4. Async + Non-Blocking โ€” CompletableFuture
    • ๊ฐ€์žฅ ํšจ์œจ์ , ์ฝœ๋ฐฑ์œผ๋กœ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ

์ž๊ธฐ ์ ๊ฒ€

  • "Async + Blocking์ด ์ง„์ •ํ•œ ๋น„๋™๊ธฐ๊ฐ€ ์•„๋‹ˆ๋‹ค"๋ผ๋Š” ๋ง์˜ ์˜๋ฏธ๋Š”?
  • ์–ด๋–ค ์กฐํ•ฉ์ด ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋ฉฐ, ๊ทธ ์ด์œ ๋Š”?

๐Ÿ“š Phase 3 โ€” ์Šค๋ ˆ๋“œ ๋งŒ๋“ค๊ณ  ๋‹ค๋ฃจ๊ธฐ

๋ชฉํ‘œ: ์Šค๋ ˆ๋“œ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค๊ณ  ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋ฉฐ ์ œ์–ดํ•œ๋‹ค.

Unit 3.1 โ€” ์Šค๋ ˆ๋“œ ์ƒํƒœ ๋‹ค์ด์–ด๊ทธ๋žจ

์„ ์ˆ˜ ์ง€์‹: Phase 1

ํ•ต์‹ฌ ๊ฐœ๋…

NEW โ”€โ”€start()โ”€โ”€> RUNNABLE โ”€โ”€์ž‘์—…์ข…๋ฃŒโ”€โ”€> TERMINATED
                  โ”‚  โ†‘โ†“ (CPU ์Šค์ผ€์ค„๋Ÿฌ)
                  โ”‚
        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ†“         โ†“             โ†“
     BLOCKED   WAITING     TIMED_WAITING
   (synchronized) (wait, join)  (sleep, parkNanos)

์ƒํƒœ ์ „์ด:

  • NEW โ†’ RUNNABLE: start() ํ˜ธ์ถœ
  • RUNNABLE โ†’ BLOCKED: synchronized ๋ฝ ๋Œ€๊ธฐ
  • RUNNABLE โ†’ WAITING: wait(), join()
  • RUNNABLE โ†’ TIMED_WAITING: sleep(ms), wait(ms)
  • * โ†’ TERMINATED: run ์ข…๋ฃŒ

์ž๊ธฐ ์ ๊ฒ€

  • BLOCKED์™€ WAITING์˜ ์ฐจ์ด๋Š”? (ํžŒํŠธ: ๊นจ์–ด๋‚˜๋Š” ์กฐ๊ฑด)
  • getState()๋Š” RUNNING์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

Unit 3.2 โ€” Thread ํด๋ž˜์Šค ์ƒ์†

์„ ์ˆ˜ ์ง€์‹: Unit 3.1

ํ•ต์‹ฌ ๊ฐœ๋…

  • Thread ํด๋ž˜์Šค ์ƒ์† โ†’ run() ์˜ค๋ฒ„๋ผ์ด๋“œ
  • start() ํ˜ธ์ถœ๋กœ ์‹ค์ œ ์Šค๋ ˆ๋“œ ์‹œ์ž‘
  • run()์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ์ƒˆ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š์Œ (๊ทธ๋ƒฅ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)
class MyThread extends Thread {
    public void run() {
        System.out.println("Thread running");
    }
}
new MyThread().start();  // ์ƒˆ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ โœ…
new MyThread().run();    // ํ˜„์žฌ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ โŒ

์ž๊ธฐ ์ ๊ฒ€

  • run() ์ง์ ‘ ํ˜ธ์ถœ๊ณผ start() ํ˜ธ์ถœ์˜ ์ฐจ์ด๋ฅผ ์Šค๋ ˆ๋“œ ์ƒํƒœ๋กœ ์„ค๋ช…ํ•˜๋ผ
  • ๊ฐ™์€ Thread ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด start()๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด?

Unit 3.3 โ€” Runnable ์ธํ„ฐํŽ˜์ด์Šค (์™œ ๋” ์ข‹์€๊ฐ€)

์„ ์ˆ˜ ์ง€์‹: Unit 3.2

ํ•ต์‹ฌ ๊ฐœ๋…

Thread ์ƒ์†์˜ ํ•œ๊ณ„:

  • ์ž๋ฐ”๋Š” ๋‹จ์ผ ์ƒ์†๋งŒ ๊ฐ€๋Šฅ โ†’ ๋‹ค๋ฅธ ํด๋ž˜์Šค ์ƒ์† ๋ถˆ๊ฐ€
  • ์ž‘์—…๊ณผ ์Šค๋ ˆ๋“œ ์ œ์–ด๊ฐ€ ๊ฒฐํ•ฉ๋จ

Runnable์˜ ์žฅ์  3๊ฐ€์ง€:
1. ๋‹ค๋ฅธ ํด๋ž˜์Šค ์ƒ์† ๊ฐ€๋Šฅ (์ž๋ฐ” ๋‹จ์ผ ์ƒ์† ์ œ์•ฝ ํšŒํ”ผ)
2. ์ž‘์—…๊ณผ ์Šค๋ ˆ๋“œ ๋ถ„๋ฆฌ (๊ฐ์ฒด์ง€ํ–ฅ์  ์„ค๊ณ„)
3. ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ (์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ Runnable ๊ณต์œ  ๊ฐ€๋Šฅ)

Runnable task = () -> System.out.println("Task");
new Thread(task).start();
new Thread(task).start();  // ๊ฐ™์€ ์ž‘์—…์„ 2๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰

์ž๊ธฐ ์ ๊ฒ€

  • ๋žŒ๋‹ค๋กœ Runnable์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š”? (ํžŒํŠธ: ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค)
  • Spring์˜ @Async๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Thread vs Runnable ์ค‘ ๋ฌด์—‡์„ ์“ธ๊นŒ?

Unit 3.4 โ€” ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ(Daemon Thread)

์„ ์ˆ˜ ์ง€์‹: Unit 3.3

ํ•ต์‹ฌ ๊ฐœ๋…

  • ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ: ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ๋“ค์ด ๋ชจ๋‘ ์ข…๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ํ•จ๊ป˜ ์ข…๋ฃŒ
  • ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ: ๋ชจ๋“  ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด์•ผ JVM ์ข…๋ฃŒ
  • setDaemon(true) ๋กœ ์„ค์ • (start() ์ „์—)

์šฉ๋„: GC ์Šค๋ ˆ๋“œ, ๋ชจ๋‹ˆํ„ฐ๋ง, ๋กœ๊น… ๋“ฑ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ณด์กฐ ์ž‘์—…

์ฃผ์˜: ์ž‘์—… ์™„๋ฃŒ ๋ณด์žฅ์ด ํ•„์š”ํ•˜๋ฉด ๋ฐ๋ชฌ์œผ๋กœ ์„ค์ • ๊ธˆ์ง€

์ž๊ธฐ ์ ๊ฒ€

  • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค๊ณ  ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜๋Š”๊ฐ€? (ํžŒํŠธ: ๋‹ค๋ฅธ ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ)
  • ํŒŒ์ผ ์ €์žฅ ์ž‘์—…์„ ๋ฐ๋ชฌ์œผ๋กœ ๋Œ๋ฆฌ๋ฉด ์–ด๋–ค ์‚ฌ๊ณ ๊ฐ€ ๊ฐ€๋Šฅํ•œ๊ฐ€?

Unit 3.5 โ€” join()

์„ ์ˆ˜ ์ง€์‹: Unit 3.4

ํ•ต์‹ฌ ๊ฐœ๋…

  • t.join(): t ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋ฅผ ๋Œ€๊ธฐ
  • ๊ฒฐ๊ณผ ํšŒ์ˆ˜์˜ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ์‹

๋ณ‘๋ ฌ ์‹คํ–‰ vs ์ง๋ ฌ ์‹คํ–‰:

// ๋ณ‘๋ ฌ (3์ดˆ)
t1.start(); t2.start();
t1.join();  t2.join();

// ์ง๋ ฌ (5์ดˆ)  โ† ์ž˜๋ชป๋œ ํŒจํ„ด
t1.start(); t1.join();
t2.start(); t2.join();

์ž๊ธฐ ์ ๊ฒ€

  • join() ํ˜ธ์ถœ ์‹œ ํ˜ธ์ถœ์ž ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋Š”?
  • ๊ฒฐ๊ณผ ํšŒ์ˆ˜๋ฅผ ์œ„ํ•ด join ์™ธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€? (ํžŒํŠธ: Future)

๐Ÿ“š Phase 4 โ€” ๋™๊ธฐํ™”: synchronized์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์‹œ์„ฑ (โ˜… 1์ฐจ ์ •์ )

๋ชฉํ‘œ: ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์˜ ๊ฐ€์žฅ ํฐ ์ ์ธ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋ฅผ ๋ง‰๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ ๋„๊ตฌ๋ฅผ ๋งˆ์Šคํ„ฐํ•œ๋‹ค.

Unit 4.1 โ€” ์ž„๊ณ„ ์˜์—ญ(Critical Section)๊ณผ ๋™๊ธฐํ™”์˜ ํ•„์š”์„ฑ

์„ ์ˆ˜ ์ง€์‹: Phase 3

ํ•ต์‹ฌ ๊ฐœ๋…

  • ์ž„๊ณ„ ์˜์—ญ: ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ ์ ‘๊ทผ ์‹œ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณต์œ  ์ž์›(์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜, static ๋ณ€์ˆ˜, ๊ณต์œ  ๊ฐ์ฒด)์„ ์ˆ˜์ •ํ•˜๋Š” ๋ถ€๋ถ„

๊ณ ์ „์  ์˜ˆ์ œ:

class Counter {
    int count = 0;
    void increment() { count++; }  // โ† ์ž„๊ณ„ ์˜์—ญ
}

count++ ๋Š” ์‚ฌ์‹ค ์ฝ๊ธฐ โ†’ 1 ๋”ํ•˜๊ธฐ โ†’ ์“ฐ๊ธฐ 3๋‹จ๊ณ„ โ†’ ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ ์‹คํ–‰ ์‹œ ๊ฒฐ๊ณผ ์†์‹ค

์ž๊ธฐ ์ ๊ฒ€

  • count++ ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€ ๋™์ž‘์„ ์„ค๋ช…ํ•ด๋ณด๋ผ
  • "์›์ž์„ฑ(atomicity)"์ด๋ผ๋Š” ๋ง์˜ ์˜๋ฏธ๋Š”?

Unit 4.2 โ€” synchronized ๋ฉ”์„œ๋“œ

์„ ์ˆ˜ ์ง€์‹: Unit 4.1

ํ•ต์‹ฌ ๊ฐœ๋…

  • ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— synchronized ํ‚ค์›Œ๋“œ
  • ๊ฐ™์€ ๊ฐ์ฒด์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ง„์ž…
  • ์ž ๊ธˆ ๋Œ€์ƒ: this (ํ•ด๋‹น ์ธ์Šคํ„ด์Šค)
class Counter {
    private int count = 0;
    public synchronized void increment() {
        count++;
    }
}

์ž๊ธฐ ์ ๊ฒ€

  • static synchronized ๋ฉ”์„œ๋“œ์˜ ์ž ๊ธˆ ๋Œ€์ƒ์€? (ํžŒํŠธ: Class ๊ฐ์ฒด)
  • ๊ฐ™์€ ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ synchronized ๋ฉ”์„œ๋“œ ๋‘˜์ด ๋™์‹œ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ๊ฐ€?

Unit 4.3 โ€” synchronized ๋ธ”๋ก

์„ ์ˆ˜ ์ง€์‹: Unit 4.2

ํ•ต์‹ฌ ๊ฐœ๋…

  • ๋ฉ”์„œ๋“œ ์ผ๋ถ€๋งŒ ๋™๊ธฐํ™” โ†’ ๋™๊ธฐํ™” ๋ฒ”์œ„ ์ตœ์†Œํ™”
  • ์ž ๊ธˆ ๋Œ€์ƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ • ๊ฐ€๋Šฅ
public void increment() {
    // ๋น„๋™๊ธฐ ์˜์—ญ
    synchronized (this) {  // โ† ์ž„๊ณ„ ์˜์—ญ๋งŒ ์ž ๊ธˆ
        count++;
    }
    // ๋น„๋™๊ธฐ ์˜์—ญ
}

์„ ํƒ ๊ฐ€์ด๋“œ:

  • ๋ฉ”์„œ๋“œ ์ „์ฒด๊ฐ€ ์ž„๊ณ„ ์˜์—ญ โ†’ synchronized ๋ฉ”์„œ๋“œ
  • ์ผ๋ถ€๋งŒ ์ž„๊ณ„ ์˜์—ญ โ†’ synchronized ๋ธ”๋ก (์„ฑ๋Šฅ โ†‘)

์ž๊ธฐ ์ ๊ฒ€

  • synchronized (this) ์™€ synchronized (new Object()) ์˜ ์ฐจ์ด๋Š”?
  • ์ž„๊ณ„ ์˜์—ญ์„ ๋„ˆ๋ฌด ๋„“๊ฒŒ ์žก์œผ๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€?

Unit 4.4 โ€” ๋ชจ๋‹ˆํ„ฐ ๋ฝ(Monitor Lock)์˜ ๋™์ž‘

์„ ์ˆ˜ ์ง€์‹: Unit 4.3

ํ•ต์‹ฌ ๊ฐœ๋…

  • ๋ชจ๋“  ์ž๋ฐ” ๊ฐ์ฒด๋Š” ๋ชจ๋‹ˆํ„ฐ ๋ฝ(=intrinsic lock)์„ 1๊ฐœ ๊ฐ€์ง
  • synchronized ์ง„์ž… ์‹œ: ๋ฝ ํš๋“ ์‹œ๋„
    • ์„ฑ๊ณต โ†’ RUNNABLE
    • ์‹คํŒจ โ†’ BLOCKED ์ƒํƒœ๋กœ ๋Œ€๊ธฐ
  • ๋ฉ”์„œ๋“œ/๋ธ”๋ก ์ข…๋ฃŒ ์‹œ: ๋ฝ ์ž๋™ ๋ฐ˜ํ™˜

๋ฝ ๊ฒฝ์Ÿ ์‹œ๋‚˜๋ฆฌ์˜ค:

  • 100๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ synchronized ๋ธ”๋ก ์ง„์ž… ์‹œ๋„
  • 1๊ฐœ๋งŒ ์„ฑ๊ณต โ†’ 99๊ฐœ๋Š” BLOCKED
  • ๋ฝ ํš๋“ ์ˆœ์„œ๋Š” ์ž๋ฐ” ํ‘œ์ค€์— ์ •์˜ ์—†์Œ (๊ณต์ •์„ฑ X)

synchronized์˜ ๋‹จ์ :

  • ๋ฌดํ•œ ๋Œ€๊ธฐ (ํƒ€์ž„์•„์›ƒ ๋ถˆ๊ฐ€)
  • ์ธํ„ฐ๋ŸฝํŠธ ๋ถˆ๊ฐ€
  • ๊ณต์ •์„ฑ ๋ณด์žฅ X

์ž๊ธฐ ์ ๊ฒ€

  • BLOCKED ์ƒํƒœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์šธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€? (ํžŒํŠธ: ๋ฝ ๋ฐ˜๋‚ฉ)
  • "๊ณต์ •์„ฑ(fairness)"์ด ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€?

Unit 4.5 โ€” volatile (๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์‹œ์„ฑ)

์„ ์ˆ˜ ์ง€์‹: Unit 4.4

ํ•ต์‹ฌ ๊ฐœ๋…

๋ฌธ์ œ ์‹œ๋‚˜๋ฆฌ์˜ค:

boolean runFlag = true;
// ์Šค๋ ˆ๋“œ A: while (runFlag) { ... }
// ์Šค๋ ˆ๋“œ B: runFlag = false;
// โ†’ A๊ฐ€ ์˜์›ํžˆ ์ข…๋ฃŒ ์•ˆ ๋จ!

์›์ธ: ๊ฐ CPU ์ฝ”์–ด๋Š” ์ž๊ธฐ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ฅผ ์‚ฌ์šฉ

  • ์Šค๋ ˆ๋“œ B์˜ false ๋ณ€๊ฒฝ์ด ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ˜์˜ ์•ˆ ๋จ
  • ์Šค๋ ˆ๋“œ A์˜ ์บ์‹œ๋Š” ์—ฌ์ „ํžˆ true

ํ•ด๊ฒฐ: volatile:

volatile boolean runFlag = true;
  • ์ฝ๊ธฐยท์“ฐ๊ธฐ ์‹œ ํ•ญ์ƒ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ ์ง์ ‘ ์ ‘๊ทผ
  • ์บ์‹œ ์‚ฌ์šฉ X โ†’ ์•ฝ๊ฐ„ ๋А๋ ค์ง€์ง€๋งŒ ๊ฐ€์‹œ์„ฑ ๋ณด์žฅ

์ค‘์š”: synchronized ์•ˆ์˜ ๋ณ€์ˆ˜๋Š” ์ž๋™์œผ๋กœ ๊ฐ€์‹œ์„ฑ ๋ณด์žฅ๋จ

์ž๊ธฐ ์ ๊ฒ€

  • volatile์ด ์›์ž์„ฑ๋„ ๋ณด์žฅํ•˜๋Š”๊ฐ€? (ํžŒํŠธ: NO. count++๋Š” ์—ฌ์ „ํžˆ ์œ„ํ—˜)
  • volatile๊ณผ synchronized์˜ ์ฐจ์ด๋ฅผ ํ•œ ๋ฌธ์žฅ์œผ๋กœ?

๐Ÿ“š Phase 5 โ€” ์ •๊ตํ•œ ๋ฝ: LockSupport์™€ ReentrantLock

๋ชฉํ‘œ: synchronized์˜ ํ•œ๊ณ„๋ฅผ ReentrantLock์œผ๋กœ ๊ทน๋ณตํ•˜๊ณ , ๋ฐ๋“œ๋ฝ์„ ํšŒํ”ผํ•˜๋Š” ํŒจํ„ด์„ ์ตํžŒ๋‹ค.

Unit 5.1 โ€” synchronized์˜ ํ•œ๊ณ„ ์ •๋ฆฌ

์„ ์ˆ˜ ์ง€์‹: Phase 4

ํ•ต์‹ฌ ํ•œ๊ณ„ 3๊ฐ€์ง€:
1. ๋ฌดํ•œ ๋Œ€๊ธฐ: ํƒ€์ž„์•„์›ƒ ์„ค์ • ๋ถˆ๊ฐ€
2. ์ธํ„ฐ๋ŸฝํŠธ ๋ถˆ๊ฐ€: ๋Œ€๊ธฐ ์ค‘ ์™ธ๋ถ€์—์„œ ๊นจ์šธ ์ˆ˜ ์—†์Œ
3. ๊ณต์ •์„ฑ X: ์–ด๋–ค ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฝ์„ ๋ฐ›์„์ง€ ๋ณด์žฅ ์—†์Œ

ํ•ด๊ฒฐ์ฑ…: ์ž๋ฐ”๋Š” ๋” ์ •๊ตํ•œ ๋ฝ ๋„๊ตฌ๋ฅผ ์ œ๊ณต

์ž๊ธฐ ์ ๊ฒ€

  • ์šด์˜ ํ™˜๊ฒฝ์—์„œ ๋ฌดํ•œ ๋Œ€๊ธฐ๊ฐ€ ์–ด๋–ค ์‚ฌ๊ณ ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š”๊ฐ€?
  • ๋ฐ๋“œ๋ฝ ์ƒํ™ฉ์—์„œ synchronized๋กœ๋Š” ์™œ ํšŒ๋ณต ๋ถˆ๊ฐ€๋Šฅํ•œ๊ฐ€?

Unit 5.2 โ€” LockSupport (์ €์ˆ˜์ค€ ๋„๊ตฌ)

์„ ์ˆ˜ ์ง€์‹: Unit 5.1

ํ•ต์‹ฌ ๊ฐœ๋…

LockSupport์˜ 3๊ฐ€์ง€ ๋ฉ”์„œ๋“œ:

  • park(): ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋ฅผ WAITING ์ƒํƒœ๋กœ (์ฃผ์ฐจ)
  • parkNanos(nanos): TIMED_WAITING ์ƒํƒœ๋กœ (์‹œ๊ฐ„ ํ•œ์ •)
  • unpark(thread): ๋Œ€์ƒ ์Šค๋ ˆ๋“œ๋ฅผ RUNNABLE๋กœ ๋ณต๊ท€
Thread t = new Thread(() -> {
    LockSupport.park();
    System.out.println("๊นจ์–ด๋‚จ");
});
t.start();
Thread.sleep(100);
LockSupport.unpark(t);  // ๊นจ์›€

ํŠน์ง•:

  • ์ธํ„ฐ๋ŸฝํŠธ๋กœ๋„ ๊นจ์šธ ์ˆ˜ ์žˆ์Œ
  • ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ์ €์ˆ˜์ค€ โ†’ ์‹ค๋ฌด์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
  • ReentrantLock์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋„๊ตฌ

์ž๊ธฐ ์ ๊ฒ€

  • park๋œ ์Šค๋ ˆ๋“œ๊ฐ€ BLOCKED๊ฐ€ ์•„๋‹Œ WAITING์ธ ์ด์œ ๋Š”?
  • ์™œ LockSupport๋ฅผ ์ง์ ‘ ์“ฐ์ง€ ์•Š๋Š”๊ฐ€?

Unit 5.3 โ€” ReentrantLock (์‹ค๋ฌด ํ‘œ์ค€)

์„ ์ˆ˜ ์ง€์‹: Unit 5.2

ํ•ต์‹ฌ ๊ฐœ๋…

  • Lock ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด (java.util.concurrent.locks)
  • synchronized์™€ ๊ฐ™์€ ํšจ๊ณผ + ์ถ”๊ฐ€ ๊ธฐ๋Šฅ
  • try-finally ํ•„์ˆ˜ (๋ฝ ๋ฐ˜๋‚ฉ ๋ณด์žฅ)
private final Lock lock = new ReentrantLock();

public boolean withdraw(int amount) {
    lock.lock();        // ๋ฝ ํš๋“
    try {
        // ์ž„๊ณ„ ์˜์—ญ
        balance -= amount;
        return true;
    } finally {
        lock.unlock();  // ๋ฐ˜๋“œ์‹œ finally์—์„œ!
    }
}

์™œ finally๊ฐ€ ํ•„์ˆ˜์ธ๊ฐ€:

  • ์ž„๊ณ„ ์˜์—ญ ์ค‘๊ฐ„์— ์˜ˆ์™ธ/return ๋ฐœ์ƒ ์‹œ โ†’ unlock ํ˜ธ์ถœ ์•ˆ ๋˜๋ฉด ๋ฐ๋“œ๋ฝ
  • ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค์ด ์˜์›ํžˆ ๋ฝ ๋ชป ์–ป์Œ

์ž๊ธฐ ์ ๊ฒ€

  • lock() ๊ณผ synchronized ์˜ ์ฐจ์ด๋ฅผ ํ•œ ๋ฌธ์žฅ์œผ๋กœ?
  • unlock() ์„ ๊นœ๋ฐ•ํ•˜๋ฉด ์–ด๋–ค ์‚ฌ๊ณ ๊ฐ€?

Unit 5.4 โ€” tryLock()์œผ๋กœ ๋ฐ๋“œ๋ฝ ํšŒํ”ผ

์„ ์ˆ˜ ์ง€์‹: Unit 5.3

ํ•ต์‹ฌ ๊ฐœ๋…

tryLock()์˜ ๋‘ ํ˜•ํƒœ:

  • boolean tryLock(): ์ฆ‰์‹œ ์‹œ๋„, ์‹คํŒจ ์‹œ false
  • boolean tryLock(time, unit): ์ง€์ • ์‹œ๊ฐ„๋งŒํผ ์‹œ๋„
if (!lock.tryLock()) {
    log("์ด๋ฏธ ์ฒ˜๋ฆฌ์ค‘์ธ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค.");
    return false;  // ๋ฌดํ•œ ๋Œ€๊ธฐ ์•ˆ ํ•จ
}
try {
    // ์ž„๊ณ„ ์˜์—ญ
} finally {
    lock.unlock();
}

๋ฐ๋“œ๋ฝ ํšŒํ”ผ ์‹œ๋‚˜๋ฆฌ์˜ค:

  • A ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฝ1 ๋ณด์œ , ๋ฝ2 ๋Œ€๊ธฐ
  • B ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฝ2 ๋ณด์œ , ๋ฝ1 ๋Œ€๊ธฐ
  • โ†’ lock() ์ด๋ฉด ์˜์›ํžˆ ๋ฉˆ์ถค
  • โ†’ tryLock() ์ด๋ฉด ํ•œ ์ชฝ์ด ํฌ๊ธฐํ•˜๊ณ  ์žฌ์‹œ๋„ โ†’ ๋ฐ๋“œ๋ฝ ํšŒํ”ผ

์ž๊ธฐ ์ ๊ฒ€

  • lock() ๋งŒ ์“ฐ๋Š” ์‹œ์Šคํ…œ์—์„œ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํšŒ๋ณตํ•˜๋Š”๊ฐ€?
  • tryLock(5, SECONDS) ๊ฐ€ ์‹คํŒจํ•œ ํ›„ ์–ด๋–ค ์ „๋žต์„ ์“ธ ์ˆ˜ ์žˆ๋‚˜?

๐Ÿ“š Phase 6 โ€” ์Šค๋ ˆ๋“œ ๊ฐ„ ํ˜‘๋ ฅ (์ƒ์‚ฐ์ž-์†Œ๋น„์ž, ์ธํ„ฐ๋ŸฝํŠธ, yield)

๋ชฉํ‘œ: ์Šค๋ ˆ๋“œ๋“ค์ด ๋‹จ์ˆœํžˆ ๊ฒฝ์Ÿํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜‘๋ ฅ ํ•˜๋Š” ํŒจํ„ด์„ ์ตํžŒ๋‹ค.

Unit 6.1 โ€” ์ƒ์‚ฐ์ž-์†Œ๋น„์ž ๋ฌธ์ œ

์„ ์ˆ˜ ์ง€์‹: Phase 4

ํ•ต์‹ฌ ๊ฐœ๋…

๋ฌธ์ œ ์ •์˜:

  • ์ƒ์‚ฐ์ž: ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ํ์— ๋„ฃ์Œ
  • ์†Œ๋น„์ž: ํ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด ์ฒ˜๋ฆฌ
  • ํ๊ฐ€ ๊ฝ‰ ์ฐจ๋ฉด ์ƒ์‚ฐ์ž๋Š” ๋Œ€๊ธฐ
  • ํ๊ฐ€ ๋น„๋ฉด ์†Œ๋น„์ž๋Š” ๋Œ€๊ธฐ

์‹ค์ œ ์‚ฌ๋ก€: ๋ฉ”์‹œ์ง€ ํ(MQ), ๋กœ๊น… ์‹œ์Šคํ…œ, ์ž‘์—… ํ

์ž๊ธฐ ์ ๊ฒ€

  • ํ๊ฐ€ ์ฐจ๊ณ  ๋น„๋Š” ์ƒํ™ฉ์„ ์ผ๋ฐ˜ ๋ฝ๋งŒ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€?
  • ์ด ๋ฌธ์ œ๊ฐ€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์˜ "ํ•ต์‹ฌ ๋ฌธ์ œ"๋ผ ๋ถˆ๋ฆฌ๋Š” ์ด์œ ๋Š”?

Unit 6.2 โ€” wait()๊ณผ notify()

์„ ์ˆ˜ ์ง€์‹: Unit 6.1

ํ•ต์‹ฌ ๊ฐœ๋…

  • wait(): synchronized ์•ˆ์—์„œ ํ˜ธ์ถœ โ†’ ๋ฝ์„ ๋ฐ˜๋‚ฉํ•˜๊ณ  WAITING ์ƒํƒœ๋กœ
  • notify(): WAITING ์ค‘์ธ ์Šค๋ ˆ๋“œ 1๊ฐœ๋ฅผ ๊นจ์›€
  • notifyAll(): ๋ชจ๋“  WAITING ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์›€
  • ๋ฐ˜๋“œ์‹œ synchronized ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
synchronized (lock) {
    while (queue.isEmpty()) {
        lock.wait();  // ๋ฝ ๋ฐ˜๋‚ฉ + ๋Œ€๊ธฐ
    }
    // ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
    lock.notify();  // ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ ๊นจ์›€
}

์™œ if๊ฐ€ ์•„๋‹ˆ๋ผ while?:

  • ๊นจ์–ด๋‚ฌ๋‹ค๊ณ  ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์—ˆ๋‹ค๋Š” ๋ณด์žฅ ์—†์Œ (Spurious wakeup)
  • ํ•ญ์ƒ ๋‹ค์‹œ ๊ฒ€์‚ฌํ•ด์•ผ ํ•จ

์ž๊ธฐ ์ ๊ฒ€

  • wait()๊ณผ sleep()์˜ ๊ฒฐ์ •์  ์ฐจ์ด๋Š”? (ํžŒํŠธ: ๋ฝ)
  • notify()์™€ notifyAll() ์ค‘ ์–ด๋А ๊ฒƒ์„ ๊ถŒ์žฅ? (ํžŒํŠธ: ์•ˆ์ „์„ฑ)

Unit 6.3 โ€” ์ธํ„ฐ๋ŸฝํŠธ(Interrupt) ๋ฉ”์ปค๋‹ˆ์ฆ˜

์„ ์ˆ˜ ์ง€์‹: Phase 3

ํ•ต์‹ฌ ๊ฐœ๋…

3๊ฐ€์ง€ ๋ฉ”์„œ๋“œ ๊ตฌ๋ถ„:

๋ฉ”์„œ๋“œ๋™์ž‘ํ”Œ๋ž˜๊ทธ ๋ณ€ํ™”
interrupt()์ธํ„ฐ๋ŸฝํŠธ ์‹ ํ˜ธ ๋ฐœ์†กtrue๋กœ ์„ค์ •
isInterrupted()ํ”Œ๋ž˜๊ทธ ํ™•์ธ (๋ณ€๊ฒฝ X)๋ณ€ํ™” ์—†์Œ
interrupted() (static)ํ”Œ๋ž˜๊ทธ ํ™•์ธ ํ›„ false๋กœtrue โ†’ false

๋ธ”๋กœํ‚น ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘:

  • sleep(), wait(), join() ์ค‘์— ์ธํ„ฐ๋ŸฝํŠธ ๋ฐ›์œผ๋ฉด
  • โ†’ InterruptedException ๋ฐœ์ƒ
  • โ†’ ํ”Œ๋ž˜๊ทธ๋Š” ์ž๋™์œผ๋กœ false๋กœ ๋ฆฌ์…‹

์ฆ‰๊ฐ ์ข…๋ฃŒ ํŒจํ„ด:

while (!Thread.interrupted()) {  // ๋งค๋ฒˆ ํ”Œ๋ž˜๊ทธ ์ฒดํฌ
    // ์ผ ์ˆ˜ํ–‰
}

์ž๊ธฐ ์ ๊ฒ€

  • interrupt() ๋งŒ ํ˜ธ์ถœํ–ˆ๋Š”๋ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฆ‰์‹œ ์ข…๋ฃŒ ์•ˆ ๋˜๋Š” ์ด์œ ๋Š”?
  • sleep() ๋„์ค‘ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€?

Unit 6.4 โ€” yield()

์„ ์ˆ˜ ์ง€์‹: Unit 6.3

ํ•ต์‹ฌ ๊ฐœ๋…

  • yield(): "๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— CPU๋ฅผ ์–‘๋ณดํ•˜๊ฒ ๋‹ค"๋Š” ํžŒํŠธ
  • ์ƒํƒœ๋Š” RUNNABLE ์œ ์ง€ (sleep๊ณผ ๋‹ค๋ฆ„)
  • ์Šค์ผ€์ค„๋ง ํ์— ๋‹ค์‹œ ๋“ค์–ด๊ฐ โ†’ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ๊ธฐํšŒ

์šฉ๋„: ๋ฐ”์œ ๋Œ€๊ธฐ(Busy Waiting) ์ƒํ™ฉ์—์„œ CPU ์ž์› ์ ˆ์•ฝ

while (!Thread.interrupted()) {
    if (queue.isEmpty()) {
        Thread.yield();  // CPU ์–‘๋ณด
        continue;
    }
    // ์ž‘์—…
}

์ƒํƒœ ๋น„๊ต:
| ๋ฉ”์„œ๋“œ | ๊ฒฐ๊ณผ ์ƒํƒœ |
|---|---|
| sleep() | RUNNABLE โ†’ TIMED_WAITING โ†’ RUNNABLE |
| yield() | RUNNABLE โ†’ RUNNABLE (์ž ๊น ์–‘๋ณด) |
| wait() | RUNNABLE โ†’ WAITING โ†’ RUNNABLE |

์ž๊ธฐ ์ ๊ฒ€

  • yield() ๊ฐ€ OS์˜ ๋ณด์žฅ๋œ ๋™์ž‘์ธ๊ฐ€? (ํžŒํŠธ: ๋‹จ์ˆœ ํžŒํŠธ)
  • ๋นˆ ๋ฃจํ”„ + yield ํŒจํ„ด์ด ์ ์ ˆํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š”?

๐Ÿ“š Phase 7 โ€” Executor ํ”„๋ ˆ์ž„์›Œํฌ (โ˜… 2์ฐจ ์ •์ )

๋ชฉํ‘œ: ์Šค๋ ˆ๋“œ ์ง์ ‘ ์‚ฌ์šฉ์˜ ๋ชจ๋“  ํ•œ๊ณ„๋ฅผ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•˜๋Š” ์ž๋ฐ” ํ‘œ์ค€ ๋™์‹œ์„ฑ ๋„๊ตฌ๋ฅผ ๋งˆ์Šคํ„ฐํ•œ๋‹ค.

Unit 7.1 โ€” ์ง์ ‘ ์‚ฌ์šฉ์˜ 3๊ฐ€์ง€ ๋ฌธ์ œ์ 

์„ ์ˆ˜ ์ง€์‹: Phase 3 ~ 6

ํ•ต์‹ฌ ๋ฌธ์ œ:

  1. ์ƒ์„ฑ ๋น„์šฉ:

    • ์Šค๋ ˆ๋“œ 1๊ฐœ = ์•ฝ 1MB ๋ฉ”๋ชจ๋ฆฌ
    • OS ์‹œ์Šคํ…œ ์ฝœ ํ•„์š”
    • "1000๋ฒˆ ํ˜ธ์ถœ์— 1000๊ฐœ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ"์€ ๋น„ํ˜„์‹ค์ 
  2. ๊ด€๋ฆฌ ๋ฌธ์ œ:

    • ๋ฌดํ•œํžˆ ์ƒ์„ฑํ•˜๋ฉด ์ž์› ๊ณ ๊ฐˆ
    • ์•ˆ์ „ ์ข…๋ฃŒ ์‹œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ ์ถ”์  ํ•„์š”
  3. Runnable์˜ ๋ถˆํŽธํ•จ:

    • ๋ฐ˜ํ™˜ ๊ฐ’ ์—†์Œ (void run())
    • ์ฒดํฌ ์˜ˆ์™ธ ๋˜์งˆ ์ˆ˜ ์—†์Œ

ํ•ด๊ฒฐ์ฑ… = ์Šค๋ ˆ๋“œ ํ’€ + ๋ฐ˜ํ™˜๊ฐ’ ๊ฐ€๋Šฅํ•œ ์ž‘์—… ์ธํ„ฐํŽ˜์ด์Šค = Executor ํ”„๋ ˆ์ž„์›Œํฌ

์ž๊ธฐ ์ ๊ฒ€

  • ์Šค๋ ˆ๋“œ 1๊ฐœ๋‹น 1MB๊ฐ€ ์‹ค๋ฌด์—์„œ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๊ฐ€?
  • Runnable๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ์–ด๋–ค ์šฐํšŒ ๋ฐฉ๋ฒ•์„ ์จ์•ผ ํ•˜๋Š”๊ฐ€?

Unit 7.2 โ€” Executor / ExecutorService / Executors

์„ ์ˆ˜ ์ง€์‹: Unit 7.1

ํ•ต์‹ฌ ๊ฐœ๋…

3๊ฐœ ํƒ€์ž…์˜ ์—ญํ•  ๋ถ„๋‹ด:

์ด๋ฆ„์—ญํ• 
Executor (์ธํ„ฐํŽ˜์ด์Šค)์ž‘์—… ์‹คํ–‰๋งŒ (execute(Runnable))
ExecutorService (์ธํ„ฐํŽ˜์ด์Šค)+ ์ž‘์—… ์ œ์–ด (submit, shutdown, invokeAll)
Executors (์œ ํ‹ธ ํด๋ž˜์Šค)ExecutorService ํŒฉํ† ๋ฆฌ

๊ด€๊ณ„:

Executor (์‹คํ–‰๋งŒ)
  โ””โ”€ ExecutorService (์‹คํ–‰ + ์ œ์–ด)
       โ†‘ ์ƒ์„ฑ
       โ””โ”€ Executors.newFixedThreadPool() ๋“ฑ

์ž๊ธฐ ์ ๊ฒ€

  • Executor ์™€ ExecutorService ๋ฅผ ๋ถ„๋ฆฌํ•œ ์ด์œ ๋Š”? (ํžŒํŠธ: ISP)
  • ์™œ new ThreadPoolExecutor(...) ๋Œ€์‹  Executors.xxx() ๋ฅผ ์“ฐ๋‚˜?

Unit 7.3 โ€” ์Šค๋ ˆ๋“œ ํ’€์˜ ์ข…๋ฅ˜

์„ ์ˆ˜ ์ง€์‹: Unit 7.2

ํ•ต์‹ฌ ๊ฐœ๋…

ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œํŠน์ง•์ ํ•ฉ ์ƒํ™ฉ
newFixedThreadPool(n)๊ณ ์ • n๊ฐœ ์Šค๋ ˆ๋“œ์ผ๋ฐ˜ ์„œ๋ฒ„, ์•ˆ์ •์„ฑ ์šฐ์„ 
newCachedThreadPool()ํ•„์š” ์‹œ ๋ฌดํ•œ ์ƒ์„ฑ, 60์ดˆ ํ›„ ํšŒ์ˆ˜์งง์€ ์ž‘์—… ๋‹ค์ˆ˜
newSingleThreadExecutor()1๊ฐœ ์Šค๋ ˆ๋“œ์ˆœ์„œ ๋ณด์žฅ ํ•„์š”
newScheduledThreadPool(n)์ฃผ๊ธฐ์ /์ง€์—ฐ ์‹คํ–‰์Šค์ผ€์ค„๋Ÿฌ, ๋ฐฐ์น˜

์ค‘์š” ์ฃผ์˜:

  • ํ’€ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์—…์ด ๋งŽ์œผ๋ฉด โ†’ ๋ธ”๋กœํ‚น ํ์— ๋Œ€๊ธฐ
  • newCachedThreadPool() ์€ ํŠธ๋ž˜ํ”ฝ ํญ์ฃผ ์‹œ ์œ„ํ—˜ (์Šค๋ ˆ๋“œ ํญ์ฆ)

์ž๊ธฐ ์ ๊ฒ€

  • ์ผ๋ฐ˜ ์›น ์„œ๋ฒ„์— ์ ํ•ฉํ•œ ํ’€์€?
  • 5๊ฐœ ์Šค๋ ˆ๋“œ ํ’€์— ๋™์‹œ์— 10๊ฐœ ์ž‘์—…์„ ์ œ์ถœํ•˜๋ฉด?

Unit 7.4 โ€” Callable๊ณผ Future (Runnable์˜ ํ•œ๊ณ„ ๊ทน๋ณต)

์„ ์ˆ˜ ์ง€์‹: Unit 7.3

ํ•ต์‹ฌ ๊ฐœ๋…

Runnable vs Callable:

ํ•ญ๋ชฉRunnableCallable
๋ฉ”์„œ๋“œvoid run()V call() throws Exception
๋ฐ˜ํ™˜๊ฐ’โŒโœ… (์ œ๋„ค๋ฆญ)
์ฒดํฌ ์˜ˆ์™ธโŒโœ…

Future:

  • submit() ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…
  • ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ๋‚˜์ค‘์— ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์•ฝ์†
  • get() ์œผ๋กœ ๊ฒฐ๊ณผ ํšŒ์ˆ˜ (๋ธ”๋กœํ‚น)
ExecutorService es = Executors.newFixedThreadPool(2);
Future<Integer> future = es.submit(() -> {
    Thread.sleep(2000);
    return 42;
});
log("future ์ฆ‰์‹œ ๋ฐ˜ํ™˜ (์ž‘์—…์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ง„ํ–‰)");
Integer result = future.get();  // ์—ฌ๊ธฐ์„œ ๋ธ”๋กœํ‚น

์ž๊ธฐ ์ ๊ฒ€

  • submit() ํ˜ธ์ถœ ์ฆ‰์‹œ Future๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ, ์ž‘์—…์€ ์–ด๋””์„œ ์‹คํ–‰๋˜๋Š”๊ฐ€?
  • future.get() ํ˜ธ์ถœ ์ „์— ์ž‘์—…์ด ์ด๋ฏธ ๋๋‚ฌ๋‹ค๋ฉด?

Unit 7.5 โ€” Future.cancel()

์„ ์ˆ˜ ์ง€์‹: Unit 7.4

ํ•ต์‹ฌ ๊ฐœ๋…

cancel(mayInterruptIfRunning):

  • true: ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…์— ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ โ†’ ์ฆ‰์‹œ ์ค‘๋‹จ ์‹œ๋„
  • false: ์‹คํ–‰ ์ค‘์ด๋ฉด ๊ทธ๋ƒฅ ๋‘ , ์ƒˆ๋กœ ์‹คํ–‰์€ ์•ˆ ํ•จ
  • ๋‘˜ ๋‹ค Future ์ƒํƒœ๋Š” CANCELLED ๋กœ ๋ณ€๊ฒฝ

์ดํ›„ get() ํ˜ธ์ถœ ์‹œ โ†’ CancellationException

์ž๊ธฐ ์ ๊ฒ€

  • ์ž‘์—… ์•ˆ์—์„œ Thread.sleep(1000) ์ค‘์ธ๋ฐ cancel(true) ํ˜ธ์ถœ ์‹œ ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€?
  • ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ์ž‘์—…์— cancel(true) ๊ฐ€ ํšจ๊ณผ ์žˆ๋Š”๊ฐ€?

Unit 7.6 โ€” invokeAll() / invokeAny()

์„ ์ˆ˜ ์ง€์‹: Unit 7.5

ํ•ต์‹ฌ ๊ฐœ๋…

๋ฉ”์„œ๋“œ๋™์ž‘
invokeAll(tasks)๋ชจ๋“  ์ž‘์—… ์™„๋ฃŒ ๊นŒ์ง€ ๋Œ€๊ธฐ, ๋ชจ๋“  ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
invokeAny(tasks)์ฒซ ๋ฒˆ์งธ ์™„๋ฃŒ๋œ ์ž‘์—… ์˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜, ๋‚˜๋จธ์ง€ ์ทจ์†Œ

ํ™œ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค:

  • invokeAll: ์—ฌ๋Ÿฌ ์™ธ๋ถ€ API ํ˜ธ์ถœ ํ›„ ๋ชจ๋“  ๊ฒฐ๊ณผ ์ข…ํ•ฉ
  • invokeAny: ์—ฌ๋Ÿฌ ํ›„๋ณด ์ค‘ ๊ฐ€์žฅ ๋นจ๋ฆฌ ์‘๋‹ตํ•œ ๊ฒƒ ์ฑ„ํƒ (์˜ˆ: ๋ฏธ๋Ÿฌ ์„œ๋ฒ„)

์ž๊ธฐ ์ ๊ฒ€

  • invokeAll ๋„์ค‘ ํ•œ ์ž‘์—…์ด ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋ฉด?
  • invokeAny ๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅธ ์‘๋‹ต์„ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€?

Unit 7.7 โ€” shutdown() vs shutdownNow()

์„ ์ˆ˜ ์ง€์‹: Unit 7.6

ํ•ต์‹ฌ ๊ฐœ๋…

๋ฉ”์„œ๋“œ์ƒˆ ์ž‘์—… ๊ฑฐ์ ˆ์ง„ํ–‰ ์ค‘ ์ž‘์—…ํ์˜ ์ž‘์—…
shutdown()โœ…๋งˆ๋ฌด๋ฆฌ๋งˆ๋ฌด๋ฆฌ
shutdownNow()โœ…์ธํ„ฐ๋ŸฝํŠธํฌ๊ธฐ (๋ฐ˜ํ™˜๋จ)

์•ˆ์ „ ์ข…๋ฃŒ ํŒจํ„ด:

es.shutdown();
if (!es.awaitTermination(60, SECONDS)) {
    es.shutdownNow();  // 60์ดˆ ๋‚ด ์•ˆ ๋๋‚˜๋ฉด ๊ฐ•์ œ
}

์ž๊ธฐ ์ ๊ฒ€

  • ์šด์˜ ์„œ๋ฒ„ ์ข…๋ฃŒ ์‹œ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์จ์•ผ ๋ฐ์ดํ„ฐ ์†์‹ค์ด ์—†๋Š”๊ฐ€?
  • shutdownNow() ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” List์—๋Š” ๋ฌด์—‡์ด ๋‹ด๊ธฐ๋Š”๊ฐ€?

๐Ÿ“š Phase 8 โ€” ๊ณ ๊ธ‰ ๋น„๋™๊ธฐ (CompletableFuture & ForkJoinPool)

๋ชฉํ‘œ: Future์˜ ํ•œ๊ณ„(๋ธ”๋กœํ‚น ํšŒ์ˆ˜)๋ฅผ ๋„˜๋Š” ์ง„์ •ํ•œ ๋น„๋™๊ธฐ + ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋„๊ตฌ๋ฅผ ์ตํžŒ๋‹ค.

Unit 8.1 โ€” Future์˜ ํ•œ๊ณ„์™€ CompletableFuture

์„ ์ˆ˜ ์ง€์‹: Unit 7.4

Future์˜ ํ•œ๊ณ„:

  • ๊ฒฐ๊ณผ ํšŒ์ˆ˜๊ฐ€ ๋ธ”๋กœํ‚น (future.get())
  • ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์—ฐ๊ฒฐ์ด ๋ถˆํŽธ
  • ์ฝœ๋ฐฑ ๋“ฑ๋ก ๋ถˆ๊ฐ€

CompletableFuture์˜ ํ•ด๊ฒฐ:

  • thenApply, thenAccept, thenCombine ๋“ฑ ์ฒด์ด๋‹
  • ๊ฒฐ๊ณผ ์ค€๋น„๋˜๋ฉด ์ฝœ๋ฐฑ ์ž๋™ ์‹คํ–‰ (๋ธ”๋กœํ‚น X)
CompletableFuture.supplyAsync(() -> 5)
    .thenApply(x -> x * 2)            // ๋ณ€ํ™˜
    .thenCombine(otherFuture, Integer::sum)  // ๊ฒฐํ•ฉ
    .thenAccept(System.out::println); // ์†Œ๋น„

System.out.println("Main thread continues...");  // ์ฆ‰์‹œ ์‹คํ–‰

์ž๊ธฐ ์ ๊ฒ€

  • Future.get() ๊ณผ CompletableFuture.thenAccept() ์˜ ๋ณธ์งˆ์  ์ฐจ์ด๋Š”?
  • ์™ธ๋ถ€ API 3๊ฐœ๋ฅผ ๋ณ‘๋ ฌ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ ํ•ฉ์น˜๊ธฐ๋Š” ์–ด๋–ป๊ฒŒ?

Unit 8.2 โ€” ForkJoinPool๊ณผ work-stealing

์„ ์ˆ˜ ์ง€์‹: Phase 7

ํ•ต์‹ฌ ๊ฐœ๋…

์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ ํ’€์˜ ํ•œ๊ณ„:

  • ํ•œ ์ž‘์—…์ด ํฐ ๊ฒฝ์šฐ ๋ถ„ํ• ์ด ์–ด๋ ค์›€
  • ์Šค๋ ˆ๋“œ๋ณ„ ์ž‘์—… ๋ถ„๋ฐฐ๊ฐ€ ์ •์ 

ForkJoinPool์˜ ์•„์ด๋””์–ด:

  • ํฐ ์ž‘์—…์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ• (Fork) โ†’ ์ž‘์€ ์ž‘์—…
  • ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์ž๊ธฐ ํ ์— ์ž‘์—… ๋ณด๊ด€
  • ๋†€๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์˜ ํ์—์„œ ์ž‘์—…์„ ํ›”์นœ๋‹ค(Work-stealing)

ํšจ๊ณผ: ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์‰ด ํ‹ˆ ์—†์ด ์ผํ•จ โ†’ CPU ์‚ฌ์šฉ๋ฅ  ๊ทน๋Œ€ํ™”

์ž๊ธฐ ์ ๊ฒ€

  • "Work-stealing" ์ด ์ผ๋ฐ˜ ํ ๋ถ„๋ฐฐ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ด์œ ๋Š”?
  • ForkJoinPool์— ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ž‘์—…์ด ์ ํ•ฉํ•œ๊ฐ€? (ํžŒํŠธ: ๋ถ„ํ•  ๊ฐ€๋Šฅํ•œ CPU ๋ฐ”์šด๋“œ)

Unit 8.3 โ€” RecursiveTask vs RecursiveAction

์„ ์ˆ˜ ์ง€์‹: Unit 8.2

ํ•ต์‹ฌ ๊ฐœ๋…

ํด๋ž˜์Šค๋ฐ˜ํ™˜๊ฐ’
RecursiveTask<V>์žˆ์Œ (V)
RecursiveAction์—†์Œ (void)

๊ตฌํ˜„ ํŒจํ„ด:
1. compute() ์˜ค๋ฒ„๋ผ์ด๋“œ
2. ์ž‘์—…์ด ์ž‘์œผ๋ฉด ์ง์ ‘ ์ฒ˜๋ฆฌ
3. ํฌ๋ฉด ๋‘˜๋กœ ๋‚˜๋ˆ ์„œ:

  • leftTask.fork() (๋น„๋™๊ธฐ ์‹œ์ž‘)
  • rightResult = rightTask.compute() (๋™๊ธฐ ์ฒ˜๋ฆฌ)
  • leftResult = leftTask.join() (๋Œ€๊ธฐ ํ›„ ํ•ฉ์‚ฐ)
class SumTask extends RecursiveTask<Long> {
    protected Long compute() {
        if (์ž‘์—…์ด ์ž‘์œผ๋ฉด) return ์ง์ ‘๊ณ„์‚ฐ();
        SumTask left = new SumTask(start, mid);
        SumTask right = new SumTask(mid+1, end);
        left.fork();
        long r = right.compute();
        long l = left.join();
        return l + r;
    }
}

์ž๊ธฐ ์ ๊ฒ€

  • fork() ์™€ compute() ๋ฅผ ๋™์‹œ์— ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋‚˜๋ˆ  ์“ฐ๋Š” ์ด์œ ๋Š”?
  • ์ž๋ฐ” ์ŠคํŠธ๋ฆผ์˜ parallelStream() ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

๐ŸŽ“ ์ข…ํ•ฉ ์ž๊ธฐ ์ ๊ฒ€ (4์ฃผ์ฐจ ์กธ์—… ์‹œํ—˜)

๋™์‹œ์„ฑ ๊ธฐ์ดˆ

  1. ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น๊ณผ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์‹ฑ์˜ ์ฐจ์ด๋Š”?
  2. ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์„ฑ ์ฐจ์ด๋Š”?
  3. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด ์ผ์–ด๋‚  ๋•Œ ๋ฌด์Šจ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?
  4. ์ง€์—ญ/์ธ์Šคํ„ด์Šค/static ๋ณ€์ˆ˜ ์ค‘ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€?

Sync/Async ร— Blocking/Non-Blocking

  1. Sync์™€ Blocking์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ธฐ์ค€์€? (ํžŒํŠธ: ๋‹ค๋ฅธ ์ถ•)
  2. 4๊ฐ€์ง€ ์กฐํ•ฉ ์ค‘ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๊ฒƒ์€? ๊ทธ ์ด์œ ๋Š”?
  3. "Async + Blocking์ด ์ง„์ •ํ•œ ๋น„๋™๊ธฐ๊ฐ€ ์•„๋‹ˆ๋‹ค"์˜ ์˜๋ฏธ๋Š”?

์Šค๋ ˆ๋“œ ๋‹ค๋ฃจ๊ธฐ

  1. start() ์™€ run() ์˜ ์ฐจ์ด๋Š”?
  2. Thread ์ƒ์† vs Runnable ๊ตฌํ˜„ โ€” ํ›„์ž๊ฐ€ ๊ถŒ์žฅ๋˜๋Š” 3๊ฐ€์ง€ ์ด์œ ๋Š”?
  3. ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ž‘์—… ์ข…๋ฃŒ ๋ณด์žฅ์ด ํ•„์š”ํ•œ ๊ณณ์— ์“ฐ๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ ๋Š”?

synchronized & volatile

  1. ์ž„๊ณ„ ์˜์—ญ์˜ ์ •์˜๋Š”?
  2. synchronized ๋ฉ”์„œ๋“œ์™€ ๋ธ”๋ก์˜ ์ž ๊ธˆ ๋Œ€์ƒ ์ฐจ์ด๋Š”?
  3. synchronized์˜ 3๊ฐ€์ง€ ํ•œ๊ณ„๋Š”?
  4. volatile์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋Š”?
  5. volatile์€ ์›์ž์„ฑ์„ ๋ณด์žฅํ•˜๋Š”๊ฐ€? (ํžŒํŠธ: NO)

Lock ๋„๊ตฌ

  1. ReentrantLock์˜ lock() ๋‹ค์Œ์— ๋ฐ˜๋“œ์‹œ try-finally ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š”?
  2. tryLock() ์ด ๋ฐ๋“œ๋ฝ์„ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•˜๋Š”๊ฐ€?
  3. LockSupport๊ฐ€ ์‹ค๋ฌด์—์„œ ์ง์ ‘ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š”?

ํ˜‘๋ ฅ

  1. ์ƒ์‚ฐ์ž-์†Œ๋น„์ž ๋ฌธ์ œ๋ฅผ wait/notify๋กœ ํ•ด๊ฒฐํ•˜๋Š” ํŒจํ„ด์€?
  2. wait() ๊ฐ€ synchronized ์•ˆ์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์ด์œ ๋Š”?
  3. interrupt(), interrupted(), isInterrupted() ์˜ ์ฐจ์ด๋Š”?
  4. yield() ์™€ sleep() ์˜ ์ƒํƒœ ์ฐจ์ด๋Š”?

Executor

  1. ์Šค๋ ˆ๋“œ ์ง์ ‘ ์‚ฌ์šฉ์˜ 3๊ฐ€์ง€ ๋ฌธ์ œ์ ์€?
  2. Executor / ExecutorService / Executors์˜ ์—ญํ•  ์ฐจ์ด๋Š”?
  3. newCachedThreadPool() ์˜ ์œ„ํ—˜์„ฑ์€?
  4. Runnable๊ณผ Callable์˜ ์ฐจ์ด 3๊ฐ€์ง€๋Š”?
  5. Future.get() ๊ณผ CompletableFuture.thenAccept() ์˜ ์ฐจ์ด๋Š”?
  6. shutdown() ๊ณผ shutdownNow() ์ค‘ ์•ˆ์ „ ์ข…๋ฃŒ์— ์ ํ•ฉํ•œ ๊ฒƒ์€?

๊ณ ๊ธ‰ ๋น„๋™๊ธฐ

  1. CompletableFuture๊ฐ€ Future๋ณด๋‹ค ์šฐ์›”ํ•œ ์ ์€?
  2. ForkJoinPool์˜ work-stealing์ด ์ผ๋ฐ˜ ํ’€๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ด์œ ๋Š”?
  3. RecursiveTask์™€ RecursiveAction์˜ ์ฐจ์ด๋Š”?

๐Ÿ“Œ ํ•™์Šต ์šด์˜ ํŒ

9-์„น์…˜ ๋งˆ์Šคํ„ฐ ํ”„๋กฌํ”„ํŠธ๋กœ ๊นŠ์ด ํŒŒ์•ผ ํ•  Unit

๋ฐ˜๋“œ์‹œ ๊นŠ์ด ํŒŒ๊ธฐ (๋ฉด์ ‘ยท์‹ค๋ฌด ์ง๊ฒฐ):

  • Unit 2.3 โ€” 4๋ถ„๋ฉด ๋งคํŠธ๋ฆญ์Šค (โ˜…โ˜…โ˜… ๋ฉด์ ‘ ๋‹จ๊ณจ)
  • Unit 4.4 โ€” ๋ชจ๋‹ˆํ„ฐ ๋ฝ์˜ ๋™์ž‘ (โ˜…โ˜…โ˜… ๋ฉด์ ‘ ๋‹จ๊ณจ)
  • Unit 4.5 โ€” volatile (๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์‹œ์„ฑ)
  • Unit 5.4 โ€” tryLock + ๋ฐ๋“œ๋ฝ ํšŒํ”ผ (์‹ค๋ฌด ์ง๊ฒฐ)
  • Unit 7.4 โ€” Callable๊ณผ Future (Spring @Async์˜ ๊ธฐ๋ฐ˜)
  • Unit 8.1 โ€” CompletableFuture (์‹ค๋ฌด ๋น„๋™๊ธฐ ํ‘œ์ค€)

Phase๋ณ„ ์ง„๋„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

[ ] Phase 1 โ€” ๋™์‹œ์„ฑ ๊ธฐ์ดˆ (Unit 1.1~1.4)
[ ] Phase 2 โ€” 4๋ถ„๋ฉด ๋งคํŠธ๋ฆญ์Šค (Unit 2.1~2.3)
[ ] Phase 3 โ€” ์Šค๋ ˆ๋“œ ๋‹ค๋ฃจ๊ธฐ (Unit 3.1~3.5)
[ ] Phase 4 โ€” synchronized & volatile (Unit 4.1~4.5)  โ˜… 1์ฐจ ์ •์ 
[ ] Phase 5 โ€” Lock ๋„๊ตฌ (Unit 5.1~5.4)
[ ] Phase 6 โ€” ์Šค๋ ˆ๋“œ ํ˜‘๋ ฅ (Unit 6.1~6.4)
[ ] Phase 7 โ€” Executor ํ”„๋ ˆ์ž„์›Œํฌ (Unit 7.1~7.7)  โ˜… 2์ฐจ ์ •์ 
[ ] Phase 8 โ€” ๊ณ ๊ธ‰ ๋น„๋™๊ธฐ (Unit 8.1~8.3)
[ ] ์ข…ํ•ฉ ์ž๊ธฐ ์ ๊ฒ€ 31๋ฌธํ•ญ ํ†ต๊ณผ

์‹ค์Šต ๊ถŒ์žฅ ์‚ฌํ•ญ

ํ•„์ˆ˜ ์‹ค์Šต ์ฝ”๋“œ:
1. Race condition ์ง์ ‘ ์žฌํ˜„ (synchronized ์—†๋Š” ์นด์šดํ„ฐ ์ฆ๊ฐ€)
2. ๋ฐ๋“œ๋ฝ ์‹œ๋‚˜๋ฆฌ์˜ค (๋ฝ 2๊ฐœ ์žก๋Š” ๋‘ ์Šค๋ ˆ๋“œ)
3. wait/notify๋กœ ์ƒ์‚ฐ์ž-์†Œ๋น„์ž ๊ตฌํ˜„
4. ExecutorService๋กœ ๊ฐ™์€ ์ž‘์—…์„ ํ’€๋กœ ์ฒ˜๋ฆฌ
5. CompletableFuture ์ฒด์ด๋‹ (3๊ฐœ API ํ˜ธ์ถœ ํ•ฉ์น˜๊ธฐ)

๋””๋ฒ„๊น… ๋„๊ตฌ:

  • jstack <pid>: ์Šค๋ ˆ๋“œ ๋คํ”„ (BLOCKED/WAITING ํ™•์ธ)
  • VisualVM: ์Šค๋ ˆ๋“œ ์ƒํƒœ ์‹œ๊ฐํ™”
  • -XX:+PrintGCDetails: GC์™€ ์Šค๋ ˆ๋“œ์˜ ์ƒํ˜ธ์ž‘์šฉ

1ยท2ยท3ยท4์ฃผ์ฐจ ํ๋ฆ„ ์ •๋ฆฌ

  • 1์ฃผ์ฐจ: OOPยทJVMยทGCยท์ปฌ๋ ‰์…˜ยทI/O ๊ฐœ๋ก 
  • 2์ฃผ์ฐจ: JVM ๋‚ด๋ถ€ยท๋ฐ”์ดํŠธ์ฝ”๋“œยทG1 GCยทReflectionยทIterator
  • 3์ฃผ์ฐจ: ์ปฌ๋ ‰์…˜ ์ „์ฒด ์ง€๋„ยทํ•ด์‹œยท์ œ๋„ค๋ฆญยท๋น„๊ตยทI/O ๊นŠ์ดยทํ•จ์ˆ˜ํ˜•
  • 4์ฃผ์ฐจ (์ง€๊ธˆ): ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉยท๋™์‹œ์„ฑยท๋™๊ธฐํ™”ยทExecutorยท๋น„๋™๊ธฐ
profile
Software Developer

0๊ฐœ์˜ ๋Œ“๊ธ€