¼Ò¼³°°ÀºÀÚ¹Ù2ºÎ  Á¦10Àå ObjectŬ·¡½º  10.6 wait notify¸Þ¼­µå  

 

10.6 wait(), notifiy(), notifyAll()

 

10.6.1 wait(), notify(), notifyAll()¿øÇü

Thread¿¡¼­ ¸ø´ÙÇÑ ¸»µéÀ» ÀÌ Àý¿¡¼­ ÇÏ°Ô µÇ´Â±º¿ä. Thread¿¡ ´ëÇØ ¾î´ÀÁ¤µµ ¾Ë°í³ª¸é ¹Ýµå½Ã ¸¸³ª´Â ¾à¹æÀÇ °¨Ãʰ¡ ¹Ù·Î wait¿Í notify¶õ ³ðÀÔ´Ï´Ù. ObjectŬ·¡½ºÀÇ ¸â¹ö¸Þ¼­µå°¡ ÀüºÎ±×·¯ÇϵíÀÌ ÀÌ ¸Þ¼­µåµé ¶ÇÇÑ ¸Þ¸ð¸®¿Í Á÷Á¢ÀûÀÎ °ü·ÃÀÌ ÀÖÀ¸¸ç µ¥ÀÌÅÍÀÇ µ¿±âÈ­¿Í ¸¹Àº °ü·ÃÀÌ ÀÖ½À´Ï´Ù.

 

 ¸Þ¼­µåÀÇ ¿øÇüºÎÅÍ Çѹø º¸°í ³Ñ¾î°¡µµ·Ï ÇÏÁÒ.

n        public final void wait(long timeout) throws interruptedException

n        public final void wait(long timeout, int nanos) throws interruptedException

n        public final void wait() throws interruptedException

n        public final void notifyAll()

n        public final void notify()

 

¹¹ º°´Ù¸¥ °ÍÀº ¾ø½À´Ï´Ù. ´ÜÁö finalÀ̶ó´Â Ű¿öµå¿Í wait¿¡´Â ExcepitonÀÌ ÀüºÎ ºÙ¾î ÀÖ´Ù´Â °Í ¹Û¿¡´Â ÀÏ¹Ý ¸Þ¼­µåµé°ú Â÷À̳ª´Â °ÍÀº ¾ø½À´Ï´Ù. ÀÌ ÀåÀ» ÀüºÎ ´Ù ÀÐ°í ³ª¸é Exception󸮸¦ ÇØÁÙ¸¸Çϱ¸³ª ±×¸®°í finalŰ¿öµå¸¦ ºÙÀϸ¸Çϱ¸³ª¶ó°í ¹Û¿¡ ÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ï °ÆÁ¤ÇÏÁö ¾ÊÀ¸¼Åµµ µË´Ï´Ù.

 

 

10.6.2 wait(), notify(), notofyAll()ÀÇ ÀǹÌ

¿ì¼± wait´Â ±â´Ù¸®¶ó´Â ¶æÀ̸ç notify¿Í notifyAllÀº ¾Ë¸°´Ù´Â ÀǹÌÀÔ´Ï´Ù. ±×·¸´Ù¸é ¿©·¯ºÐµéÀº ´ÙÀ½°ú °°Àº Áú¹®À» ÇÒ °ÍÀÔ´Ï´Ù.

 

n        ´©±¸¿¡°Ô ¹«¾ùÀ» ±â´Ù¸®¶ó°í ÇÏ´Â °ÍÀϱî¿ä?

n        ´©±¸¿¡°Ô ¾Ë·Á ÁÖ¸ç ¹» ¾Ë·ÁÁÙ±î¿ä?

 

 ±ØÈ÷ ´ç¿¬ÇÑ Áú¹®ÀÔ´Ï´Ù. À̰ÍÀº ½º·¹µå°¡ µ¿±âÈ­µÈ °øÀ¯ÀÚ¿ø¿¡ Á¢±ÙÇÒ ¶§ µ¿±âÈ­µÈ °øÀ¯ÀÚ¿øÀ» ´Ù¸¥ ½º·¹µå°¡ »ç¿ëÇϰí ÀÖ´Ù¸é ±â´Ù¸®¶ó°í ÇÒ ¶§ »ç¿ëÇÕ´Ï´Ù. µ¿±âÈ­µÈ °øÀ¯ÀÚ¿øÀ» ´Ù »ç¿ëÇÏ°í ³ª¸é Ȥ½Ã ÀÌ ÀÚ¿øÀ» waitÇϰí ÀÖ´Â ½º·¹µå°¡ ÀÖÀ» ¶§ »ç¿ëÇ϶ó°í ¾Ë·ÁÁÖ´Â °ÍÀÔ´Ï´Ù. µ¿±âÈ­µÈ °øÀ¯ÀÚ¿øÀÌ ±Ã±ÝÇϽøé ThreadÀåÀ» ÂüÁ¶ÇϽðí ÀÌ ÀýÀ» º¸½Ã±â ¹Ù¶ø´Ï´Ù. ½º·¹µåÀÇ ±âÃÊ °³³ä¾øÀÌ wait¿Í notify¸¦ ³íÇÑ´Ù´Â °ÍÀº Á» ¹«¸®°¡ µË´Ï´Ù.

 

