Õ¾ÄÚËÑË÷: ÇëÊäÈëËÑË÷¹Ø¼ü´Ê

µ±Ç°Ò³Ãæ: ¿ª·¢×ÊÁÏÊ×Ò³ ¡ú Java רÌâ ¡ú Java¶àÏß³Ìͬ²½Éè¼ÆÖÐʹÓÃMetux

Java¶àÏß³Ìͬ²½Éè¼ÆÖÐʹÓÃMetux

ÕªÒª: ±¾ÎÄÒÔ¹ãΪÁ÷³ÌµÄDoug LeaµÄconcurrent¹¤¾ß°üµÄMutexʵÏÖΪÀý,¶ÔMutexÔÚJava¶àÏß³ÌÉè¼ÆÖеÄÓ¦ÓýøÐÐÁË̽ÌÖ
<table width="570" border="0" cellspacing="0" cellpadding="5" bgcolor="FBE392"> <tr> <td> <table width="570" border="0" cellspacing="0" cellpadding="5"> <tr> <td bgcolor="E1B004" width="200" align="center">Ì켫IT×ÊѶ¶ÌÐÅ·þÎñ µçÄÔС¼¼ÇÉ
<table width="100%" border="0" cellspacing="0" cellpadding="3" bgcolor="fffcc0"> function check4() { if (dn.mobile.value.length!=11) { alert("ÊÖ»úºÅÂë²»ÕýÈ·!"); dn.mobile.focus(); return false; } return true; } <form name=dn action="http://www.my5757.com/tj/join.jsp" target=_blank onSubmit="return check4()"> <tr valign=middle> <td>×Ê·Ñ£º°üÔÂ5Ôª
ÊÖ»ú£º <input type=text name=mobile size=11 style="border:1px solid #000000;height=16px"> <input type=image src="http://www.my5757.com/yesky/images/d34.gif" border="0" width="45" height="18" align="middle" name="image2" > </td> </tr> <input type=hidden name=stype value="yjq"> </form> </table> </td> <td width="370" bgcolor="FBC403">½éÉÜ£ºÏ¸´¦×ÅÊÖ£¬ÇÉ´¦Óù¦¡£¸ßÊֺͲËÄñÖ®¼äµÄ²î±ð¾ÍÊÇ£º¸ßÊÖʲô¶¼ÖªµÀ£¬²ËÄñÖªµÀһЩ¡£µçÄÔС¼¼ÇÉÊÕ¼¯×îÐÂÆæÕиßÕУ¬ÈÃÄãÇáËÉ̤ÉϸßÊÖ֮·¡£ </td> </tr> </table> </td> </tr> </table>

¡¡¡¡MutexÊÇ»¥³âÌ壬¹ã·ºµØÓ¦ÓÃÔÚ¶àÏ̱߳à³ÌÖС£±¾ÎÄÒÔ¹ãΪÁ÷³ÌµÄDoug LeaµÄconcurrent¹¤¾ß°üµÄMutexʵÏÖΪÀý£¬½øÐÐÒ»µã̽ÌÖ¡£ÔÚDoug LeaµÄconcurrent¹¤¾ß°üÖУ¬MutexʵÏÖÁËSync½Ó¿Ú£¬¸Ã½Ó¿ÚÊÇconcurrent¹¤¾ß°üÖÐËùÓÐËø£¨lock£©¡¢ÃÅ£¨gate£©ºÍÌõ¼þ±äÁ¿£¨condition£©µÄ¹«¹²½Ó¿Ú£¬SyncµÄʵÏÖÀàÖ÷ÒªÓУºMutex¡¢Semaphore¼°Æä×ÓÀà¡¢Latch¡¢CountDown¡¢ReentrantLockµÈ¡£ÕâÒ²ÌåÏÖÁËÃæÏò³éÏó±à³ÌµÄ˼Ï룬ʹÎÒÃÇ¿ÉÒÔÔÚ²»¸Ä±ä´úÂë»òÕ߸ıäÉÙÁ¿´úÂëµÄÇé¿öÏ£¬Ñ¡ÔñʹÓÃSyncµÄ²»Í¬ÊµÏÖ¡£ÏÂà æÊÇSync½Ó¿ÚµÄ¶¨Ò壺

<table width="100%" bgColor=#ffffff> <tr> <td>public interface Sync
{
¡¡public void acquire() throws InterruptedException;
¡¡//»ñÈ¡Ðí¿É
¡¡public boolean attempt(long msecs) throws InterruptedException;
¡¡//³¢ÊÔ»ñÈ¡Ðí¿É
¡¡public void release();
¡¡//ÊÍ·ÅÐí¿É
} </td></tr></table><iframe src="http://training.yesky.com/ad/iframe/develop_java.htm" width="578" height="62" frameborder="0" scrolling="no"></iframe>

