½ºÄÉÁÙ¸µ ±ÔÄ¢

ÀÛ¾÷ ½ºÄÉÁÙ¸µ ±ÔÄ¢Àº ÀÛ¾÷ÀÌ ´Ù¸¥ ÀÛ¾÷°ú °ü·ÃÇÏ¿© ½ÇÇàµÇ´Â ½Ã±â¸¦ Á¦¾îÇÏ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ½ºÄÉÁÙ¸µ ±ÔÄ¢À» »ç¿ëÇÏ¸é µ¿½Ã¼ºÀÇ °á°ú°¡ ÀϰüµÇÁö ¾ÊÀ» ¼ö ÀÖ´Â »óȲ¿¡¼­ ´ÙÁß ÀÛ¾÷ÀÌ µ¿½Ã¿¡ ½ÇÇàµÇÁö ¾Ê°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ ÀÌ ±ÔÄ¢À» »ç¿ëÇϸé ÀÏ·ÃÀÇ ÀÛ¾÷¿¡ ´ëÇÑ ½ÇÇà ¼ø¼­¸¦ º¸ÀåÇÒ ¼ö ÀÖ½À´Ï´Ù. ½ºÄÉÁÙ¸µ ±ÔÄ¢ÀÇ ¿ëµµ´Â ¿¹Á¦¸¦ ÅëÇØ °¡Àå Àß ¼³¸íµË´Ï´Ù. ´ÙÀ½°ú °°ÀÌ Ç¥½ÃµîÀÇ ½ºÀ§Ä¡¸¦ ÄÑ°í ²ô´Â µ¥ »ç¿ëµÇ´Â µÎ °¡Áö ÀÛ¾÷À» Á¤ÀÇÇÏ¿© ¼³¸íÀ» ½ÃÀÛÇÕ´Ï´Ù.

   public class LightSwitch {
      private boolean isOn = false;
      public boolean isOn() {
         return isOn;
      }
      public void on() {
         new LightOn().schedule();
      }
      public void off() {
         new LightOff().schedule();
      }
      class LightOn extends Job {
         public LightOn() {
            super("Turning on the light");
         }
         public IStatus run(IProgressMonitor monitor) {
            System.out.println("Turning the light on");
            isOn = true;
            return Status.OK_STATUS;
         }
      }
      class LightOff extends Job {
         public LightOff() {
            super("Turning off the light");
         }
         public IStatus run(IProgressMonitor monitor) {
            System.out.println("Turning the light off");
            isOn = false;
            return Status.OK_STATUS;
         }
      }
   }
ÀÌÁ¦ Ç¥½Ãµî ½ºÀ§Ä¡¸¦ ÀÛ¼ºÇÏ¿© À̸¦ ÄÑ°í ²ô´Â ´Ü¼øÇÑ ÇÁ·Î±×·¥À» ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù.
   LightSwitch light = new LightSwitch();
   light.on();
   light.off();
   System.out.println("The light is on? " + switch.isOn());
ÀÌ ÀÛÀº ÇÁ·Î±×·¥À» ÃæºÐÇÑ È½¼ö¸¸Å­ ½ÇÇàÇÒ °æ¿ì ÃÖÁ¾ÀûÀ¸·Î´Â ´ÙÀ½°ú °°Àº Ãâ·ÂÀ» ¾ò°Ô µË´Ï´Ù.
   Turning the light off
   Turning the light on
   The light is on? true