À§ÀÇ ³»¿ëÀ» Çѹø Á¤¸®¸¦ ÇØ º¸°Ú½À´Ï´Ù.

n        ÇϳªÀÇ °øÀ¯ÀÚ¿ø¿¡ ¿©·¯ °³ÀÇ ½º·¹µå°¡ Á¢±ÙÇßÀ» ¶§¿¡´Â ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.

n        ÀÌ·¸°Ô ½º·¹µåµéÀÌ ¸ô¸®´Â Çö»óÀ» º´¸ñÇö»ó(Bottle Neck)À̶ó°í ÇÑ´Ù.

n        À̶§ ¹®Á¦°¡ »ý±â¸é Dead Lock¿¡ °É¸®°Ô µÈ´Ù.

n        ±×¶§ synchronized¸¦ »ç¿ëÇÏ¿© ¸¸ÀÏ ÇÑ ½º·¹µå°¡ °øÀ¯ÀÚ¿øÀ» »ç¿ëÇϰí ÀÖÀ¸¸é, ±× ÀÚ¿øÀ» ¿­¼è·Î Àá±Å ´Ù¸¥ ½º·¹µåµéÀÌ ±× ÀÚ¿ø¿¡ Á¢±ÙÇÏ´Â °ÍÀ» ÅëÁ¦ÇÏ°Ô µÈ´Ù.

n        À̰͸¸À¸·Î´Â ¿Ïº®ÇÑ µ¿±âÈ­°¡ Á¦¾î ºÒ°¡´ÉÇϱ⿡ ÀÌ ¸Þ¼­µåµéÀ» »ç¿ë¿© Á»´õ ¹Ì¼¼ÇÑ Á¦¾î¸¦ ¼öÇàÇÏ°Ô ÇÑ´Ù.

n        ¸¸ÀÏ, °øÀ¯ µ¥ÀÌÅÍ¿¡ LockÀÌ °É·Á ÀÖ´Â »óÅ¿¡¼­ ´Ù¸¥ ½º·¹µå°¡ Á¢±ÙÇÏ¿© »ç¿ë ¿äûÀ» ÇÏ´Â °æ¿ì¿¡´Â ³ªÁß¿¡ Á¢±ÙÇÑ ½º·¹µå¸¦ ´ë±â »óÅ·Πº¸³»¾ß ÇÑ´Ù.

n        À̶§ ´ë±â ¸í·ÉÀ¸·Î »ç¿ëÇÏ´Â ¸Þ¼­µå°¡ ¹Ù·Î wait() ¸Þ¼­µåÀÌ´Ù.

n        ÇϳªÀÇ ½º·¹µå°¡ °øÀ¯ÀÚ¿øÀ» »ç¿ëÇÏ°í ´ë±â »óÅ¿¡ µé¾î°¬´ø ´Ù¸¥ ½º·¹µå¿¡°Ô ¾Ë·ÁÁִµ¥ notify()¿Í notifyAll()¸Þ¼­µå¸¦ »ç¿ëÇØ¼­ »óÅÂÀÇ º¯È­¸¦ ¾Ë¸®°Ô µÇ´Â °ÍÀÌ´Ù.

n        wait() ¸Þ¼­µå´Â Ç×»ó µ¿±âÈ­ Äڵ峻¿¡¼­¸¸ »ç¿ëÇÑ´Ù.

 

 

ƯÁ¤ ½º·¹µå°¡ ´ë±â»óÅ¿¡¼­ ´Ù½Ã ½ÇÇà»óŰ¡ µÇ´Â °æ¿ì´Â ´ÙÀ½ÀÇ °æ¿ìÀÔ´Ï´Ù.

n        notify() ¸Å¼­µå°¡ È£ÃâµÉ  ¶§

n        notifyAll() ¸Þ¼­µå°¡ È£ÃâµÉ ¶§

