¼Ò¼³°°ÀºÀÚ¹Ù2ºÎ  Á¦8Àå Thread.  8.3.4 ¸ÖƼ½º·¹µåÀÇ µ¿±âÈ­  

 

 

8.3.4 ¸ÖƼ½º·¹µåÀÇ µ¿±âÈ­

 µ¿±âÈ­ÀÇ ¹æ¹ýÀº 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¸¦ ÇØÁÖ´Â ¹æ¹ýÀÔ´Ï´Ù.

 

Á¤¸®¸¦ ÇØº¸ÁÒ. µ¥ÀÌÅͰøÀ¯¿¡ ´ëÇÑ ½Å·Ú¼ºÀ» È®º¸Çϱâ À§Çؼ­ µ¥ÀÌÅÍ¿¡ lockÀ» °Å´Â ¹æ¹ýÀ» »ç¿ëÇÕ´Ï´Ù. ±×¸®°í synchronized Ű¿öµå¸¦ ÀÌ¿ëÇØ¼­ °¡»ó¸Ó½ÅÀÇ ¸Þ¸ð¸® Â÷¿ø¿¡¼­ ÇØ°á Çϵµ·Ï Çϰí ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ ¹Ì¼¼ÇÑ ½º·¹µåÀÇ ÇÚµéÀº À̰͸¸À¸·Î´Â ÇØ°áÇÒ ¼ö ¾ø½À´Ï´Ù. ±×·¡¼­ º¸´Ù Á¤¹ÐÇÑ ½º·¹µåÀÇ µ¿±âÈ­ °ü¸®¸¦ À§Çؼ­ wait¿Í notify±â¹ýÀ» ÀÌ¿ëÇÏ´Â °ÍÀÔ´Ï´Ù.

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