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