JiwonDev

Java์—์„œ์˜ ์ž„๊ณ„์˜์—ญ๊ณผ ๋ฐ๋“œ๋ฝ ํ•ด๊ฒฐ (sync, ๋ชจ๋‹ˆํ„ฐ)

by JiwonDev

 ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ๋•Œ, ๊ฐ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผ(access)ํ•˜๋Š” ์ฝ”๋“œ๋‚˜ ๋™์ž‘ ๋ถ€๋ถ„์„ ์ž„๊ณ„์˜์—ญ(Critical Section)์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ ๋œ ์ž์›์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ์— ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ƒํ˜ธ๋ฐฐ์ œ ๋ฌธ์ œ๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

 

์šด์˜์ฒด์ œ์—์„œ ์ž„๊ณ„์˜์—ญ (Critical Section) ๋™๊ธฐํ™”๋Š” ์•„์ฃผ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๊ธฐ์—, ์ด๋ฅผ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ์„ธ๋งˆํฌ์–ด, ๋ฎคํ…์Šค, ๋ชจ๋‹ˆํ„ฐ์ž…๋‹ˆ๋‹ค.

 

# ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋™๊ธฐํ™”(์ƒํ˜ธ๋ฐฐ์ œ) ๋ฐฉ๋ฒ•

@ ์„ธ๋งˆํฌ์–ด(Semaphore)

์นด์šดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž์›์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.


์˜›๋‚ ์— ์—ด์ฐจ๊ฐ€ ๋ถ€๋”ชํžˆ์ง€ ์•Š๊ฒŒ ํ‘œ์‹œํ–ˆ๋˜ ๊นƒ๋ฐœ์„ ์„ธ๋งˆํฌ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ„๋‹จํ•œ ์นด์šดํ„ฐ์ด๋ฉฐ ๊ณต์œ ๋œ ์ž์›์˜ ๋ฐ์ดํ„ฐ ํ˜น์€ ์ž„๊ณ„์˜์—ญ(Critical Section) ๋“ฑ์— ์—ฌ๋Ÿฌ Process ํ˜น์€ Thread๊ฐ€ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค๋‹ˆ๋‹ค. ์ฆ‰, ๋™๊ธฐํ™” ๋Œ€์ƒ์ด ํ•˜๋‚˜ ์ด์ƒ์ž…๋‹ˆ๋‹ค.


@ ๋ฎคํ…์Šค(Mutex)

๋ฎคํ…์Šค๋Š” ํ‚ค ๊ฐ’์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์นด์šดํ„ฐ ๊ฐ’์œผ๋กœ 0๊ณผ 1๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์„ธ๋งˆํฌ๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.


์ƒํ˜ธ๋ฐฐ์ œ (Mutual Exclusion)์—์„œ ๋‚˜์˜จ ๋ง๋กœ ๊ณต์œ ๋œ ์ž์›์˜ ๋ฐ์ดํ„ฐ ํ˜น์€ ์ž„๊ณ„์˜์—ญ(Critical Section)์„ ๊ฐ€์ง„ ์“ฐ๋ ˆ๋“œ๋“ค์˜ ๋Ÿฐํƒ€์ž„์— ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ๊ฐ๊ฐ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰๋˜๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค๋“ค์˜ ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์กฐ์œจํ•˜๊ธฐ ์œ„ํ•ด locking๊ณผ unlocking์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

 

์œ„์˜ ๋ฎคํ…์Šค์™€ ์„ธ๋งˆํฌ๋Š” ๋‘˜ ๋‹ค ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๊ธฐ์— ์ข€ ๋” ๋ณต์žกํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์„ ์ถ”๊ฐ€๋กœ ์ ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

@ ๋ชจ๋‹ˆํ„ฐ

