"์•ˆ๋…•, ์•„๋ฏธ๊ณ !"

"์•ˆ๋…•, ๋ฆฌ์‹œ!"

"Object ํด๋ž˜์Šค์˜ wait , notify ๋ฐ notifyAll ๋ฉ”์†Œ๋“œ๋ฅผ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ."

"์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค๊ณผ ์นœํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ๋Œ์•„์™€์„œ ์ด๊ฒƒ์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค."

"์ข‹์•„์š”."

"์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์ผ๋ถ€๋กœ ๋ฐœ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค."

"Java์—๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ  ๋ฆฌ์†Œ์Šค(๊ฐœ์ฒด)์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ์Œ์„ ์ƒ๊ธฐ์‹œ์ผœ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ๊ฐœ์ฒด๊ฐ€ ์‚ฌ์šฉ ์ค‘์ž„์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ์‚ฌ์šฉ ์ค‘์ธ ๊ฐœ์ฒด๊ฐ€ ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. "

"๊ธฐ์–ต๋‚˜๋„ค์š”. ๋™๊ธฐํ™”๋œ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ทธ๋ ‡๊ฒŒ ํ•˜์„ธ์š” ."

"๋งž์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค."

public void print()
{
 Object monitor = getMonitor();
 synchronized(monitor)
 {
  System.out.println("text");
 }
}

"์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ธฐ์–ตํ•ด?"

"์˜ˆ. ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— print() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ synchronized๋ผ๊ณ  ํ‘œ์‹œ๋œ ๋ธ”๋ก์— ์ง„์ž…ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์ž ๊ทธ๋ฏ€๋กœ ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค."

"๋งž์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋จ์ด๋ผ๋Š” ๋ผ๋ฒจ์ด ๋ถ™์€ ๋ธ”๋ก์— ๋“ค์–ด๊ฐ€๋ฉด ๋ชจ๋‹ˆํ„ฐ ๊ฐœ์ฒด๋Š” ์‚ฌ์šฉ ์ค‘์ธ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ๋ชจ๋‹ˆํ„ฐ ๊ฐœ์ฒด๊ฐ€ ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๊ฐ•์ œ๋กœ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ชจ๋‹ˆํ„ฐ ๊ฐœ์ฒด๋ฅผ ํ”„๋กœ๊ทธ๋žจ์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "

"๊ทธ๋‚˜์ €๋‚˜ ์ด๋ฆ„ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"

"๋ชจ๋‹ˆํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ ์ค‘ ๋˜๋Š” ๋น„์–ด ์žˆ๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐœ์ฒด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค."

"๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋Œ€๊ธฐ ๋ฐ ์•Œ๋ฆผ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค."

"์‚ฌ์‹ค, ์ด๊ฒƒ๋“ค์€ ์ •๋ง ์œ ์ผํ•œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์˜ ์ ์‘์ผ ๋ฟ์ž…๋‹ˆ๋‹ค."

"์ด์ œ ๋Œ€๊ธฐ ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ด๊ณ  ์™œ ํ•„์š”ํ•œ์ง€ ๋จธ๋ฆฌ๋ฅผ ๊ฐ์•„๋ด…์‹œ๋‹ค . "

"๋•Œ๋•Œ๋กœ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋œ ์ฝ”๋“œ ๋ธ”๋ก์— ๋“ค์–ด๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์ž ๊ทธ์ง€๋งŒ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ํŒŒ์ผ์˜ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๊ทธ๋Ÿฐ ๊ฒƒ."

"ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์•„์ง ๋‹ค์šด๋กœ๋“œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 1์ดˆ ์ •๋„ ์ž ์ž๊ณ  ๋‹ค์šด๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๋‹ค์‹œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค."

"์ด ๊ฐ™์€:"

while(!file.isDownloaded())
{
 Thread.sleep(1000);
}
processFile(file);

"ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๋Œ€๊ธฐ๋Š” ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์ž ๊ฐ”๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋„ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋”๋ผ๋„ ๊ฐ•์ œ๋กœ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค."

