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Ű¿öµå¸¦ ºÙÀϸ¸Çϱ¸³ª¶ó°í ¹Û¿¡ ÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ï °ÆÁ¤ÇÏÁö ¾ÊÀ¸¼Åµµ µË´Ï´Ù.
¿ì¼± 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() ¸Þ¼µå°¡ È£ÃâµÉ ¶§±îÁö ±â´Ù¸°´Ù.
°£´ÜÇÑ 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() ¸Þ¼µåÀÇ ¾²ÀÓ¿¡ ´ëÇØ ¾Ë¾Æº¸¾Ò´Ù.
ÀÚ¹Ù¿¡¼ °øÀ¯ ÀÚ¿øÀÇ ¹èºÐ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ synchronized¸¦ »ç¿ëÇÏÁö¸¸ À̰͸¸À¸·Î Á¦¾îÇϱâ Èûµç ¹Ì¼¼ÇÑ ºÎºÐÀÇ ÀÛ¾÷À» ¼öÇàÇϱâ À§ÇÏ¿© wait(), notify(), notifyAll() ¸Þ¼µå¸¦ »ç¿ëÇÏ°Ô µË´Ï´Ù.
wait() ¸Þ¼µå´Â ½º·¹µå°¡ µ¿±âÈµÈ °øÀ¯ÀÚ¿øÀ» ¿äûÇÒ ¶§ ½º·¹µå¸¦ ´ë±â»óÅ·Π¸¸µé ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í, notify()¿Í notifyAll() ¸Þ¼µå´Â ´ë±âÁß¿¡ ÀÖ´Â ½º·¹µå(µé)¿¡°Ô µ¿±âÈµÈ °øÀ¯ÀÚ¿øÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ½º·¹µå¸¦ ½ÇÇà »óÅ·Π¸¸µé¾î ÁÖ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. wait(), notify(), notifyAll() ¸Þ¼µå¸¦ È¿À²ÀûÀ¸·Î ÀÌ¿ëÇÑ´Ù¸é ½º·¹µå Åë½ÅÀ» º¸´Ù ´É·üÀûÀ¸·Î ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
wait(), notify(), notifyAll() ¸Þ¼µå ´Â ObjectŬ·¡½ºÀÇ ¸â¹ö ¸Þ¼µåµéÀ̱⠶§¹®¿¡ ¸ðµç Ŭ·¡½º¿¡¼ ÀÌ ¸Þ¼µå¸¦ »ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸, final keyword·Î ¼±¾ðµÇ¾î ÀÖ¾î¼ »ó¼Ó ¹Þ¾Æ¼ ÀçÁ¤ÀÇÇϰųª ´Ù¸£°Ô º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù. ±×°Íµµ ±×·² °ÍÀÌ ÀÌ·¸°Ô ¸Þ¸ð¸®Â÷¿ø¿¡¼ Á¢±ÙÇÏ´Â ¹Ì¼¼ÇÑ ¸Þ¼µåµéÀ» »ç¿ëÀÚ°¡ Á÷Á¢ º¯°æÇÑ´Ù¸é ¹®Á¦°¡ »ý±æ °ÍÀÔ´Ï´Ù. ÀÌ·¯ÇÑ °ÍÀ» ¸·±â À§Çؼ final Ű¿öµå¸¦ »ç¿ëÇÏ¿´½À´Ï´Ù. À̰ÍÀÌ final keywordÀÇ ¹¦¹ÌÀÌ´Ù. ±×¸®°í ÀÌ·¯ÇÑ ¹Ì¹¦ÇÑ ÀÛ¾÷ÇÏ·Á¸é ¿¡·¯°¡ ¸¹ÀÌ ³ª°ÚÁÒ. ±×·¡¼ wait¸Þ¼µå¸¦ »ç¿ëÇÒ ¶§´Â Ç×»ó ¿¡·¯Ã³¸®¸¦ ÇØ ÁÖ¾î¾ß ÇÕ´Ï´Ù.
ÀÌ ¸Þ¼µåµéÀ» ÀÚ½ÅÀÖ°Ô Á¦¾îÇÒ ¼ö ÀÖ´Ù¸é ´ç½ÅÀº ÀÌ¹Ì °í±Þ ÇÁ·Î±×·¡¸ÓÀÇ ¼öÁØ¿¡ Á¢±ÙÇØ ÀÖ´Â °ÍÀÌ´Ù.
jabookÀúÀÚ¸íÇÔ |
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù2ºÎ ÀúÀÚ:ÃÖ¿µ°ü |