ํ˜„๋Œ€์˜ ์šด์˜์ฒด์ œ๋Š” ์ž„๊ณ„์˜์—ญ ๋™๊ธฐํ™”(์ƒํ˜ธ๋ฐฐ์ œ ๋ฐฉ๋ฒ•)์œผ๋กœ ์„ธ๋งˆํฌ, ๋ฎคํ…์Šค๋ณด๋‹ค๋Š” ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋Š” 2๊ฐœ์˜ ํ(์ƒํ˜ธ๋ฒ ํƒ€ ํ, ์กฐ๊ฑด๋™๊ธฐ ํ)๋กœ ๊ตฌ์„ฑ๋˜์–ด์ง‘๋‹ˆ๋‹ค.

  • ์ƒํ˜ธ๋ฐฐํƒ€ ํ๋Š” ๋ง๊ทธ๋Œ€๋กœ ๊ณต์œ  ์ž์›์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์ง„์ž…ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ํ์ž…๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด๋™๊ธฐ ํ๋Š” ์ด๋ฏธ ๊ณต์œ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค์˜ wait() ํ˜ธ์ถœ์„ ํ†ตํ•ด ์กฐ๊ฑด๋™๊ธฐ ํ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

  1.  ์™ผ์ชฝ ํ์— ์ž์›์ด ํ•„์š”ํ•œ ์“ฐ๋ ˆ๋“œ๋“ค์„ ๋‹ด์•„, ํ•œ๊ฐœ์”ฉ ์ž„๊ณ„์˜์—ญ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  2.  ์ž„๊ณ„์˜์—ญ์— ์ ‘๊ทผํ•˜์˜€์œผ๋‚˜ I/O๋“ฑ์œผ๋กœ ์•„์ง ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์•„ ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ wait()์œผ๋กœ ์˜ค๋ฅธ์ชฝ ํ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ(block)ํ•˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
  3. ์˜ค๋ฅธ์ชฝ ํ(์กฐ๊ฑด๋™๊ธฐ)์— ๋“ค์–ด๊ฐ€์žˆ๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—์„œ notify()๋กœ ๊นจ์›Œ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด๋ฏธ ์ž„๊ณ„์˜์—ญ์„ ์‚ฌ์šฉ์ค‘์ด๊ฑฐ๋‚˜ ์•ž์— ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐ์ค‘์ด๋ผ๋ฉด notify()๋ฅผ ํ˜ธ์ถœ ํ–ˆ๋‹คํ•ด์„œ ๋ฐ”๋กœ ์‹คํ–‰๋˜๋Š”๊ฑด ์•„๋‹™๋‹ˆ๋‹ค. 


# ์ž๋ฐ”์˜ synchronized ๋ชจ๋‹ˆํ„ฐ

์ž๋ฐ”๋Š” ์“ฐ๋ ˆ๋“œ ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. synchronzied ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ž„๊ณ„๊ตฌ์—ญ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , Object ์— ๋‚ด์žฅ๋œ ๋ฉ”์„œ๋“œ (wait, notify)๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • wait(): ํ˜ธ์ถœํ•œ ์“ฐ๋ ˆ๋“œ๋ฅผ ์กฐ๊ฑด๋™๊ธฐ ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.
  • notify(): ์กฐ๊ฑด๋™๊ธฐ ํ(waiting pool)์— ์žˆ๋Š” ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊นจ์›Œ์ค€๋‹ค.
  • notifyAll(): ์กฐ๊ฑด๋™๊ธฐ ํ(waiting pool)์— ์žˆ๋Š” ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋ฅผ ๊นจ์›Œ์ค€๋‹ค.
// ์ž„๊ณ„๊ตฌ์—ญ์€ '๊ณต์œ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ ๊ตฌ๊ฐ„'์„ ์˜๋ฏธํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค.

class C {
  private int value, ...;     // ์‚ฌ์šฉํ•  ๊ณต์œ  ๋ณ€์ˆ˜
  
  public synchronized void Foo() {   
    // ์ด ๋ฉ”์„œ๋“œ์•ˆ์€ ์ „๋ถ€ ์ž„๊ณ„๊ตฌ์—ญ
  }
  
  public void Goo() { 
    synchronized {
    	// synchronized {~} ๋ธ”๋Ÿญ์€ ์ „๋ถ€ ์ž„๊ณ„๊ตฌ์—ญ
        // ์ž„๊ณ„๊ตฌ์—ญ์€ ์ ๊ฒŒ๋งŒ๋“ค์ˆ˜๋ก ์„ฑ๋Šฅ์— ์ข‹๋‹ค. ๋™๊ธฐํ™”๋Š” ๋น„์šฉ์ด ํฐ ์ž‘์—…์ด๋‹ค.
    }
  }
}

# ์ „ํ†ต์ ์ธ ๋™๊ธฐํ™” ๋ฌธ์ œ๋“ค

@1. Producer and Consumer Problem( ์ƒ์‚ฐ์ž-์†Œ๋น„์ž ๋ฌธ์ œ )