¾î¶»°Ô ÀÌ¿Í °°Àº Ãâ·ÂÀ» ¾òÀ» ¼ö ÀÖ½À´Ï±î? Ç¥½ÃµîÀÌ ÄÑÁø ÈÄ ²¨Áöµµ·Ï ÇßÀ¸¹Ç·Î, ¸¶Áö¸· »óÅ´ ²¨Áø »óÅÂÀ̾î¾ß ÇÕ´Ï´Ù! ¹®Á¦´Â ¾Æ¹« Á¶Ä¡µµ LightOff ÀÛ¾÷ÀÌ LightOn°ú µ¿½Ã¿¡ ½ÇÇàµÇÁö ¸øÇϵµ·Ï ¸·À» ¼ö ¾ø´Ù´Â °ÍÀÔ´Ï´Ù. µû¶ó¼­ "Äѱâ" ÀÛ¾÷ÀÌ ¸ÕÀú ½ºÄÉÁٵǾú´õ¶óµµ µ¿½Ã ½ÇÇàÀ̶õ µÎ °¡Áö µ¿½Ã ÀÛ¾÷¿¡ ´ëÇÑ Á¤È®ÇÑ ½ÇÇà ¼ø¼­¸¦ ¿¹ÃøÇÒ ¹æ¹ýÀÌ ¾øÀ½À» ÀǹÌÇÕ´Ï´Ù. LightOn ÀÛ¾÷ Àü¿¡ LightOff ÀÛ¾÷ÀÌ ½ÇÇàÀ» Á¾·áÇÒ °æ¿ì ÀÌ¿Í °°ÀÌ À¯È¿ÇÏÁö ¾ÊÀº °á°ú¸¦ ¾ò°Ô µË´Ï´Ù. ÇÊ¿äÇÑ °ÍÀº µÎ °¡Áö ÀÛ¾÷ÀÌ µ¿½Ã¿¡ ½ÇÇàµÇÁö ¾Êµµ·Ï ÇÏ´Â ¹æ¹ýÀ̸ç, À̰ÍÀÌ ½ºÄÉÁÙ¸µ ±ÔÄ¢ÀÌ ¾îµð¿¡¼­ ¿À´ÂÁö¿¡ ´ëÇÑ ÀÌÀ¯ÀÔ´Ï´Ù.

mutex(2Áø ¼¼¸¶Æ÷¾î¶ó°íµµ ÇÔ) ¿ªÇÒÀ» ÇÏ´Â ´Ü¼ø ½ºÄÉÁÙ¸µ ±ÔÄ¢À» ÀÛ¼ºÇÏ¿© ÀÌ ¿¹Á¦¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.

   class Mutex implements ISchedulingRule {
      public boolean isConflicting(ISchedulingRule rule) {
         return rule == this;
      }
      public boolean contains(ISchedulingRule rule) {
         return rule == this;
      }
   }
±×·± ´ÙÀ½ ÀÌ ±ÔÄ¢Àº ÀÌÀü ¿¹Á¦ÀÇ µÎ °¡Áö Ç¥½Ãµî ½ºÀ§Ä¡ ÀÛ¾÷¿¡ Ãß°¡µË´Ï´Ù.
   public class LightSwitch {
      final MutextRule rule = new MutexRule();
      ...
      class LightOn extends Job {
         public LightOn() {
            super("Turning on the light");
            setRule(rule);
         }
         ...
      }
      class LightOff extends Job {
         public LightOff() {
            super("Turning off the light");
            setRule(rule);
         }
         ...
      }
   }

ÀÌÁ¦ µÎ °¡Áö Ç¥½Ãµî ½ºÀ§Ä¡ ÀÛ¾÷ÀÌ ½ºÄÉÁٵǸé ÀÛ¾÷ ÇϺα¸Á¶´Â isConflicting ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© µÎ ÀÛ¾÷¿¡ ´ëÇÑ ½ºÄÉÁÙ¸µ ±ÔÄ¢À» ºñ±³ÇÕ´Ï´Ù. ±×·± ÈÄ µÎ ÀÛ¾÷¿¡ Ãæµ¹ÇÏ´Â ½ºÄÉÁÙ¸µ ±ÔÄ¢ÀÌ ÀÖÀ½À» ¹ß°ßÇÏ°Ô µÇ°í µÎ ÀÛ¾÷ÀÌ ¿Ã¹Ù¸¥ ¼ø¼­·Î ½ÇÇàµÇµµ·Ï ÇÕ´Ï´Ù. µÎ ÀÛ¾÷ÀÌ Àý´ë·Î µ¿½Ã¿¡ ½ÇÇàµÇÁö ¾Êµµ·Ï Çϱ⵵ ÇÕ´Ï´Ù. ÀÌÁ¦ ¿¹Á¦ ÇÁ·Î±×·¥À» ¹«¼öÈ÷ ½ÇÇàÇÒ °æ¿ì Ç×»ó µ¿ÀÏÇÑ °á°ú¸¦ ¾ò°Ô µË´Ï´Ù.

   Turning the light on
   Turning the light off
   The light is on? false