" wait() ๋ฉ”์„œ๋“œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ํ•ด์ œํ•œ ๋‹ค์Œ ์Šค๋ ˆ๋“œ๋ฅผ ยซ์ผ์‹œ ์ค‘๋‹จยปํ•ฉ๋‹ˆ๋‹ค.

"๋ชจ๋‹ˆํ„ฐ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ผ ๋•Œ๋งŒ(์ฆ‰, ๋™๊ธฐํ™”๋œ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋งŒ) ๋ชจ๋‹ˆํ„ฐ ๊ฐœ์ฒด์˜ ๋Œ€๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์‹คํ–‰์„ ์ค‘์ง€ํ•˜๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค."

"์Šค๋ ˆ๋“œ๊ฐ€ ๋™๊ธฐํ™”๋œ ๋ธ”๋ก์— ๋“ค์–ด๊ฐ€ ๋Œ€๊ธฐ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค ."

"๊ทธ๋Ÿฌ๋ฉด ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋“ค์–ด์™€ ์ผ์‹œ ์ค‘๋‹จ๋˜๊ณ  ์„ธ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ ๋“ฑ์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค."

"๊ทธ๋Ÿฐ๋ฐ ์Šค๋ ˆ๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์žฌ๊ฐœ๋˜๋‚˜์š”?"

"์ด๋ฅผ ์œ„ํ•ด ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋ฆผ์ž…๋‹ˆ๋‹ค."

"๋ชจ๋‹ˆํ„ฐ ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ผ ๋•Œ๋งŒ(์ฆ‰, ๋™๊ธฐํ™”๋œ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ๋งŒ) ๋ชจ๋‹ˆํ„ฐ ๊ฐœ์ฒด์˜ notify / notifyAll ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . notifyAll ๋ฉ”์„œ๋“œ๋Š” ์ด ๋ชจ๋‹ˆํ„ฐ ๊ฐœ์ฒด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์›๋‹ˆ๋‹ค."

" notify ๋ฉ”์†Œ๋“œ๋Š” ํ•˜๋‚˜์˜ ์ž„์˜ ์Šค๋ ˆ๋“œ๋ฅผ '๊ณ ์ • ํ•ด์ œ'ํ•˜์ง€๋งŒ, notifyAll ๋ฉ”์†Œ๋“œ๋Š” ์ด ๋ชจ๋‹ˆํ„ฐ์˜ ๋ชจ๋“  ยซ๊ณ ์ •ยป ์Šค๋ ˆ๋“œ๋ฅผ ๊ณ ์ • ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค."

"๋งค์šฐ ํฅ๋ฏธ๋กญ๊ตฐ. ๊ณ ๋งˆ์›Œ, ๋ฆฌ์‹œ."

"wait() ๋ฉ”์„œ๋“œ์˜ ์ ์‘๋„ ์žˆ์Šต๋‹ˆ๋‹ค."

wait() ๋ฉ”์„œ๋“œ ์„ค๋ช…
void wait(long timeout)
์Šค๋ ˆ๋“œ๋Š” ยซ๋™๊ฒฐยป๋˜์ง€๋งŒ ๋ฉ”์†Œ๋“œ์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ๋ฐ€๋ฆฌ์ดˆ ์ˆ˜๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์ž๋™์œผ๋กœ ยซ๋™๊ฒฐ ํ•ด์ œยป๋ฉ๋‹ˆ๋‹ค.
void wait(long timeout, int nanos)
์Šค๋ ˆ๋“œ๋Š” "์ •์ง€"๋˜์ง€๋งŒ ์ธ์ˆ˜๋กœ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ ๋‚˜๋…ธ์ดˆ ์ˆ˜๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์ž๋™์œผ๋กœ "์ •์ง€ ํ•ด์ œ"๋ฉ๋‹ˆ๋‹ค.

"์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํƒ€์ž„์•„์›ƒ์ด ์žˆ๋Š” ๋Œ€๊ธฐ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์ธ ๋Œ€๊ธฐ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€๋งŒ ์ง€์ •๋œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ณ  ์Šค๋ ˆ๋“œ๊ฐ€ ๊นจ์–ด๋‚˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์Šค์Šค๋กœ ๊นจ์–ด๋‚ฉ๋‹ˆ๋‹ค."