µ¿±âÈÀÇ ¹æ¹ýÀº 2°¡Áö·Î ³ª´©¾îÁý´Ï´Ù. ÀϹÝÀûÀ¸·Î ½Ã½ºÅÛ¿¡ µ¿±âȸ¦ ¹Ì·ç´Â ¹æ¹ý°ú ÇÁ·Î±×·¡¸Ó°¡ Á÷Á¢ µ¿±âȸ¦ Á¦¾îÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÚ¹Ù¿¡¼´Â ÀüÀÚ¸¦ synchronized¶ó°í Ç¥ÇöÇϸç ÈÄÀÚ¸¦ wait¿Í notify·Î ´ëº¯Çϰí ÀÖ½À´Ï´Ù. ÀÌ Àý¿¡¼´Â synchronized¿¡ ´ëÇØ¼ ¾Ë¾Æ º¸°Ú½À´Ï´Ù. ±×¸®°í wait¿Í notify´Â ObjectŬ·¡½º¿¡¼ ¾Ë¾Æ º¸µµ·Ï ÇϰڽÀ´Ï´Ù.
µ¿±âȸ¦ À§ÇÑ ¹æ¹ý
n synchronized
n wait¿Í notify
µ¿±âÈÀÇ Àǹ̺ÎÅÍ Çѹø µÇ»õ°Ü º¸±â·Î ÇÏÁÒ. µ¿±âÈÀÇ ºñÀ¯´Â ´ç¿¬È÷ ÇϳªÀÇ µ¥ÀÌÅ͸¦ ÁÙ¼¼ Â÷·Ê´ë·Î »ç¿ëÇÏ´Â °ÍÀ» ¸»ÇÕ´Ï´Ù. synchronized¸¦ ´ÙÀ½°ú°°ÀÌ ºñÀ¯Çϸé Á» ±×·¸Áö¸¸ À̸¸ÇÑ °Íµµ ¾ø´Â °Í °°½À´Ï´Ù. ¸¸ÀÏ ÈÀå½Ç¿¡ º¯±â°¡ Çϳª ¹Û¿¡ ¾ø´Ù°í ÇÏÁÒ. »ç¿ëÇÏ·Á´Â »ç¶÷Àº 10¸íÀ̶ó°í °¡Á¤ÇÑ´Ù¸é 10¸íÀÌ Â÷·Ê´ë·Î »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ¸¸¾à À̸¦ ¾î±â¸é ³¸®³ªÁÒ. °øÀ¯°¡ ±úÁö´Â °ÍÀÔ´Ï´Ù. ±×·¡¼ º¸Åë ¿ì¸®´Â ¾î¶»°Ô Çմϱî? ¹®À» Àá±×ÁÒ. lockÀ» °Å´Â °Ì´Ï´Ù. ¾ÆÁÖ ½±ÁÒ. º¯±â´Â µ¥ÀÌÅÍ¿¡ ÇØ´çµÇ°í synchronized¸¦ °Å´Â °ÍÀº lock¿¡ ÇØ´çµË´Ï´Ù. ¸¸¾à ÇϳªÀÇ µ¥ÀÌÅ͸¦ ¼·Î°¡ °øÀ¯Çϴµ¥ synchronized¸¦ °É¾îµÎ¸é ÇϳªÀÇ ½º·¹µå¸¸ ÀÌ µ¥ÀÌÅ͸¦ »ç¿ëÇÏ°Ô µË´Ï´Ù. lockÀ» °Å´Â °ÍÀÌÁÒ. µ¥ÀÌÅ͸¦ »ç¿ëÇÏ°í ³ª¸é lockÀ» ÇØÁ¦ ÇÒ °ÍÀÌ°í ±×¸®°í ´ÙÀ½ ½º·¹µå°¡ ÀÌ µ¥ÀÌÅ͸¦ »ç¿ëÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù. synchronized¸¦ °É¾îµÎ¸é °¡»ó¸Ó½Å ÀÚü¿¡¼ ¾Ë¾Æ¼ ó¸®ÇÏ°Ô µË´Ï´Ù. ÀÌ ¹æ¹ý À̿ܿ¡µµ wait¿Í notify±â¹ýÀÌ Àִµ¥ À̰ÍÀº ¾à°£ ´Ù¸¥ ¸éÀÌ ÀÖ½À´Ï´Ù. À̰ÍÀº 10Àå¿¡¼ ³íÀÇÇϱâ·Î ÇÏÁÒ. ÀÚ ±×·¸´Ù¸é ¿¹Á¦¸¦ Çϳª »ìÆìº¸µµ·Ï ÇÒ±î¿ä.
SyncThreadMain.java |
import java.util.*; class SyncStack { private Vector buffer = new Vector(); public synchronized char pop(){ char c; c = ((Character)(buffer.remove(buffer.size()-1))).charValue(); return c; } public void push(char c){ synchronized(this){ Character charObj = new Character(c); buffer.addElement(charObj); } } } class PopThread extends Thread{ private SyncStack ss = null; public PopThread(SyncStack ss){ this.ss = ss; } public void run(){ System.out.println(this.getName() + "Poping:" + ss.pop() + " OK"); } } class PutThread extends Thread{ private char c; private SyncStack ss = null; public PutThread(SyncStack ss, char c){ this.ss = ss; this.c = c; } public void run(){ System.out.println(this.getName() + "Putting Char:" + c); ss.push(c); } } public class SyncThreadMain{ public static void main(String args[]){ System.out.println("Starting SyncTest..."); SyncStack ss= new SyncStack(); for(int i=0; i<10; i++) new PutThread(ss,(char)(i+33)).start(); for(int i=0; i<11; i++) new PopThread(ss).start(); } } |
C:\examples\8. Thread>java SyncThreadMain Starting SyncTest... Putting Char:! Putting Char:" Putting Char:# Putting Char:$ Putting Char:% Putting Char:& Putting Char:' Putting Char:( Putting Char:) Putting Char:* Thread-10Poping:* OK Thread-11Poping:) OK Thread-12Poping:( OK Thread-13Poping:' OK Thread-14Poping:& OK Thread-15Poping:% OK Thread-16Poping:$ OK Thread-17Poping:# OK Thread-18Poping:" OK Thread-19Poping:! OK |
ÀÌ ¿¹Á¦´Â ´Ü¼øÈ÷ synchronized¸¸À» º¸¿© ÁÖ°í ÀÖ½À´Ï´Ù. SyncStackÀ̶ó´Â µ¥ÀÌÅÍ ÀúÀå¼Ò¸¦ ³õ°í Àüü 10°³ÀÇ ½º·¹µå°¡ ¼·Î µ¥ÀÌÅ͸¦ ³ÖÀ¸·Á ÇÑ´Ù°í »ý°¢ÇØ º¸½Ê½Ã¿À. ÇöÀç´Â ´Ü¼øÈ÷ 10°³ÀÇ PutThread ½º·¹µå°¡ µ¥ÀÌÅ͸¦ ³ÖÀ¸·Á°í Çϰí ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ ¼·Î °øÀ¯Çϰí ÀÖ´Â SyncStackÀ̶ó´Â ÀúÀå¼Ò´Â ¿©·¯ °³ÀÇ PutThread¿¡ ÀÇÇØ¼ »ç¿ëµÇ¾îÁú °ÍÀÔ´Ï´Ù. À§ÀÇ ¿¹¿¡¼ putÀ̶ó´Â ¸Þ¼µå¿¡ synchronized¸¦ °É¾î µÎ¾ú±â ¶§¹®¿¡ put¸Þ¼µå³»¿¡ »ç¿ëµÇ¾îÁö´Â °øÀ¯ µ¥ÀÌÆ®µéÀº lockÀ» °É°Ô µÇ´Â °ÍÀÔ´Ï´Ù. ÇϳªÀÇ ½º·¹µåÀ̿ܿ¡´Â »ç¿ë¸øÇÏ´Â °ÍÀÌÁÒ. ÇϳªÀÇ PutThread°¡ SyncStack ss¸¦ »ç¿ëÇϰí ÀÖÀ¸¸é ´Ù¸¥ PutThread´Â ±â´Ù·Á¾ß ÇÏ´Â °ÍÀÌÁö¿ä. ÇöÀç´Â ´Ü¼øÇÑ ÀÛ¾÷À» Çϰí ÀÖÁö¸¸ ½ÇÁ¦ ÇÁ·Î±×·¥¿¡¼´Â ÀÌ·¸°Ô ´Ü¼øÇÏÁö ¸¸Àº ¾Ê½À´Ï´Ù. 2°³ ¶Ç´Â ´õ ÀÌ»óÀÇ PutThread°¡ µ¿½Ã¿¡ SyncStack ss¸¦ »ç¿ëÇÏ·Á°í ÇÒ ¶§ synchronized¸¦ °É¾î µÎÁö ¾ÊÀ¸¸é °øÀ¯ÀÇ ¹ýÄ¢Àº ±ú¾îÁö°í DeadLockÇö»óÀÌ ¹ß»ýÇÒÁöµµ ¸ð¸¨´Ï´Ù. ÇÁ·Î±×·¥ÀÌ °©Àڱ⠼¹ö¸®´Â °ÍÀÌÁö¿ä. À§ÀÇ ¿¹¿¡¼ ¿ì¸®´Â synchronized¸¦ »ç¿ëÇÏ´Â 2°¡Áö ¹æ¹ýÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.
public synchronized char pop(){ char c; c = ((Character)(buffer.remove(buffer.size()-1))).charValue(); return c; } public void push(char c){ synchronized(this){ Character charObj = new Character(c); buffer.addElement(charObj); } } |
pop¸Þ¼µå¿¡¼ »ç¿ëÇÏ´Â ¹æ¹ýÀº pop¸Þ¼µå¿¡¼ »ç¿ëÇÏ´Â ¸ðµç °øÀ¯µ¥ÀÌÅÍ¿¡ ÇϳªÀÇ ½º·¹µå°¡ ÀÌ ¸Þ¼µå¸¦ »ç¿ëÇϸé lockÀ» °É°Ú´Ù´Â °ÍÀÔ´Ï´Ù. ±×¸®°í push¿¡¼ »ç¿ëÇÏ´Â synchronized(this)ºí·ÏÀº ÇöÀçÀÇ ºí·Ï ¾È¿¡ ÀÖ´Â °øÀ¯ µ¥ÀÌÅ͸¸À» lockÀ» °É°Ú´Ù´Â °ÍÀÔ´Ï´Ù. ¿Ö ÀÌ·¸°Ô Çϳİí¿ä. ´ç¿¬È÷ ¸Þ¼µåÀÇ ±æÀ̰¡ ª´Ù¸é º° ¹®Á¦°¡ ¾ø°ÚÁö¸¸ ±æ´Ù¸é ±»ÀÌ ÇÊ¿ä ¾ø´Â ºÎºÐ±îÁö synchronized¸¦ ÇØ ÁÙ ÇÊ¿ä´Â ¾øÁö ¾Ê½À´Ï±î! ±×·¡¼ ÇÊ¿äÇÑ ºÎºÐ¿¡¸¸ synchronized¸¦ °É¾î¼ °øÀ¯ µ¥ÀÌÅ͸¦ lockÇÏ´Â °ÍÀÔ´Ï´Ù. ½±°Ô ¸»ÇÏÀÚ¸é ¸Þ¼µå Àüü¿¡ lockÀ» °É°í ½ÍÀ¸¸é ¸Þ¼µå ¾Õ¿¡ synchronized¸¦ »ç¿ëÇÏ°í ºÎºÐÀûÀ¸·Î lockÀ» °É°í ½ÍÀ¸¸é synchronizedºí·ÏÀ» »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù.
ÀÌ·¯ÇÑ ¹æ¹ýÀ¸·Î µ¥ÀÌÅÍÀÇ µ¿±âȸ¦ ½Ã½ºÅÛ¿¡ ¸Ã±â¸é ¸ðµç ¹®Á¦µéÀÌ ÀüºÎ ÇØ°á µÉ ¼ö ÀÖÀ»±î¿ä? ¸¸¾à À§ÀÇ ¿¹Á¦¿¡¼ µ¥ÀÌÅͰ¡ ¾ø´Âµ¥ pop¸Þ¼µå¸¦ È£ÃâÇß´Ù°í »ý°¢ÇØ º¸½Ê½Ã¿À. ±×·¸´Ù¸é, ´ç¿¬È÷ ¿¡·¯°¡ ¹ß»ýÇÒ °ÍÀÔ´Ï´Ù. µ¥ÀÌÅͰ¡ ¾ø´Âµ¥ popÇÏ·Á°í ÇßÀ¸´Ï, µ¥ÀÌÅͰ¡ ¾ø´Ù¸é µé¾î¿Ã ¶§±îÁö ±â´Ù¸®µµ·Ï ÇÒ ¼ö´Â ¾øÀ»±î¿ä? ÀÌ·¯ÇÑ ½º·¹µåÀÇ Á¦¾î¸¦ wait¿Í notify¸¦ »ç¿ëÇØ¼ ÇØ°áÇÕ´Ï´Ù. ÀÌ ÇØ°áÃ¥ÀÇ ÀÚ¼¼ÇÑ »çÇ×Àº 10Àå¿¡¼ ´Ù·çµµ·Ï ÇϰڽÀ´Ï´Ù. ¿©±â¼ °£´ÜÈ÷ ¼³¸íÇÏÀÚ¸é popÀÌ µ¥ÀÌÅͰ¡ ¾øÀ» ¶§ È£Ã⠵ȴٸé ÇöÀçÀÇ ½º·¹µå¸¦ wait½ÃÄÑ ¹ö¸®´Â °ÍÀÌÁö¿ä. ±×¸®°í ¸¸¾à µ¥ÀÌÅͰ¡ µé¾î¿Â´Ù¸é ÀÌ °øÀ¯ µ¥ÀÌÅ͸¦ »ç¿ëÇÏ·Á´Â ½º·¹µåµé¿¡°Ô notify¸¦ ÇØÁÖ´Â ¹æ¹ýÀÔ´Ï´Ù.
jabookÀúÀÚ¸íÇÔ |
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù2ºÎ ÀúÀÚ:ÃÖ¿µ°ü |