¶ÇÇÑ ±ÔÄ¢Àº ÀÏ¹Ý Àá±Ý ¸ÞÄ¿´ÏÁòÀ¸·Î ÀÛ¾÷°ú »ó°ü ¾øÀÌ »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ´ÙÀ½ ¿¹Á¦´Â try/finally ºí·Ï ³»¿¡¼­ ±ÔÄ¢À» È®º¸ÇϹǷÎ, ±âŸ ½º·¹µå ¹× ÀÛ¾÷ÀÌ beginRule°ú endRuleÀÇ È£Ãâ °£ Áö¼Ó±â°£ µ¿¾È ÇØ´ç ±ÔÄ¢À» »ç¿ëÇÏ¿© ½ÇÇàµÇÁö ¸øÇϵµ·Ï ÇÕ´Ï´Ù.

   IJobManager manager = Platform.getJobManager();
         try {
      manager.beginRule(rule, monitor);
      ... do some work ...
        } finally {
      manager.endRule(rule);
   }
ÇØ´ç ÄÚµù ÆÐÅÏÀ» »ç¿ëÇÏ¿© ½ºÄÉÁÙ¸µ ±ÔÄ¢À» È®º¸Çϰí ÇØÁ¦ÇÒ ¶§ Ưº°ÇÑ ÁÖÀǸ¦ ±â¿ï¿©¾ß ÇÕ´Ï´Ù. beginRuleÀ» È£ÃâÇÑ ±ÔÄ¢À» Á¾·áÇÏ´Â µ¥ ½ÇÆÐÇÒ °æ¿ì ÇØ´ç ±ÔÄ¢À» ¿µ¿øÈ÷ Àá±×°Ô µË´Ï´Ù.

°íÀ¯ ±ÔÄ¢ ÀÛ¼º

ÀÛ¾÷ API°¡ ½ºÄÉÁÙ¸µ ±ÔÄ¢¿¡ ´ëÇÑ °è¾àÀ» Á¤ÀÇÇÏ´õ¶óµµ ½ÇÁ¦·Î´Â ½ºÄÉÁÙ¸µ ±ÔÄ¢ ±¸ÇöÀ» Á¦°øÇÏÁö ¾Ê½À´Ï´Ù. ÀÏ¹Ý ÇϺα¸Á¶¿¡´Â ¾î¶² ÀÛ¾÷ ¼¼Æ®¸¦ µ¿½Ã¿¡ ½ÇÇàÇØµµ ±¦ÂúÀºÁö¸¦ ¾Æ´Â ¹æ¹ýÀÌ ¾ø½À´Ï´Ù. ±âº»°ªÀ¸·Î ÀÛ¾÷¿¡´Â ½ºÄÉÁÙ¸µ ±ÔÄ¢ÀÌ ¾øÀ¸¹Ç·Î, ½ºÄÉÁÙµÈ ÀÛ¾÷Àº ½º·¹µå°¡ ÀÌ ÀÛ¾÷À» ½ÇÇàÇϵµ·Ï ÀÛ¼ºµÇ´Â Áï½Ã ½ÇÇàµË´Ï´Ù.