๋‹ค๋ฅธ๋ง๋กœ ์œ ํ•œํ•œ ๋ฒ„ํผ ๋ฌธ์ œ(Bounded Buffer Problem)๋ผ๊ณ ๋„ ํ•œ๋‹ค. ์ถœ๊ธˆ๊ณผ ์ž…๊ธˆ, ์ œ์ž‘๊ณผ ์‚ฌ์šฉ์ฒ˜๋Ÿผ ์ƒ์‚ฐ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์‚ฐํ•˜๋ฉด ์†Œ๋น„์ž๊ฐ€ ๊ทธ๊ฒƒ์„ ์†Œ๋น„ํ•˜๋Š” ๊ตฌ์กฐ์—์„œ ์ €์žฅ๊ณต๊ฐ„์ธ buffer๊ฐ€ ๋ฌดํ•œํ•˜์ง€ ์•Š์„ ๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์‰ฝ๊ฒŒ๋งํ•ด [ 10000๊ฐœ ์ƒ์‚ฐ - 10000๊ฐœ ์†Œ๋น„ = 0๊ฐœ ] ๊ฐ€ ๋˜์–ด์•ผํ•˜๋Š”๋ฐ, ์‹ค์ œ ๋™์ž‘์€ ๊ทธ๋ ‡์ง€ ๋ชปํ•œ ๋ฌธ์ œ์ด๋‹ค.

 ์™œ ์ด๋Ÿฐ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ? ๋Œ€ํ‘œ์ ์œผ๋กœ Busy-Wait ๋ฌธ์ œ (์ƒ์‚ฐ์€ ๋ฐ”์œ๋ฐ ์†Œ๋น„์ž๋Š” ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ ค์•ผํ•˜๋Š”)๊ฐ€ ์žˆ๋‹ค.

  • ์ƒ์‚ฐ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ฒ„ํผ์— ์ €์žฅํ•œ๋‹ค.
  • ํ˜„์‹ค ์‹œ์Šคํ…œ์—์„œ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. ์ฆ‰, ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“์ฐจ๋ฉด ๋” ์ด์ƒ ์ƒ์‚ฐํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ƒ์‚ฐ๋ณด๋‹ค ์†Œ๋น„๊ฐ€ ๋„ˆ๋ฌด ๋น ๋ฅด๋ฉด ๋ฒ„ํผ๊ฐ€ ๋น„์–ด๋ฒ„๋ฆฐ๋‹ค. ์†Œ๋น„ํ•˜๋ ค๊ณ  ํ•ด๋„ ๋‚จ์€ ์ž์›์ด ์—†์–ด ๊ณ„์† ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค.
  • ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์˜ ์ ‘๊ทผ์„ ๋™๊ธฐํ™”๋ฅผ ์ œ๋Œ€๋กœ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฒ„ํผ count๊ฐ€ ์Œ์ˆ˜ (-1)๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
  • [๋‚จ์€ ์ž์›์ด ์—†์–ด์„œ ์†Œ๋น„์ž ๊ธฐ๋‹ค๋ฆผ] + [์“ฐ๋ ˆ๋“œ ๋™๊ธฐํ™” ๋•Œ๋ฌธ์— ์ƒ์‚ฐ์ž ์ž์› ์ถ”๊ฐ€์•ˆ๋จ] = ํ”„๋กœ๊ทธ๋žจ ๋ฉˆ์ถค

์ฐธ๊ณ ๋กœ ์ด๋ ‡๊ฒŒ ๊ต์ฐฉ์ƒํƒœ์— ๋น ์ ธ ์˜์›ํžˆ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉˆ์ถ”๋Š”๊ฑธ ๋ฐ๋“œ๋ฝ(Dead-lock)์ด๋ผ๊ณ  ๋งํ•œ๋‹ค.


@2. Reader-Writer Problem

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋™๊ธฐํ™”๋ฅผ ํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ์ด๋‹ค. ๋ฌด์ง€์„ฑ์œผ๋กœ Reader์™€ Writer๋ฅผ ๊ฐ™์ด ๋™๊ธฐํ™”ํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ๋ƒฅ ์ฝ๊ธฐ๋งŒ 100๋ฒˆ ํ•˜๋Š”๋ฐ๋„ 100๋ฒˆ ๋‹ค lock์„ ๊ฑธ์–ด๋ฒ„๋ฆฐ๋‹ค. ์ด๋Š” ์ƒ๋‹นํžˆ ๋น„ํšจ์œจ์ ์ด๊ณ , DB ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ•˜๋ฝ์‹œํ‚จ๋‹ค.