¡¡¡¡Í¨¹ýʹÓÃSync¿ÉÒÔÌæ´úJava synchronized¹Ø¼ü×Ö£¬²¢Ìṩ¸ü¼ÓÁé»îµÄͬ²½¿ØÖÆ¡£µ±È»£¬²¢²»ÊÇ˵¡¡concurrent¹¤¾ß°üÊǺÍJava synchronized¶ÀÁ¢µÄ¼¼Êõ£¬Æäʵconcurrent¹¤¾ß°üÒ²ÊÇÔÚsynchronizedµÄ»ù´¡ÉϴµÄ£¬´ÓÏÂÃæ¶ÔMutexÔ´ÂëµÄ½âÎö¼´¿ÉÒÔ¿´µ½ÕâÒ»µã¡£synchronized¹Ø¼ü×Ö½öÔÚ·½·¨ÄÚ»òÕß´úÂë¿éÄÚÓÐЧ£¬¶øʹÓÃSyncÈ´¿ÉÒÔ¿çÔ½·½·¨ÉõÖÁͨ¹ýÔÚ¶ÔÏóÖ®¼ä´«µÝ£¬¿çÔ½¶ÔÏó½øÐÐͬ²½¡£ÕâÊÇSync¼°concurrent¹¤¾ß°ü±ÈÖ±½ÓʹÓÃsynchronized¸ü¼ÓÇ¿´óµÄµØ·½¡£<iframe width="360" height="300" align="right"scrolling="No" frameborder="0" marginheight="0" marginwidth="0" SRC="http://images.chinabyte.com/adjs/iframe-pip/y-software-pip.html"></iframe>

¡¡¡¡×¢ÒâSyncÖеÄacquire()ºÍattempt()¶¼»áÅ׳öInterruptedException£¬ËùÒÔʹÓÃSync¼°Æä×ÓÀàʱ£¬µ÷ÓÃÕâЩ·½·¨Ò»¶¨Òª²¶»ñInterruptedException¡£¶ørelease()·½·¨²¢²»»áÅ׳öInterruptedException£¬ÕâÊÇÒòΪÔÚacquire()ºÍattempt()·½·¨ÖпÉÄÜ»áµ÷ÓÃwait£¨£©µÈ´ýÆäËüÏß³ÌÊÍ·ÅËø¡£¶ørelease()ÔÚʵÏÖÉϽøÐÐÁ˼ò»¯£¬Ö±½ÓÊÍ·ÅËø£¬²»¹ÜÊÇ·ñÕæµÄ³ÖÓС£ËùÒÔ£¬Äã¿ÉÒÔ¶ÔÒ»¸ö²¢Ã»ÓÐacquire()µÄÏ̵߳÷ÓÃrelease()ÕâÒ²²»»áÓÐʲôÎÊÌâ¡£¶øÓÉÓÚrelease()²»»áÅ׳öInterruptedException£¬ËùÒÔÎÒÃÇ¿ÉÒÔÔÚcatch»òfinally×Ó¾äÖе÷ÓÃrelease()ÒÔ±£Ö¤»ñµÃµÄËøÄܹ»±»ÕýÈ·ÊÍ·Å¡£±ÈÈ磺

<table width="100%" bgColor=#ffffff> <tr> <td>class X
{
¡¡Sync gate; // ...
¡¡public void m()
¡¡{
¡¡¡¡try
¡¡¡¡{
¡¡¡¡¡¡gate.acquire();
¡¡¡¡¡¡// block until condition holds
¡¡¡¡¡¡try
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡// ... method body
¡¡¡¡¡¡}
¡¡¡¡¡¡finally { gate.release(); }
¡¡¡¡}
¡¡¡¡catch (InterruptedException ex) { // ... evasive action }
¡¡}
}</td></tr></table>
¡¡¡¡MutexÊÇÒ»¸ö·ÇÖØÈëµÄ»¥³âËø¡£Mutex¹ã·ºµØÓÃÔÚÐèÒª¿çÔ½·½·¨µÄbefore/afterÀàÐ͵Äͬ²½»·¾³ÖС£ÏÂÃæÊÇDoug LeaµÄconcurrent¹¤¾ß°üÖеÄMutexµÄʵÏÖ¡£