ÀÛ¾÷¿¡ ½ºÄÉÁÙ¸µ ±ÔÄ¢ÀÌ ÀÖÀ¸¸é isConflicting ¸Þ¼Òµå´Â ±ÔÄ¢ÀÌ ÇöÀç ½ÇÇà ÁßÀÎ ÀÛ¾÷ÀÇ ±ÔÄ¢°ú Ãæµ¹ÇÏ´ÂÁö ¿©ºÎ¸¦ ÆÇº°ÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. µû¶ó¼­ isConflicting ±¸ÇöÀº ÀÛ¾÷ ½ÇÇàÀÌ ¾ÈÀüÇÑ ½Ã±â¸¦ Á¤È®È÷ Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù. Ç¥½Ãµî ½ºÀ§Ä¡ ¿¹Á¦¿¡¼­ isConflicting ±¸ÇöÀº ´Ü¼øÈ÷ Á¦°øµÈ ±ÔÄ¢°úÀÇ ID ºñ±³¸¦ »ç¿ëÇÕ´Ï´Ù. ´Ù¸¥ ÀÛ¾÷¿¡ µ¿ÀÏÇÑ ±ÔÄ¢ÀÌ ÀÖÀ» °æ¿ì ÀÛ¾÷Àº µ¿½Ã¿¡ ½ÇÇàµÉ ¼ö ¾ø½À´Ï´Ù. °íÀ¯ ½ºÄÉÁÙ¸µ ±ÔÄ¢À» ¾µ ¶§ isConflicting¿¡ ´ëÇÑ API °è¾àÀ» ¹Ýµå½Ã ÁÖÀÇ ±í°Ô Àаí ÁؼöÇϽʽÿÀ.

ÀÛ¾÷¿¡ °ü·ÃµÇÁö ¾ÊÀº ¿©·¯ Á¦ÇÑÁ¶°ÇÀÌ ÀÖÀ» °æ¿ì MultiRuleÀ» »ç¿ëÇÏ¿© ´ÙÁß ½ºÄÉÁÙ¸µ ±ÔÄ¢À» µ¿½Ã¿¡ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î ÀÛ¾÷ÀÌ Ç¥½Ãµî ½ºÀ§Ä¡¸¦ ÄÑ°í ³×Æ®¿öÅ© ¼ÒÄÏ¿¡ Á¤º¸µµ ½á¾ß ÇÒ °æ¿ì ÀÛ¾÷Àº ÆÑÅ丮 ¸Þ¼Òµå MultiRule.combineÀ» »ç¿ëÇÏ¿© Ç¥½Ãµî ½ºÀ§Ä¡ ±ÔÄ¢ ¹× ÇØ´ç ¼ÒÄÏ¿¡ ´ëÇÑ ¾²±â ¾×¼¼½º ±ÔÄ¢À» ´ÜÀÏ ±ÔÄ¢À¸·Î °áÇÕÇÒ ¼ö ÀÖ½À´Ï´Ù.

±ÔÄ¢ °èÃþ ±¸Á¶

ISchedulingRule¿¡ ´ëÇÑ isConflicting ¸Þ¼Òµå¸¦ ¼³¸íÇßÁö¸¸ Áö±Ý±îÁö´Â contains ¸Þ¼Òµå¸¦ ¾ð±ÞÇÏÁö ¾Ê¾Ò½À´Ï´Ù. ÀÌ ¸Þ¼Òµå´Â ´Ù¼öÀÇ Å¬¶óÀÌ¾ðÆ®¿¡´Â ÇÊ¿äÇÏÁö ¾ÊÀº ½ºÄÉÁÙ¸µ ±ÔÄ¢¿¡ ´ëÇÑ ¸Å¿ì Ư¼öÈ­µÈ ÀÀ¿ëÇÁ·Î±×·¥¿¡ »ç¿ëµË´Ï´Ù. ½ºÄÉÁÙ¸µ ±ÔÄ¢Àº ³í¸®ÀûÀ¸·Î °èÃþ ±¸Á¶ ÀÚ¿ø¿¡ ´ëÇÑ ¾×¼¼½º¸¦ Á¦¾îÇϱâ À§ÇÑ °èÃþ ±¸Á¶·Î ÀÛ¼ºµÉ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °³³äÀ» ¼³¸íÇÏ´Â °¡Àå ´Ü¼øÇÑ ¿¹Á¦´Â Æ®¸® ±â¹Ý ÆÄÀÏ ½Ã½ºÅÛÀÔ´Ï´Ù. ÀÀ¿ëÇÁ·Î±×·¥ÀÌ µð·ºÅ丮¿¡¼­ µ¶Á¡ Àá±ÝÀ» È®º¸ÇÑ´Ù´Â °ÍÀº ÀϹÝÀûÀ¸·Î ÇØ´ç µð·ºÅ丮 ³»ÀÇ ÆÄÀÏ ¹× ¼­ºêµð·ºÅ丮¿¡ ´ëÇÑ µ¶Á¡ ¾×¼¼½ºµµ Æ÷ÇԵǴ °ÍÀÓÀ» ÀǹÌÇÕ´Ï´Ù. contains ¸Þ¼Òµå´Â Àá±Ý °£ °èÃþ ±¸Á¶ °ü°è¸¦ ÁöÁ¤ÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. Àá±Ý¿¡ ´ëÇÑ °èÃþ ±¸Á¶¸¦ ÀÛ¼ºÇÒ Çʿ䰡 ¾ø´Â °æ¿ì contains ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© ´Ü¼øÈ÷ isConflictingÀ» È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù.

