org.wegra.thread
Class RWLock

java.lang.Object
  extended byorg.wegra.thread.Lock
      extended byorg.wegra.thread.RWLock

public final class RWLock
extends org.wegra.thread.Lock

Àбâ/¾²±â ¶ôÀº ¾²´Â µµÁß Àаųª, Àд µµÁß ¾²°Å³ª Çϴ°ÍÀ» ¸·¾ÆÁØ´Ù. ¶ÇÇÑ, ¿©·¯ ¾²·¹µå¿¡¼­ µ¿½Ã¿¡ ¾²´Â °Íµµ ¸·¾ÆÁØ´Ù. ÇÏÁö¸¸ ¿©·¯ ½º·¹µå¿¡¼­ µ¿½Ã¿¡ Àд °ÍÀº Çã¿ëµÈ´Ù. Àбâ´Â ¾²±âº¸´Ù ³õÀº ¿ì¼±¼øÀ§¸¦ °¡Áö´Âµ¥ ÀÌ·Î ÀÎÇØ ¾²±â°¡ ¸¶ÃÄÁú ¶§±îÁö ¹Ì·ïÁ³´ø ¸ðµç Àбâ´Â Ç×»ó ´ÙÀ½ ¾²±ã°¡ ÁøÇàµÇ±â Àü¿¡ ¸ÕÀú ¼öÇàµÈ´Ù. ¸ðµç ¾²±â´Â ¿äûµÈ ¼ø¼­´ë·Î ÀÌ·ïÁöµµ·Ï ¤¾º¸ÀåµÈ´Ù. Áï, °¡Àå ¸ÕÀú ¿äûµÈ ¾²±â°¡ °¡Àå ¸ÕÀú 󸮵ȴÙ. ÀФ¡/¾²±â ¶ôÀº ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

	public class DAtaStructureOrResourse {
		RWLock lock = new RWLock();
		public void access() throws InterrruptedException {
			lock.requestRead();
			try {
				// Àб⸦ ¿©±â¿¡¼­ ÇÑ´Ù.
			} finally {
				lock.readAccomplished();
			}
		}

		public void modify() throws InterruptedException {
			lock.requestWrite();
			try {
				// ¾²±â¸¦ ¿©±â¿¡¼­ ÇÑ´Ù.
			} finally {
				lock.writeAccomplished()'
			}
		}
	}
 