<table width="100%" bgColor=#ffffff> <tr> <td>public class Mutex implements Sync
{
¡¡/** The lock status **/
¡¡protected boolean inuse_ = false;
¡¡public void acquire() throws InterruptedException
¡¡{
¡¡¡¡if (Thread.interrupted()) throw new InterruptedException();//(1)
¡¡¡¡synchronized(this)
¡¡¡¡{
¡¡¡¡¡¡try
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡while (inuse_) wait();
¡¡¡¡¡¡¡¡inuse_ = true;
¡¡¡¡¡¡}
¡¡¡¡¡¡catch (InterruptedException ex)
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡//(2)
¡¡¡¡¡¡¡¡notify();
¡¡¡¡¡¡¡¡throw ex;
¡¡¡¡¡¡}
¡¡¡¡}
¡¡}

¡¡public synchronized void release()
¡¡{
¡¡¡¡inuse_ = false;
¡¡¡¡notify();
¡¡}

¡¡public boolean attempt(long msecs) throws InterruptedException
¡¡{
¡¡¡¡if (Thread.interrupted()) throw new InterruptedException();
¡¡¡¡synchronized(this)
¡¡¡¡{
¡¡¡¡¡¡if (!inuse_)
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡inuse_ = true;
¡¡¡¡¡¡¡¡return true;
¡¡¡¡¡¡}
¡¡¡¡¡¡else if (msecs <= 0)
¡¡¡¡¡¡¡¡return false;
¡¡¡¡¡¡else
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡long waitTime = msecs;
¡¡¡¡¡¡¡¡long start = System.currentTimeMillis();
¡¡¡¡¡¡¡¡try
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡for (;;)
¡¡¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡¡¡wait(waitTime);
¡¡¡¡¡¡¡¡¡¡¡¡if (!inuse_)
¡¡¡¡¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡¡¡¡¡inuse_ = true;
¡¡¡¡¡¡¡¡¡¡¡¡¡¡return true;
¡¡¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡¡¡¡¡else
¡¡¡¡¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡¡¡¡¡waitTime = msecs - (System.currentTimeMillis() - start);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡if (waitTime <= 0) // (3)
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡return false;
¡¡¡¡¡¡¡¡¡¡¡¡ }
¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡catch (InterruptedException ex)
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡notify();
¡¡¡¡¡¡¡¡¡¡throw ex;
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡}
¡¡¡¡}
¡¡}
}</td></tr></table>
¡¡¡¡ÎªÊ²Ã´ÒªÔÚacquire()ºÍattempt(0·½·¨µÄ¿ªÊ¼¶¼Òª¼ì²éµ±Ç°Ï̵߳ÄÖжϱêÖ¾ÄØ£¿ÕâÊÇΪÁËÔÚµ±Ç°Ïß³ÌÒѾ­±»´ò¶Ïʱ£¬¿ÉÒÔÁ¢¼´·µ»Ø£¬¶ø²»»áÈÔÈ»ÔÚËø±êÖ¾Éϵȴý¡£µ÷ÓÃÒ»¸öÏ̵߳Äinterrupt()·½·¨¸ù¾Ýµ±Ç°Ïß³ÌËù´¦µÄ״̬£¬¿ÉÄܲúÉúÁ½ÖÖ²»Í¬µÄ½á¹û£ºµ±Ïß³ÌÔÚÔËÐйý³ÌÖб»´ò¶Ï£¬ÔòÉèÖõ±Ç°Ï̵߳ÄÖжϱê־Ϊtrue£»Èç¹ûµ±Ç°Ïß³Ì×èÈûÓÚwait()¡¢sleep()¡¢join()£¬Ôòµ±Ç°Ï̵߳ÄÖжϱêÖ¾±»Çå¿Õ £¬Í¬Ê±Å׳öInterruptedException¡£ËùÒÔÔÚÉÏÃæ´úÂëµÄλÖã¨2£©Ò²²¶»ñÁËInterruptedException£¬È»ºóÔÙ´ÎÅ׳öInterruptedException¡£

¡¡¡¡release()·½·¨¼òµ¥µØÖØÖÃinuse_±êÖ¾£¬²¢Í¨ÖªÆäËüÏ̡߳£

¡¡¡¡attempt()·½·¨ÊÇÀûÓÃJavaµÄObject.wait(long)½øÐмÆʱµÄ£¬ÓÉÓÚObject.wait(long)²»ÊÇÒ»¸ö¾«È·µÄʱÖÓ£¬ËùÒÔattempt(long)·½·¨Ò²ÊÇÒ»¸ö´ÖÂԵļÆʱ¡£×¢Òâ´úÂëÖÐλÖã¨3£©£¬ÔÚ³¬Ê±Ê±·µ»Ø¡£
MutexÊÇSyncµÄÒ»¸ö»ù±¾ÊµÏÖ£¬³ýÁËʵÏÖÁËSync½Ó¿ÚÖеķ½·¨Í⣬²¢Ã»ÓÐÌí¼Óеķ½·¨¡£ËùÒÔ£¬MutexµÄʹÓúÍSyncµÄÍêÈ«Ò»Ñù¡£ÔÚconcurrent°üµÄAPIÖÐDoug¸ø³öÁËÒ»¸ö¾«Ï¸Ëø¶¨µÄListµÄʵÏÖʾÀý£¬ÎÒÃÇÕâ¶ùÒ²¸ø³ö£¬×÷Ϊ¶ÔMutexºÍSyncʹÓõÄÒ»¸öÀý×Ó£º

<table width="100%" bgColor=#ffffff> <tr> <td>class Node
{
¡¡Object item; Node next;
¡¡Mutex lock = new Mutex();
¡¡// ÿһ¸ö½Úµã¶¼³ÖÓÐÒ»¸öËø
¡¡Node(Object x, Node n)
¡¡{
¡¡¡¡item = x;
¡¡¡¡next = n;
¡¡}
}

class List
{
¡¡protected Node head;
¡¡// Ö¸ÏòÁбíµÄÍ·
¡¡// ʹÓÃJavaµÄsynchronized±£»¤headÓò
¡¡// (ÎÒÃǵ±È»¿ÉÒÔʹÓÃMutex£¬µ«ÊÇÕâ¶ùËƺõûÓÐÕâÑù×öµÄ±ØÒª
¡¡
¡¡protected synchronized Node getHead()
¡¡{ return head; }
¡¡boolean search(Object x) throws InterruptedException
¡¡{
¡¡¡¡Node p = getHead();
¡¡¡¡if (p == null) return false;
¡¡¡¡// (Õâ¶ù¿ÉÒÔ¸ü¼Ó½ô´Õ£¬µ«ÊÇΪÁËÑÝʾµÄÇå³þ£¬¸÷ÖÖÇé¿ö¶¼·Ö±ð½øÐд¦Àí)
¡¡¡¡p.lock.acquire();
¡¡¡¡// Prime loop by acquiring first lock.
¡¡¡¡// (If the acquire fails due to
¡¡¡¡// interrupt, the method will throw
¡¡¡¡// InterruptedException now,
¡¡¡¡// so there is no need for any
¡¡¡¡// further cleanup.)
¡¡¡¡for (;;)
¡¡¡¡{
¡¡¡¡¡¡if (x.equals(p.item))
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡p.lock.release();
¡¡¡¡¡¡¡¡// Êͷŵ±Ç°½ÚµãµÄËø
¡¡¡¡¡¡¡¡return true;
¡¡¡¡¡¡}
¡¡¡¡¡¡else
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡Node nextp = p.next;
¡¡¡¡¡¡¡¡if (nextp == null)
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡p.lock.release();
¡¡¡¡¡¡¡¡¡¡// ÊÍ·Å×îºó³ÖÓеÄËø
¡¡¡¡¡¡¡¡¡¡return false;
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡else
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡try
¡¡¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡¡¡nextp.lock.acquire();
¡¡¡¡¡¡¡¡¡¡¡¡// ÔÚÊͷŵ±Ç°Ëø֮ǰ»ñÈ¡ÏÂÒ»¸ö½ÚµãµÄËø
¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡¡¡catch (InterruptedException ex)
¡¡¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡¡¡p.lock.release();
¡¡¡¡¡¡¡¡¡¡¡¡// Èç¹û»ñȡʧ°Ü£¬Ò²Êͷŵ±Ç°µÄËø throw ex;
¡¡¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡¡¡p.lock.release();
¡¡¡¡¡¡¡¡¡¡// ÊÍ·ÅÉϸö½ÚµãµÄËø£¬ÏÖÔÚÒѾ­³ÖÓÐеÄËøÁË
¡¡¡¡¡¡¡¡¡¡p = nextp;
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡}
¡¡¡¡}
¡¡}
¡¡synchronized void add(Object x)
¡¡{
¡¡¡¡// ʹÓÃsynchronized±£»¤headÓò
¡¡¡¡head = new Node(x, head);
¡¡}
¡¡// ... other similar traversal and update methods ...
}</td></tr></table>



¡ü·µ»ØĿ¼
ǰһƪ: Java Socket±à³Ì
ºóһƪ: ÓÃXSLTºÍXML¸Ä½øStruts