´ÙÀ½Àº java.io.File Çڵ鿡 ´ëÇÑ ¾²±â ¾×¼¼½º¸¦ Á¦¾îÇÏ´Â °èÃþ ±¸Á¶ Àá±ÝÀÇ ¿¹Á¦ÀÔ´Ï´Ù.

   public class FileLock implements ISchedulingRule {
      private String path;
      public FileLock(java.io.File file) {
         this.path = file.getAbsolutePath();
      }
      public boolean contains(ISchedulingRule rule) {
         if (this == rule)
         return true;
         if (rule instanceof FileLock)
            return path.startsWith(((FileLock) rule).path);
         if (rule instanceof MultiRule) {
            MultiRule multi = (MultiRule) rule;
            ISchedulingRule[] children = multi.getChildren();
            for (int i = 0; i < children.length; i++)
               if (!contains(children[i]))
                  return false;
         return true;
            }
         return false;
      }
      public boolean isConflicting(ISchedulingRule rule) {
         if (!(rule instanceof FileLock))
            return false;
         String otherPath = ((FileLock)rule).path;
         return path.startsWith(otherPath) || otherPath.startsWith(path);
      }
   }
contains ¸Þ¼Òµå´Â ½º·¹µå°¡ ÀÌ¹Ì ±ÔÄ¢À» ¼ÒÀ¯Çϰí ÀÖÀ» ¶§ µÎ ¹øÂ° ±ÔÄ¢À» È®º¸ÇÏ·Á°í ½ÃµµÇÒ °æ¿ì ÇØ´ç ¿ªÇÒÀ» ¼öÇàÇÕ´Ï´Ù. ±³Âø »óÅ °¡´É¼ºÀ» ¹æÁöÇϱâ À§ÇØ Á¦°øµÈ ½º·¹µå´Â ÁöÁ¤µÈ ½Ã°£¿¡ ÇϳªÀÇ ½ºÄÉÁÙ¸µ ±ÔÄ¢¸¸ ¼ÒÀ¯ÇÒ ¼ö ÀÖ½À´Ï´Ù. ½º·¹µå°¡ beginRule¿¡ ´ëÇÑ ÀÌÀü È£ÃâÀ» ÅëÇØ¼­ ¶Ç´Â ½ºÄÉÁÙ¸µ ±ÔÄ¢ÀÌ ÀÖ´Â ÀÛ¾÷À» ½ÇÇàÇÏ¿© ÀÌ¹Ì ±ÔÄ¢À» ¼ÒÀ¯Çϰí ÀÖÀ» ¶§ beginRuleÀ» È£ÃâÇÒ °æ¿ì µÎ ±ÔÄ¢ÀÌ µ¿µîÇÑÁö¸¦ È®ÀÎÇϱâ À§ÇØ contains ¸Þ¼Òµå°¡ ÂüÁ¶µË´Ï´Ù. ÀÌ¹Ì ¼ÒÀ¯Çϰí ÀÖ´Â ±ÔÄ¢ÀÇ contains ¸Þ¼Òµå°¡ true¸¦ ¸®ÅÏÇÒ °æ¿ì beginRule È£ÃâÀº ¼º°øÇÕ´Ï´Ù. contains ¸Þ¼Òµå°¡ false¸¦ ¸®ÅÏÇÏ¸é ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù.