n        wait¸Þ¼­µåÀÇ ÁöÁ¤µÈ ½Ã°£ÀÌ Á¾·áµÈ ¶§(À̶§ÀÇ timeout Àº millisecondÀÌ´Ù.

n        ¸¸¾à¿¡ timeoutÀÌ 0ÀÌ¸é ½Ã°£¿¡ °ü°è¾øÀÌ nofity()³ª notifyAll() ¸Þ¼­µå°¡ È£ÃâµÉ ¶§±îÁö ±â´Ù¸°´Ù.

 

10.6.3. °£´ÜÇÑ wait()¿Í notify() ¸Þ¼­µå°¡ ¾²ÀÎ ¿¹Á¦·Î ±¸ÇöÇϱâ

 °£´ÜÇÑ wait¿Í notifyÀÇ ¿¹Á¦¸¦ ¾Ë¾Æ º¸µµ·Ï ÇÏÁÒ. ÀÌ ¿¹Á¦´Â SyncStackÀ̶ó´Â ½ºÅÃÀ» ¸¸µé¾î µÎ°í ÀÌ ½ºÅÿ¡ ÇϳªÀÇ ¹®ÀÚ¸¦ pushÇÏ´Â ½º·¹µå¿Í ±×¸®°í ÇϳªÀÇ ¹®ÀÚ¸¦ ÃßÃâÇÏ´Â ½º·¹µå·Î ³ª´©¾î »ý°¢ÇØ º¼ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à SyncStack¿¡ 5°³ÀÇ ¹®ÀÚ¸¦ Áý¾î ³Ö°í ±×¸®°í SyncStack¿¡ 6°³ÀÇ ¹®ÀÚ¸¦ »Ì´Â´Ù¸é 5°³ÀÇ push½º·¹µå°¡ µ¿ÀÛÇÒ °ÍÀ̰í 6°³ÀÇ pop½º·¹µå°¡ µ¿ÀÛÇÏ°Ô µË´Ï´Ù. ¹®Á¦´Â »ðÀÔÇÑ °ÍÀº 5°³Àε¥ ÃßÃâÀº 6°³¶ó´Â °ÍÀÔ´Ï´Ù. ±×·¸´Ù¸é ¸¶Áö¸· pop½º·¹µå´Â wait»óŰ¡ µË´Ï´Ù. ±×¸®°í ÀÓÀÇÀÇ ½ÃÁ¡¿¡ ¹®ÀÚ°¡ »ðÀԵǰí notifyÇØÁÖ¸é wait¿¡¼­ ±ú¾î³ª¼­ ´Ù½Ã popÀÛ¾÷À» ÇÏ°Ô µË´Ï´Ù.

 

SyncStack.java (wait()¿Í notify() ¸Þ¼­µåÀÇ °£´ÜÇÑ ¿¹Á¦)

import java.util.*;

class SyncStack{

             private Vector buffer = new Vector();

             public synchronized char pop(){

                           char c;

                           while(buffer.size()==0){

                                        try{

                                                     System.out.println("stack´ë±â:");

                                                     this.wait();

                                        }catch(Exception e){}

                           }

                           Character cr = ((Character)buffer.remove(buffer.size()-1));

                           c = cr.charValue();

                           System.out.println("stack»èÁ¦:" + c);

                           return c;

             }

             public synchronized void push(char c){

                           this.notify();

                           Character charObj = new Character(c);

                           buffer.addElement(charObj);

                           System.out.println("stack»ðÀÔ:" + c);

             }

}

class PopRunnable extends Thread{

             public void run(){

                           SyncTest.ss.pop();                          

             }

}

class PushRunnable extends Thread{

             private char c;

             public PushRunnable(char c){

                           this.c =c ;

             }

             public void run(){

                           SyncTest.ss.push(c);

             }

}

public class SyncTest

{

             public static SyncStack ss =new SyncStack();

             public static void main(String[] args){

                          

                           //SyncStack¿¡ 5µ¥ÀÌÅÍ»ðÀÔ

                           new PushRunnable('J').start();

                           new PushRunnable('A').start();

                           new PushRunnable('B').start();

                           new PushRunnable('O').start();

                           new PushRunnable('O').start();

 

                           new PopRunnable().start();//O

                           new PopRunnable().start();//O

                           new PopRunnable().start();//B

                           new PopRunnable().start();//A

                           new PopRunnable().start();//J

                           new PopRunnable().start();//´ë±â»óÅÂ

 

                           try{

                                        Thread.sleep(5000);

                           }catch(Exception e){}

                           System.out.println("===== passed 5 seconds======");

                           new PushRunnable('K').start();

             }

}

C:\JavaExample\10>javac SyncTest.java

C:\JavaExample\10>java SyncTest

stack»ðÀÔ:J

stack»ðÀÔ:A

stack»ðÀÔ:B

stack»ðÀÔ:O

stack»ðÀÔ:O

stack»èÁ¦:O

stack»èÁ¦:O

stack»èÁ¦:B

stack»èÁ¦:A

stack»èÁ¦:J

stack´ë±â:

===== passed 5 seconds======

stack»ðÀÔ:K

stack»èÁ¦:K

 

À§ÀÇ ¿¹Á¦·Î ´ë·«ÀÇ wait()¿Í notify() ¸Þ¼­µåÀÇ ¾²ÀÓ¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Ù.

 

 

10.6.4. °á·Ð

ÀÚ¹Ù¿¡¼­ °øÀ¯ ÀÚ¿øÀÇ ¹èºÐ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ synchronized¸¦ »ç¿ëÇÏÁö¸¸ À̰͸¸À¸·Î Á¦¾îÇϱâ Èûµç ¹Ì¼¼ÇÑ ºÎºÐÀÇ ÀÛ¾÷À» ¼öÇàÇϱâ À§ÇÏ¿© wait(), notify(), notifyAll() ¸Þ¼­µå¸¦ »ç¿ëÇÏ°Ô µË´Ï´Ù.

wait() ¸Þ¼­µå´Â ½º·¹µå°¡ µ¿±âÈ­µÈ °øÀ¯ÀÚ¿øÀ» ¿äûÇÒ ¶§ ½º·¹µå¸¦ ´ë±â»óÅ·Π¸¸µé ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í, notify()¿Í notifyAll() ¸Þ¼­µå´Â ´ë±âÁß¿¡ ÀÖ´Â ½º·¹µå(µé)¿¡°Ô µ¿±âÈ­µÈ °øÀ¯ÀÚ¿øÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ½º·¹µå¸¦ ½ÇÇà »óÅ·Π¸¸µé¾î ÁÖ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. wait(), notify(), notifyAll() ¸Þ¼­µå¸¦ È¿À²ÀûÀ¸·Î ÀÌ¿ëÇÑ´Ù¸é ½º·¹µå Åë½ÅÀ» º¸´Ù ´É·üÀûÀ¸·Î ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

wait(), notify(), notifyAll() ¸Þ¼­µå ´Â ObjectŬ·¡½ºÀÇ ¸â¹ö ¸Þ¼­µåµéÀ̱⠶§¹®¿¡ ¸ðµç Ŭ·¡½º¿¡¼­ ÀÌ ¸Þ¼­µå¸¦ »ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸, final keyword·Î ¼±¾ðµÇ¾î À־ »ó¼Ó ¹Þ¾Æ¼­ ÀçÁ¤ÀÇÇϰųª ´Ù¸£°Ô º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù. ±×°Íµµ ±×·² °ÍÀÌ ÀÌ·¸°Ô ¸Þ¸ð¸®Â÷¿ø¿¡¼­ Á¢±ÙÇÏ´Â ¹Ì¼¼ÇÑ ¸Þ¼­µåµéÀ» »ç¿ëÀÚ°¡ Á÷Á¢ º¯°æÇÑ´Ù¸é ¹®Á¦°¡ »ý±æ °ÍÀÔ´Ï´Ù. ÀÌ·¯ÇÑ °ÍÀ» ¸·±â À§Çؼ­ final Ű¿öµå¸¦ »ç¿ëÇÏ¿´½À´Ï´Ù. À̰ÍÀÌ final keywordÀÇ ¹¦¹ÌÀÌ´Ù. ±×¸®°í ÀÌ·¯ÇÑ ¹Ì¹¦ÇÑ ÀÛ¾÷ÇÏ·Á¸é ¿¡·¯°¡ ¸¹ÀÌ ³ª°ÚÁÒ. ±×·¡¼­ wait¸Þ¼­µå¸¦ »ç¿ëÇÒ ¶§´Â Ç×»ó ¿¡·¯Ã³¸®¸¦ ÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù.

ÀÌ ¸Þ¼­µåµéÀ» ÀÚ½ÅÀÖ°Ô Á¦¾îÇÒ ¼ö ÀÖ´Ù¸é ´ç½ÅÀº ÀÌ¹Ì °í±Þ ÇÁ·Î±×·¡¸ÓÀÇ ¼öÁØ¿¡ Á¢±ÙÇØ ÀÖ´Â °ÍÀÌ´Ù.



jabookÀúÀÚ¸íÇÔ
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù2ºÎ
ÀúÀÚ:ÃÖ¿µ°ü