nÇöÀç ±¸ÇöµÈ RWLockÀº ŸÀӾƿôÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù. RWLockÀº Dong LeadÀÇ Concurrent Programming in Java (Addision Wedley, 1997, pp.300-303) ÀÇ Àбâ/¾²±â ¶ôÀ» ±â¹ÝÀ¸·Î ÀÛ¼ºµÇ¾ú´Ù. ÇÊÀÚ´Â Äڵ带 ´Ü¼øÈ­ ÇßÀ¸¸ç, ºí·ÏÅ· ¾øÀÌ ¶ôÀ» ¾ò´Â ±â´ÉÀ» Ãß°¡Çß´Ù. ¶ÇÇÑ, Àбâ/¾²±â ¶ôÀ» ±â¹Ý Ŭ·¡½º·Î½á ¿©·¯ºÐÀÌ »ó¼Ó¹Þ¾Æ ¾²µµ·Ï ÇÏÁö ¾Ê°í µ¶¸³Çü Ŭ·¡½º·Î½á ±¸ÇöÇß´Ù. Scott Osk°ú Henry WongÀÌ ÁýÇÊÇÑ JavaThread(O'Reilly 1997, pp. 180-187)¿¡´Â ÇÊÀÚÀÇ °Í°ú ÀüÇô ´Ù¸£°Ô Àбâ/¾²±â ¶ôÀ» ±¸ÇöÇØ ³õ¾ÒÀ¸´Ï ÂüÁ¶Çϱ⠹ٶõ´Ù.

Author:
wegra(Bok-Youn Lee) version: 1.0 (2001-08-11)

Nested Class Summary
static class RWLock.Test
           Test Ŭ·¡½º´Â ´ÜÀ§ Å×½ºÆ®¸¦ À§ÇÑ Å¬·¡½º·Î ´ÙÀ½°ú °°ÀÌ ½ÇÇà½Ãų ¼ö ÀÖ´Ù.
 
Constructor Summary
RWLock()
          RWLock constructor comment.
 
Method Summary
 boolean acquire(long timeout)
          ¼¼¸¶Æ÷¾î¸¦ ¾ò´Â´Ù.
 int getID()
          ÇØ´ç ¼¼¸¶Æ÷¾î °´Ã¤ÀÇ °íÀ¯ ID¸¦ ¹Ýȯ
 void readAccomplished()
          ¶ôÀ» ³õ´Â´Ù.
 void release()
          ¼¼¸¶Æ÷¾î¸¦ ³õ´Â´Ù.
 boolean requestImmediateRead()
          ÀÌ ¿äûÀº ÀбⰡ °¡´ÉÇÒ °æ¿ì true¸¦ ¹ÝȯÇÑ´Ù.
 boolean requestImmediateWrite()
          ºí·ÏÅ· ¾øÀÌ ¾²±â ¿äûÀ» ÇÑ´Ù.
 void requestRead()
          Àб⠶ôÀ» ¿äûÇϳ®.
 void requestWrite()
          ¾²±â¸¦ ¿äûÇÑ´Ù.
 void writeAccomplished()
          ¶ôÀ» ³õ´Â´Ù.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

RWLock

public RWLock()
RWLock constructor comment.

Method Detail

acquire

public boolean acquire(long timeout)
                throws java.lang.InterruptedException,
                       TimeoutException
¼¼¸¶Æ÷¾î¸¦ ¾ò´Â´Ù. ¿¹¸¦ µé¾î MutexÀÇ °æ¿ì ¼ÒÀ¯±ÇÀ» ¾òÀ¸¶ó´Â ¶æÀ̸ç, CountingSemaphoreÀÇ °æ¿ì Ä«¿îÆ®¸¦ Çϳª °¨¼Ò½Ã۶ó´Â ¶æÀÌ´Ù.

Returns:
¸¸¾à ŸÀӾƿô °ªÀÌ 0ÀÌ°í ¶ôÀ» ¾òÀ» ¼ö ¾ø¾úÀ» °æ¿ì false¸¦ ¹ÝȯÇÏ¸ç ±× ¿ÜÀÇ °æ¿ì true¸¦ ¹ÝȯÇÑ´Ù.
Throws:
java.lang.InterruptedException - ´Ù¸¥ ½º·¹µå¿¡ ÀÇÇØ¼­ ¶ôÀ» ¾ò´Â °ÍÀÌ ÀÎÅÍ·´Æ® µÇ¾úÀ» °æ¿ì.
TimeoutException - ¼¼¸¶Æ÷¾î°¡ ¾ò¾îÁö±â Àü¿¡ ŸÀӾƿôÀÌ ´Ù Áö³ª°£ °æ¿ì.

readAccomplished

public void readAccomplished()
¶ôÀ» ³õ´Â´Ù. Àб⠰úÁ¤À» ¸¶Ä¡¸é ÀÌ ¸Þ¼Òµå¸¦ È£ÃâÇØ¾ß¸¸ ÇÑ´Ù.


release

public void release()
¼¼¸¶Æ÷¾î¸¦ ³õ´Â´Ù.


requestImmediateRead

public boolean requestImmediateRead()
ÀÌ ¿äûÀº ÀбⰡ °¡´ÉÇÒ °æ¿ì true¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à, ÇöÀç ÀÐÀ» ¼ö ¾ø´Â »óȲÀ̶ó¸é false¸¦ ¹ÝȯÇÑ´Ù. true¸¦ ¹ÝÈ¯ÇØ¼­ ÀбⰡ °¡´ÉÇÒ °æ¿ì Àб⸦ ¸¶Ä£ ÈÄ¿¡´Â ¹Ýµå½Ã ´ÙÀ½°ú °°ÀÌ ÇØÁÖ¾î¾ß ÇÑ´Ù.
	public void read() {
		if ( lock.requestImmediateRead() ) {
			try {
				// ¿©±â¿¡¼­ Àб⸦ ÇÑ´Ù.
			} finally {
				lock.readAccomplished();
			}
		} else {
			// ÀÐÀ» ¼ö ¾ø¾ú´Ù.
		}
	}


requestImmediateWrite

public boolean requestImmediateWrite()
ºí·ÏÅ· ¾øÀÌ ¾²±â ¿äûÀ» ÇÑ´Ù. ¸¸¾à Àб⳪ ¾²±â°¡ ÀÌ¹Ì ÁøÇàÁßÀ̶ó¸é false¸¦ ¹ÝȯÇÑ´Ù. ¸¸¾à ¾²±â°¡ °¡´ÉÇÑ »óŶó¸é true¸¦ ¹ÝȯÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¸é µÈ´Ù.
	public void write() {
		if (lock.requestimmediateWrite() ) {
			try {
				// ¿©±â¿¡¼­ ¾²±â¸¦ ÇÑ´Ù.
			} finally {
				// lock.writeAccomplished()
			}
		} else {
			// ¾µ ¼ö ¾ø¾ú´Ù.
		}
 


requestRead

public void requestRead()
                 throws java.lang.InterruptedException
Àб⠶ôÀ» ¿äûÇϳ®. ÀбⰡ °¡´ÉÇÒ ¶§±îÁö ºí·ÏÅ· µÈ´Ù. ÀÌ ¸Þ¼Òµå¸¦ È£ÃâÇÑ ´ÙÀ½ Àб⸦ ¸¶Ä£ ´ÙÀ½¿¡´Â ¹Ýµå½Ã readAccomplished() ¸¦ È£ÃâÇØ¾ß ÇÑ´Ù.

Throws:
java.lang.InterruptedException

requestWrite

public void requestWrite()
                  throws java.lang.InterruptedException
¾²±â¸¦ ¿äûÇÑ´Ù. ½ÇÁ¦ ¾²±â°¡ ÀϾ ¼ö ÀÖÀ» ¶§±îÁö ºí·ÏÅ· µÈ´Ù. ¾²±â´Â Ç×»ó ¿äûµÈ ¼ø¼­´ë·Î ÀϾ°Ô µÈ´Ù. ¾²±â°¡ ¸¶Ä¥ ¶§±îÁö ¿¬±âµÇ¾ú´ø Àб⠿äûµéÀº ´ÙÀ½ ¾²±â ¿äûÀÌ ½ÇÇàµÇ±â Àü¿¡ ¼öÇàµÈ´Ù. ¾²±â¸¦ ¸ðµÎ ³¡¸¶Ä£ ´ÙÀ½¿¡´Â ¹Ýµå½Ã writeAccomplished() ¸¦ È£ÃâÇØ ÁÖ¾î¾ß ÇÑ´Ù.

Throws:
java.lang.InterruptedException

writeAccomplished

public void writeAccomplished()
¶ôÀ» ³õ´Â´Ù. ¾²±â¸¦ ¸ðµÎ ¸¶Ä£ ´ÙÀ½¿¡´Â ²À ÀÌ ¸Þ¼Òµå¸¦ È£ÃâÇØ ÁÖ¾î¾ß ÇÑ´Ù.


getID

public final int getID()
ÇØ´ç ¼¼¸¶Æ÷¾î °´Ã¤ÀÇ °íÀ¯ ID¸¦ ¹Ýȯ

Returns:
°íÀ¯ ID