À̸¦ º¸´Ù ±¸Ã¼ÀûÀÎ ¿ë¾î·Î Ç¥ÇöÇϱâ À§ÇØ ½º·¹µå°¡ "c:\temp"ÀÇ µð·ºÅ丮¿¡ ¿¹Á¦ FileLock ±ÔÄ¢À» ¼ÒÀ¯Çϰí ÀÖ´Â °ÍÀ¸·Î °£ÁÖÇÕ´Ï´Ù. ÀÌ ±ÔÄ¢À» ¼ÒÀ¯ÇÏ´õ¶óµµ ÇØ´ç µð·ºÅ丮 ¼­ºêÆ®¸® ³»ÀÇ ÆÄÀÏÀ» ¼öÁ¤ÇÏ´Â °Í¸¸ Çã¿ëµË´Ï´Ù. "c:\temp" ¾Æ·¡¿¡ ÀÖÁö ¾Ê´Â ±âŸ µð·ºÅ丮ÀÇ ÆÄÀÏÀ» ¼öÁ¤ÇÏ·Á°í ½ÃµµÇÒ °æ¿ì ½ÇÆÐÇÕ´Ï´Ù. µû¶ó¼­ ½ºÄÉÁÙ¸µ ±ÔÄ¢Àº ÀÛ¾÷ ¶Ç´Â ½º·¹µå°¡ ¼öÁ¤Çϵµ·Ï Çã¿ëµÇ°Å³ª Çã¿ëµÇÁö ¾ÊÀº Ç׸ñ¿¡ ´ëÇÑ ±¸Ã¼ÀûÀÎ ½ºÆåÀÔ´Ï´Ù. ÇØ´ç ½ºÆåÀ» À§¹ÝÇÏ¸é ·±Å¸ÀÓ ¿¹¿Ü°¡ ¹ß»ýÇÕ´Ï´Ù. µ¿½Ã¼º Ãø¸é¿¡¼­ ÀÌ ±â¼úÀ» 2´Ü°è Àá±ÝÀ̶ó°í ÇÕ´Ï´Ù. 2´Ü°è Àá±Ý ¼³°è¿¡¼­ ÇÁ·Î¼¼½º´Â ´ë°³ ƯÁ¤ Ÿ½ºÅ©¿¡ ÇÊ¿äÇÑ ¸ðµç Àá±ÝÀ» ¹Ì¸® ÁöÁ¤ÇϹǷÎ, ±× ÀÌÈÄ¿¡´Â Á¶ÀÛ Áß Ãß°¡ Àá±ÝÀ» È®º¸Çϵµ·Ï Çã¿ëµÇÁö ¾Ê½À´Ï´Ù. 2´Ü°è Àá±ÝÀº ¼øÈ¯ ´ë±â ±³Âø »óÅÂÀÇ ÇʼöÁ¶°ÇÀÎ À¯Áö ¹× ´ë±â(hold-and-wait) Á¶°ÇÀ» Á¦°ÅÇÕ´Ï´Ù. µû¶ó¼­ ½ºÄÉÁÙ¸µ ±ÔÄ¢À» ±âº» Àá±ÝÀ¸·Î¸¸ »ç¿ëÇÏ´Â ½Ã½ºÅÛÀÌ ±³Âø »óÅ¿¡ ºüÁö´Â °ÍÀº ºÒ°¡´ÉÇÕ´Ï´Ù.

¹ýÀû ÁÖÀÇ»çÇ×