@3. Dining Philosopher Problem (์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž ๋ฌธ์ œ)

์›ํ˜•ํ…Œ์ด๋ธ”์—์„œ, 5๋ช…์ด ๋ฐฅ์„ ๋จน๋Š”๋ฐ ์ “๊ฐ€๋ฝ์ด 4๊ฐœ์ธ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ์ฒ ํ•™์ž๋“ค์€ ๊ต์–‘์ด ์žˆ์–ด์„œ ๋ฉ€๋ฆฌ์žˆ๋Š” ์ “๊ฐ€๋ฝ์„ ๋นผ์•—์•„ ์˜ค์ง€๋Š” ์•Š๊ณ , ์–‘์˜†์— ์žˆ๋Š” ์ “๊ฐ€๋ฝ๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

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


# ์ž๋ฐ”์˜ ๋™๊ธฐํ™” ๋ฌธ์ œ ํ•ด๊ฒฐ์ฑ…

@ 1. ์†Œ๋น„์ž์™€ ์ƒ์‚ฐ์ž

๋ฌธ์ œ : ๋ฒ„ํผ๊ฐ€ ๋น„์—ˆ์„ ๋•Œ ์†Œ๋น„์ž๊ฐ€ ๋ฒ„ํผ lock์„ ๊ฑธ๊ณ  ํ’€์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿผ ์ƒ์‚ฐ์ž๋Š” ๋ฒ„ํผ์— ์ž์›์„ ๋ชป์ฑ„์šด๋‹ค.

ํ•ด๊ฒฐ : ์ž์›์ด ์—†๋‹ค๋ฉด ์†Œ๋น„์ž lock์„ ๊ฑธ์ง€ ๋ง๊ณ  wait()์œผ๋กœ ์žฌ์›Œ๋‘์ž. ์ƒ์‚ฐ์ž๊ฐ€ ์ž์›์„ ์ถ”๊ฐ€ํ•  ๋•Œ notify()๋กœ ์•Œ๋ฆฌ์ž.

 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ, ๋‹จ์ˆœํžˆ ํ์— ๋„ฃ๊ณ  ๋บด๋Š” ๊ฒƒ์ด์ง€ ์™œ ์Šค๋ ˆ๋“œ๊ฐ€ wait๋˜์—ˆ๋Š”์ง€ ์ƒํƒœ๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.

 

์ฆ‰ wait()์ด ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“์ฐจ์„œ ์†Œ๋น„์ž๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•œ๊ฑด์ง€ ์•„๋‹ˆ๋ฉด ์œ„์— ๋ฌธ์ œ์ฒ˜๋Ÿผ ์ƒ์‚ฐ์ž๋ฅผ ๊ธฐ๋‹ค๋ฆด๋ ค๊ณ  wait์„ ํ•œ๊ฑด์ง€ ์•Œ ์ˆ˜ ์—†๊ณ , ์–ด๋Š์‹œ์ ์— notify()๋ฅผ ๊ฑธ์–ด ๋‹ค์‹œ ๋™์ž‘์‹œ์ผœ์•ผ ํ•˜๋Š”์ง€๋„ ์ƒ๋‹นํžˆ ์• ๋งคํ•ด์ง„๋‹ค.

 

=> ๊ทธ๋ž˜์„œ JDK 1.5์—๋Š” ์ƒํƒœ๊ฐ’๋„ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋” ๋‹ค์–‘ํ•œ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋™์‹œ์„ฑ ํŒจํ‚ค์ง€ (java.util.concurrent)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

2021.07.27 - [Backend/Java] - ์“ฐ๋ ˆ๋“œ์˜ ๋™๊ธฐํ™” (synchronization)

 

์“ฐ๋ ˆ๋“œ์˜ ๋™๊ธฐํ™” (synchronization)

์“ฐ๋ ˆ๋“œ์˜ ๋™๊ธฐํ™” : ํ•œ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ง„ํ–‰์ค‘์ธ ์ž‘์—…์„ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ฐ„์„œํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ. ์“ฐ๋ ˆ๋“œ๋Š” class์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜(์ž์›)์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์“ฐ๋ ˆ๋“œ ๋™๊ธฐํ™”๋ฅผ ํ•˜์ง€์•Š์œผ๋ฉด, ์‹ฌ

jiwondev.tistory.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