锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产区男人本色在线观看,亚洲精品一二三区,亚洲精品二区国产综合野狼 http://blogjava.net/DLevin/category/49040.htmlIn general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation.
To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatra zh-cn Thu, 13 Aug 2015 10:48:08 GMT Thu, 13 Aug 2015 10:48:08 GMT 60 瀹炵幇鑷繁鐨凩ock瀵硅薄 http://m.tkk7.com/DLevin/archive/2015/08/11/426723.htmlDLevin DLevin Mon, 10 Aug 2015 22:08:00 GMT http://m.tkk7.com/DLevin/archive/2015/08/11/426723.html http://m.tkk7.com/DLevin/comments/426723.html http://m.tkk7.com/DLevin/archive/2015/08/11/426723.html#Feedback 0 http://m.tkk7.com/DLevin/comments/commentRss/426723.html http://m.tkk7.com/DLevin/services/trackbacks/426723.html 涓鐩存兂濂藉ソ瀛︿範concurrent鍖呬腑鐨勫悇涓被鐨勫疄鐜幫紝鐒惰岀粡甯哥湅浜嗕竴鐐瑰氨鍥犱負鍏朵粬浜嬫儏騫叉壈鑰屾斁涓嬩簡銆傚彂鐜拌繖鏍峰お涓嶅埄浜庤嚜宸辯殑鎴愰暱浜嗭紝鍥犺屾渶榪戞墦綆楁綔蹇冧竴浠朵竴浠剁殑瀹屾垚鑷繁鎯沖涔犵殑涓滆タ銆?br /> 瀵筩oncurrent鍖呯殑瀛︿範鎵撶畻鍏堜粠Lock鐨勫疄鐜板紑濮嬶紝鍥犺岃嚜鐒惰岀劧鐨勫氨绔搗浜咥bstractQueuedSynchronizer錛岀劧鑰岃璇繪噦榪欎釜綾葷殑婧愮爜騫朵笉鏄偅涔堝鏄擄紝鍥犺屾垜灝卞紑濮嬮棶鑷繁涓涓棶棰橈細濡傛灉鑷繁瑕佸幓瀹炵幇榪欎釜涓涓狶ock瀵硅薄錛屽簲璇ュ浣曞疄鐜板憿錛?br /> 瑕佸疄鐜癓ock瀵硅薄錛岄鍏堢悊瑙d粈涔堟槸閿侊紵鎴戣嚜宸變粠緙栫▼瑙掑害綆鍗曠殑鐞嗚В錛屾墍璋撻攣瀵硅薄錛堜簰鏂ラ攣錛夊氨鏄畠鑳戒繚璇佷竴嬈″彧鏈変竴涓嚎紼嬭兘榪涘叆瀹冧繚鎶ょ殑涓寸晫鍖猴紝濡傛灉鏈変竴涓嚎紼嬪凡緇忔嬁鍒伴攣瀵硅薄錛岄偅涔堝叾浠栧璞″繀欏昏鏉冪瓑寰咃紝鑰屽湪璇ョ嚎紼嬮鍑鴻繖涓復鐣屽尯鏃墮渶瑕佸敜閱掔瓑寰呭垪琛ㄤ腑鐨勫叾浠栫嚎紼嬨傛洿瀛︽湳涓浜涳紝銆婅綆楁満鎿嶄綔緋葷粺銆?/a>涓鍚屾鏈哄埗鍑嗗垯鐨勫綊綰籌紙P50錛夛細
絀洪棽璁╄繘銆傚綋鏃犺繘紼嬪浜庝復鐣屽尯鏃訛紝琛ㄦ槑涓寸晫璧勬簮澶勪簬絀洪棽鐘舵侊紝搴斿厑璁鎬竴涓姹傝繘鍏ヤ復鐣屽尯鐨勮繘紼嬬珛鍗寵繘鍏ヨ嚜宸辯殑涓寸晫鍖猴紝浠ユ湁鏁堢殑鍒╃敤涓寸晫璧勬簮銆?/li> 蹇欏垯絳夊緟銆傚綋宸叉湁榪涚▼榪涘叆涓寸晫鍖烘椂錛岃〃鏄庝復鐣岃祫婧愭鍦ㄨ璁塊棶錛屽洜鑰屽叾浠栬瘯鍥捐繘鍏ヤ復鐣屽尯鐨勮繘紼嬪繀欏葷瓑寰咃紝浠ヤ繚璇佸涓寸晫鍖鴻祫婧愮殑浜掓枼璁塊棶銆?/li> 鏈夐檺絳夊緟銆傚瑕佹眰璁塊棶涓寸晫璧勬簮鐨勮繘紼嬶紝搴斾繚璇佸湪鏈夐檺鏃墮棿鍐呰兘榪涘叆鑷繁鐨勪復鐣屽尯錛屼互鍏嶉櫡鍏?#8220;姝葷瓑”鐘舵併?/li> 璁╂潈絳夊緟銆傚綋榪涚▼涓嶈兘榪涘叆鑷繁鐨勪復鐣屽尯鏃訛紝搴旇閲婃斁澶勭悊鏈猴紝浠ュ厤榪涚▼闄峰叆“蹇欑瓑”鐘舵併?/li> 璇翠簡閭d箞澶氾紝鍏跺疄瀵逛簰鏂ラ攣寰堢畝鍗曪紝鍙渶瑕佷竴涓爣璁頒綅錛屽鏋滆鏍囪浣嶄負0錛岃〃紺烘病鏈夎鍗犵敤錛屽洜鑰岀洿鎺ヨ幏寰楅攣錛岀劧鍚庢妸璇ユ爣璁頒綅緗負1錛屾鏃跺叾浠栫嚎紼嬪彂鐜拌鏍囪浣嶅凡緇忔槸1錛屽洜鑰岄渶瑕佺瓑寰呫傝繖閲屽榪欎釜鏍囪浣嶇殑姣旇緝騫惰鍊煎繀欏繪槸鍘熷瓙鎿嶄綔錛岃屽湪JDK5浠ュ悗鎻愪緵鐨刟tomic鍖呴噷鐨勫伐鍏風被鍙互寰堟柟渚跨殑鎻愪緵榪欎釜鍘熷瓙鎿嶄綔銆傜劧鑰屼笂闈㈢殑鍥涗釜鍑嗗垯搴旇婕忎簡涓鐐癸紝鍗抽噴鏀鵑攣鐨勭嚎紼嬶紙榪涚▼錛夊拰寰楀埌閿佺殑綰跨▼錛堣繘紼嬶級搴旇鏄悓涓涓紝灝卞儚涓鎶婇挜鍖欏搴斾竴鎶婇攣錛堢悊鎯崇殑錛夛紝鎵浠ヤ竴涓潪甯哥畝鍗曠殑Lock綾誨彲浠ヨ繖涔堝疄鐜幫細
public class SpinLockV1 { private final AtomicInteger state = new AtomicInteger( 0 ); private volatile Thread owner; // 榪欓噷owner瀛楁鍙兘瀛樺湪涓棿鍊鹼紝涓嶅彲闈狅紝鍥犺屽叾浠栫嚎紼嬩笉鍙互渚濊禆榪欎釜瀛楁鐨勫?/span> public void lock() { while ( ! state.compareAndSet( 0 , 1 )) { } owner = Thread.currentThread(); } public void unlock() { Thread currentThread = Thread.currentThread(); if (owner != currentThread || ! state.compareAndSet( 1 , 0 )) { throw new IllegalStateException( " The lock is not owned by thread: " + currentThread); } owner = null ; } }
涓涓畝鍗曠殑嫻嬭瘯鏂規硶錛?br />
@Test public void testLockCorrectly() throws InterruptedException { final int COUNT = 100 ; Thread[] threads = new Thread[COUNT]; SpinLockV1 lock = new SpinLockV1(); AddRunner runner = new AddRunner(lock); for ( int i = 0 ; i < COUNT; i ++ ) { threads[i] = new Thread(runner, " thread- " + i); threads[i].start(); } for ( int i = 0 ; i < COUNT; i ++ ) { threads[i].join(); } assertEquals(COUNT, runner.getState()); } private static class AddRunner implements Runnable { private final SpinLockV1 lock; private int state = 0 ; public AddRunner(SpinLockV1 lock) { this .lock = lock; } public void run() { lock.lock(); try { quietSleep( 10 ); state ++ ; System.out.println(Thread.currentThread().getName() + " : " + state); } finally { lock.unlock(); } } public int getState() { return state; } }
鐒惰岃繖涓猄pinLock鍏跺疄騫朵笉闇瑕乻tate榪欎釜瀛楁錛屽洜涓簅wner鐨勮祴鍊間笌鍚︿篃鏄竴縐嶇姸鎬侊紝鍥犺屽彲浠ョ敤瀹冧綔涓轟竴縐嶄簰鏂ョ姸鎬侊細
public class SpinLockV2 { private final AtomicReference < Thread > owner = new AtomicReference < Thread > ( null ); public void lock() { final Thread currentThread = Thread.currentThread(); while ( ! owner.compareAndSet( null , currentThread)) { } } public void unlock() { Thread currentThread = Thread.currentThread(); if ( ! owner.compareAndSet(currentThread, null )) { throw new IllegalStateException( " The lock is not owned by thread: " + currentThread); } } }
榪欏湪鎿嶄綔緋葷粺涓瀹氫箟涓烘暣褰俊鍙烽噺錛岀劧鑰屾暣褰俊鍙烽噺濡傛灉娌℃嬁鍒伴攣浼氫竴鐩村浜?#8220;蹇欑瓑”鐘舵侊紙娌℃湁閬靛驚鏈夐檺絳夊緟鍜岃鏉冪瓑寰呯殑鍑嗗垯錛夛紝鍥犺岃繖縐嶉攣涔熷彨Spin Lock錛屽湪鐭殏鐨勭瓑寰呬腑瀹冨彲浠ユ彁鍗囨ц兘錛屽洜涓哄彲浠ュ噺灝戠嚎紼嬬殑鍒囨崲錛宑oncurrent鍖呬腑鐨凙tomic澶ч儴鍒嗛兘閲囩敤榪欑鏈哄埗瀹炵幇錛岀劧鑰屽鏋滈渶瑕侀暱鏃墮棿鐨勭瓑寰咃紝“蹇欑瓑”浼氬崰鐢ㄤ笉蹇呰鐨凜PU鏃墮棿錛屼粠鑰屾ц兘浼氬彉鐨勫緢宸紝榪欎釜鏃跺欏氨闇瑕佸皢娌℃湁鎷垮埌閿佺殑綰跨▼鏀懼埌絳夊緟鍒楄〃涓紝榪欑鏂瑰紡鍦ㄦ搷浣滅郴緇熶腑涔熷彨璁板綍鍨嬩俊鍙烽噺錛屽畠閬靛驚浜嗚鏉冪瓑寰呭噯鍒欙紙褰撳墠娌℃湁瀹炵幇鏈夐檺絳夊緟鍑嗗垯錛夈傚湪JDK6浠ュ悗鎻愪緵浜哃ockSupport.park()/LockSupport.unpark()鎿嶄綔錛屽彲浠ュ皢褰撳墠綰跨▼鏀懼叆涓涓瓑寰呭垪琛ㄦ垨灝嗕竴涓嚎紼嬩粠榪欎釜絳夊緟鍒楄〃涓敜閱掋傜劧鑰岃繖涓猵ark/unpark鐨勭瓑寰呭垪琛ㄦ槸涓涓叏灞鐨勭瓑寰呭垪琛紝鍦╱npartk鐨勬椂鍊欒繕鏄渶瑕佹彁渚涢渶瑕佸敜閱掔殑Thread瀵硅薄錛屽洜鑰屾垜浠渶瑕佺淮鎶よ嚜宸辯殑絳夊緟鍒楄〃錛屼絾鏄鏋滄垜浠彲浠ョ敤JDK鎻愪緵鐨勫伐鍏風被ConcurrentLinkedQueue錛屽氨闈炲父瀹規槗瀹炵幇錛屽LockSupport鏂囨。涓粰鍑烘潵鐨?a >浠g爜浜嬩緥錛?br />
class FIFOMutex { private final AtomicBoolean locked = new AtomicBoolean( false ); private final Queue < Thread > waiters = new ConcurrentLinkedQueue < Thread > (); public void lock() { boolean wasInterrupted = false ; Thread current = Thread.currentThread(); waiters.add(current); // Block while not first in queue or cannot acquire lock while (waiters.peek() != current || ! locked.compareAndSet( false , true )) { LockSupport.park( this ); if (Thread.interrupted()) // ignore interrupts while waiting wasInterrupted = true ; } waiters.remove(); if (wasInterrupted) // reassert interrupt status on exit current.interrupt(); } public void unlock() { locked.set( false ); LockSupport.unpark(waiters.peek()); } }
鍦ㄨ浠g爜浜嬩緥涓紝鏈変竴涓嚎紼嬬瓑寰呴槦鍒楀拰閿佹爣璁板瓧孌碉紝姣忔璋冪敤lock鏃跺厛灝嗗綋鍓嶇嚎紼嬫斁鍏ヨ繖涓瓑寰呴槦鍒椾腑錛岀劧鍚庢嬁鍑洪槦鍒楀ご綰跨▼瀵硅薄錛屽鏋滆綰跨▼瀵硅薄姝eソ鏄綋鍓嶇嚎紼嬶紝騫朵笖鎴愬姛
浣跨敤CAS鏂瑰紡璁劇疆locked瀛楁錛堣繖閲岄渶瑕佷袱涓悓鏃舵弧瓚籌紝鍥犱負鍙兘鍑虹幇涓涓嚎紼嬪凡緇忎粠闃熷垪涓Щ闄や簡浣嗚繕娌℃湁unlock錛屾鏃跺彟涓涓嚎紼嬭皟鐢╨ock鏂規硶錛屾鏃墮槦鍒楀ご鐨勭嚎紼嬪氨鏄浜屼釜綰跨▼錛岀劧鑰岀敱浜庣涓涓嚎紼嬭繕娌℃湁unlock鎴栬呮鍦╱nlock錛屽洜鑰岄渶瑕佷嬌鐢–AS鍘熷瓙鎿嶄綔鏉ュ垽鏂槸鍚﹁park錛夛紝琛ㄧず璇ョ嚎紼嬬珵浜夋垚鍔燂紝鑾峰緱閿侊紝鍚﹀垯灝嗗綋鍓嶇嚎紼媝ark錛岃繖閲屼箣鎵浠ヨ鏀懼湪
while寰幆涓紝鍥犱負park鎿嶄綔鍙兘鏃犵悊鐢辮繑鍥?spuriously )錛屽鏂囨。涓粰鍑虹殑鎻忚堪錛?br />
LockSupport.park() public static void park(Object blocker)
Disables the current thread for thread scheduling purposes unless the
permit is available.
If the permit is available then it is consumed and the call returns
immediately; otherwise
the current thread becomes disabled for thread scheduling
purposes and lies dormant until one of three things happens:
Some other thread invokes unpark
with the
current thread as the target; or
Some other thread interrupts
the current thread; or
The call spuriously (that is, for no reason) returns.
This method does not report which of these caused the
method to return. Callers should re-check the conditions which caused
the thread to park in the first place. Callers may also determine,
for example, the interrupt status of the thread upon return.
Parameters: blocker
- the synchronization object responsible for this
thread parkingSince: 1.6 鎴戝湪瀹炵幇鑷繁鐨勭被鏃跺氨琚繖涓?#8220;鏃犵悊鐢辮繑鍥?#8221;鍧戜簡濂戒箙銆傚浜庡凡緇忚幏寰楅攣鐨勭嚎紼嬶紝灝嗚綰跨▼浠庣瓑寰呴槦鍒椾腑縐婚櫎錛岃繖閲岀敱浜嶤oncurrentLinkedQueue鏄嚎紼嬪畨鍏ㄧ殑錛屽洜鑰岃兘淇濊瘉姣忔閮芥槸闃熷垪澶寸殑綰跨▼寰楀埌閿侊紝鍥犺屽湪寰楀埌閿佸寵灝嗛槦鍒楀ご縐婚櫎銆倁nlock閫昏緫姣旇緝綆鍗曪紝鍙渶瑕佸皢locked瀛楁鎵撳紑錛堣緗負false錛夛紝鍞ら啋錛坲npark錛夐槦鍒楀ご鐨勭嚎紼嬪嵆鍙紝鐒跺悗璇ョ嚎紼嬩細緇х畫鍦╨ock鏂規硶鐨剋hile寰幆涓戶緇珵浜塽nlocked瀛楁錛屽茍灝嗗畠鑷繁浠庣嚎紼嬮槦鍒椾腑縐婚櫎琛ㄧず鑾峰緱閿佹垚鍔熴傚綋鐒跺畨鍏ㄨ搗瑙侊紝鏈濂藉湪unlock涓姞鍏ヤ竴浜涢獙璇侀昏緫錛屽瑙i攣鐨勭嚎紼嬪拰鍔犻攣鐨勭嚎紼嬮渶瑕佺浉鍚屻?br /> 鐒惰屾湰鏂囩殑鐩殑鏄嚜宸卞疄鐜頒竴涓狶ock瀵硅薄錛屽嵆鍙嬌鐢ㄤ竴浜涘熀鏈殑鎿嶄綔錛岃屼笉浣跨敤JDK鎻愪緵鐨凙tomic綾誨拰ConcurrentLinkedQueue銆傜被浼肩殑棣栧厛鎴戜滑涔熼渶瑕佷竴涓槦鍒楀瓨鏀劇瓑寰呯嚎紼嬮槦鍒楋紙鍏鉤璧瘋錛屼嬌鐢ㄥ厛榪涘厛鍑洪槦鍒楋級錛屽洜鑰屽厛瀹氫箟涓涓狽ode瀵硅薄鐢ㄤ互鏋勬垚榪欎釜闃熷垪錛?br />
protected static class Node { volatile Thread owner; volatile Node prev; volatile Node next; public Node(Thread owner) { this .owner = owner; this .state = INIT; } public Node() { this (Thread.currentThread()); } }
綆鍗曡搗瑙侊紝闃熷垪澶存槸涓涓搗鐐圭殑placeholder錛屾瘡涓皟鐢╨ock鐨勭嚎紼嬮兘鍏堝皢鑷繁绔炰簤鏀懼叆榪欎釜闃熷垪灝撅紝姣忎釜闃熷垪澶村悗涓涓嚎紼嬶紙Node錛夊嵆鏄幏寰楅攣鐨勭嚎紼嬶紝鎵浠ユ垜浠渶瑕佹湁head Node瀛楁鐢ㄤ互蹇熻幏鍙栭槦鍒楀ご鐨勫悗涓涓狽ode錛岃宼ail Node瀛楁鐢ㄦ潵蹇熸彃鍏ユ柊鐨凬ode錛屾墍浠ュ叧閿湪浜庡浣曠嚎紼嬪畨鍏ㄧ殑鏋勫緩榪欎釜闃熷垪錛屾柟娉曡繕鏄竴鏍風殑錛屼嬌鐢–AS鎿嶄綔錛屽嵆CAS鏂規硶灝嗚嚜宸辮緗垚tail鍊鹼紝鐒跺悗閲嶆柊鏋勫緩榪欎釜鍒楄〃錛?br />
protected boolean enqueue(Node node) { while ( true ) { final Node preTail = tail; node.prev = preTail; if (compareAndSetTail(preTail, node)) { preTail.next = node; return node.prev == head; } } }
鍦ㄥ綋鍓嶇嚎紼婲ode浠ョ嚎紼嬪畨鍏ㄧ殑鏂瑰紡鏀懼叆榪欎釜闃熷垪鍚庯紝lock瀹炵幇鐩稿灝辨瘮杈冪畝鍗曚簡錛屽鏋滃綋鍓峃ode鏄殑鍓嶉┍鏄痟ead錛岃綰跨▼鑾峰緱閿侊紝鍚﹀垯park褰撳墠綰跨▼錛屽鐞唒ark鏃犵悊鐢辮繑鍥炵殑闂錛屽洜鑰屽皢park鏀懼叆while寰幆涓紙璇ュ疄鐜版槸涓涓笉鍙噸鍏ョ殑瀹炵幇錛夛細
public void lock() { // Put the latest node to a queue first, then check if the it is the first node // this way, the list is the only shared resource to deal with Node node = new Node(); if (enqueue(node)) { current = node.owner; } else { while (node.prev != head) { LockSupport.park( this ); // This may return "spuriously"!!, so put it to while } current = node.owner; } }
unlock鐨勫疄鐜伴渶瑕佽冭檻澶氱鎯呭喌錛屽鏋滃綋鍓峃ode(head.next)鏈夊悗椹憋紝閭d箞鐩存帴unpark璇ュ悗椹卞嵆鍙紱濡傛灉娌℃湁錛岃〃紺哄綋鍓嶅凡緇忔病鏈夊叾浠栫嚎紼嬪湪絳夊緟闃熷垪涓紝鐒惰屽湪榪欎釜鍒ゆ柇榪囩▼涓彲鑳戒細鏈夊叾浠栫嚎紼嬭繘鍏ワ紝鍥犺岄渶瑕佺敤CAS鐨勬柟寮忚緗畉ail錛屽鏋滆緗け璐ワ紝琛ㄧず姝ゆ椂鏈夊叾浠栫嚎紼嬭繘鍏ワ紝鍥犺岄渶瑕佸皢璇ユ柊榪涘叆鐨勭嚎紼媢npark浠庤岃鏂拌繘鍏ョ殑綰跨▼鍦ㄨ皟鐢╬ark鍚庡彲浠ョ珛鍗寵繑鍥烇紙榪欓噷鐨凜AS鍜宔nqueue鐨凜AS閮芥槸瀵箃ail鎿嶄綔錛屽洜鑰岃兘淇濊瘉鐘舵佷竴鑷達級錛?br />
public void unlock() { Node curNode = unlockValidate(); Node next = curNode.next; if (next != null ) { head.next = next; next.prev = head; LockSupport.unpark(next.owner); } else { if ( ! compareAndSetTail(curNode, head)) { while (curNode.next == null) { } // Wait until the next available // Another node queued during the time, so we have to unlock that, or else, this node can never unparked unlock(); } else { compareAndSetNext(head, curNode, null ); // Still use CAS here as the head.next may already been changed } } }
鍏蜂綋鐨勪唬鐮佸拰嫻嬭瘯綾誨彲浠ュ弬鑰冩煡鐪?a >榪欓噷銆?br />
鍏跺疄鐩村埌鑷繁鍐欏畬榪欎釜綾誨悗鎵嶇洿鍒拌呭叾瀹炶繖鏄竴涓狹CS閿佺殑鍙樼錛屽洜鑰岃繖涓疄鐜版瘡涓嚎紼媝ark鍦ㄨ嚜韜搴旂殑node涓婏紝鑰岀敱鍓嶄竴涓嚎紼媢npark瀹冿紱鑰孉bstractQueuedSynchronizer鏄疌LH閿侊紝鍥犱負瀹冪殑park鐢卞墠椹辯姸鎬佸喅瀹氾紝铏界劧瀹冧篃鏄敱鍓嶄竴涓嚎紼媢npark瀹冦傚叿浣撳彲浠ュ弬鑰?a >榪欓噷銆?/p>
]]>ReferenceCountSet鏃犻攣瀹炵幇 http://m.tkk7.com/DLevin/archive/2014/12/06/421110.htmlDLevin DLevin Fri, 05 Dec 2014 16:29:00 GMT http://m.tkk7.com/DLevin/archive/2014/12/06/421110.html http://m.tkk7.com/DLevin/comments/421110.html http://m.tkk7.com/DLevin/archive/2014/12/06/421110.html#Feedback 3 http://m.tkk7.com/DLevin/comments/commentRss/421110.html http://m.tkk7.com/DLevin/services/trackbacks/421110.html 闃呰鍏ㄦ枃 ]]> Java Cache緋誨垪涔婥ache姒傝堪鍜孲imple Cache http://m.tkk7.com/DLevin/archive/2013/10/15/404770.htmlDLevin DLevin Tue, 15 Oct 2013 15:46:00 GMT http://m.tkk7.com/DLevin/archive/2013/10/15/404770.html http://m.tkk7.com/DLevin/comments/404770.html http://m.tkk7.com/DLevin/archive/2013/10/15/404770.html#Feedback 1 http://m.tkk7.com/DLevin/comments/commentRss/404770.html http://m.tkk7.com/DLevin/services/trackbacks/404770.html
璁板緱鎴戞渶鏃╂帴瑙ache鏄湪澶у瀛﹁綆楁満緇勬垚鍘熺悊鐨勬椂鍊欙紝鐢變簬CPU鐨勯熷害瑕佽繙澶т簬鍐呭瓨鐨勮鍙栭熷害錛屼負浜嗘彁楂楥PU鐨勬晥鐜囷紝CPU浼氬湪鍐呴儴鎻愪緵緙撳瓨鍖猴紝璇ョ紦瀛樺尯鐨勮鍙栭熷害鍜孋PU鐨勫鐞嗛熷害綾諱技錛孋PU鍙互鐩存帴浠庣紦瀛樺尯涓鍙栨暟鎹紝浠庤岃В鍐矯PU鐨勫鐞嗛熷害鍜屽唴瀛樿鍙栭熷害涓嶅尮閰嶇殑闂銆傜紦瀛樹箣鎵浠ヨ兘瑙e喅榪欎釜闂鏄熀浜庣▼搴忕殑灞閮ㄦу師鐞嗭紝鍗?#8221;紼嬪簭鍦ㄦ墽琛屾椂鍛堢幇鍑哄眬閮ㄦц寰嬶紝鍗沖湪涓孌墊椂闂村唴錛屾暣涓▼搴忕殑鎵ц浠呴檺浜庣▼搴忎腑鐨勬煇涓閮ㄥ垎銆傜浉搴斿湴錛屾墽琛屾墍璁塊棶鐨勫瓨鍌ㄧ┖闂翠篃灞闄愪簬鏌愪釜鍐呭瓨鍖哄煙銆傚眬閮ㄦу師鐞嗗張琛ㄧ幇涓猴細鏃墮棿灞閮ㄦу拰絀洪棿灞閮ㄦс傛椂闂村眬閮ㄦф槸鎸囧鏋滅▼搴忎腑鐨勬煇鏉℃寚浠や竴鏃︽墽琛岋紝鍒欎笉涔呬箣鍚庤鎸囦護鍙兘鍐嶆琚墽琛岋紱濡傛灉鏌愭暟鎹璁塊棶錛屽垯涓嶄箙涔嬪悗璇ユ暟鎹彲鑳藉啀嬈¤璁塊棶銆傜┖闂村眬閮ㄦф槸鎸囦竴鏃︾▼搴忚闂簡鏌愪釜瀛樺偍鍗曞厓錛屽垯涓嶄箙涔嬪悗銆傚叾闄勮繎鐨勫瓨鍌ㄥ崟鍏冧篃灝嗚璁塊棶銆?#8221;鍦ㄥ疄闄呭伐浣滀腑錛孋PU鍏堝悜緙撳瓨鍖鴻鍙栨暟鎹紝濡傛灉緙撳瓨鍖哄凡瀛樺湪錛屽垯璇誨彇緙撳瓨涓殑鏁版嵁錛堝懡涓級錛屽惁鍒欙紙澶辨晥錛夛紝灝嗗唴瀛樹腑鐩稿簲鏁版嵁鍧楄澆鍏ョ紦瀛樹腑錛屼互鎻愰珮鎺ヤ笅鏉ョ殑璁塊棶閫熷害銆傜敱浜庢垚鏈拰CPU澶у皬鐨勯檺鍒訛紝CPU鍙兘鎻愪緵鏈夐檺鐨勭紦瀛樺尯錛屽洜鑰岀紦瀛樺尯鐨勫ぇ灝忔槸琛¢噺CPU鎬ц兘鐨勯噸瑕佹寚鏍囦箣涓銆?br />
浣跨敤緙撳瓨錛屽湪CPU鍚戝唴瀛樻洿鏂版暟鎹椂闇瑕佸鐞嗕竴涓棶棰橈紙鍐欏洖絳栫暐闂錛夛紝鍗矯PU鍦ㄦ洿鏂版暟鎹椂鍙洿鏂扮紦瀛樼殑鏁版嵁錛坵rite back錛屽啓鍥烇紝褰撶紦瀛橀渶瑕佽鏇挎崲鏃舵墠灝嗙紦瀛樹腑鏇存柊鐨勫煎啓鍥炲唴瀛橈級錛岃繕鏄疌PU鍦ㄦ洿鏂版暟鎹椂鍚屾椂鏇存柊緙撳瓨涓拰鍐呭瓨涓殑鏁版嵁錛坵rite through錛屽啓閫氾級銆傚湪鍐欏洖絳栫暐涓紝涓轟簡鍑忓皯鍐呭瓨鍐欐搷浣滐紝緙撳瓨鍧楅氬父榪樿鏈変竴涓剰浣嶏紙dirty bit錛夛紝鐢ㄤ互鏍囪瘑璇ュ潡鍦ㄨ杞藉叆涔嬪悗鏄惁鍙戠敓榪囨洿鏂般傚鏋滀竴涓紦瀛樺潡鍦ㄨ緗崲鍥炲唴瀛樹箣鍓嶄粠鏈鍐欏叆榪囷紝鍒欏彲浠ュ厤鍘誨洖鍐欐搷浣滐紱鍐欏洖鐨勪紭鐐規槸鑺傜渷浜嗗ぇ閲忕殑鍐欐搷浣溿傝繖涓昏鏄洜涓猴紝瀵逛竴涓暟鎹潡鍐呬笉鍚屽崟鍏冪殑鏇存柊浠呴渶涓嬈″啓鎿嶄綔鍗沖彲瀹屾垚銆傝繖縐嶅唴瀛樺甫瀹戒笂鐨勮妭鐪佽繘涓姝ラ檷浣庝簡鑳借楋紝鍥犳棰囬傜敤浜庡祵鍏ュ紡緋葷粺銆傚啓閫氱瓥鐣ョ敱浜庤緇忓父鍜屽唴瀛樹氦浜掞紙鏈変簺CPU璁捐浼氬湪涓棿鎻愪緵鍐欑紦鍐插櫒浠ョ紦瑙fц兘錛夛紝鍥犺屾ц兘杈冨樊錛屼絾鏄畠瀹炵幇綆鍗曪紝鑰屼笖鑳界畝鍗曠殑緇存寔鏁版嵁涓鑷存с?br />
鍦ㄨ蔣浠剁殑緙撳瓨緋葷粺涓紝涓鑸槸涓轟簡瑙e喅鍐呭瓨鐨勮闂熺巼鍜岀鐩樸佺綉緇溿佹暟鎹簱錛堝睘浜庣鐩樻垨緗戠粶璁塊棶錛屽崟鐙垪鍑烘潵鍥犱負瀹冪殑搴旂敤姣旇緝騫挎硾錛夌瓑璁塊棶閫熺巼涓嶅尮閰嶇殑闂錛堝浜庡唴瀛樼紦瀛樼郴緇熸潵璇達級銆備絾鏄敱浜庡唴瀛樺ぇ灝忓拰鎴愭湰鐨勯檺鍒訛紝鎴戜滑鍙堜笉鑳芥妸鎵鏈夌殑鏁版嵁鍏堝姞杞借繘鍐呭瓨鏉ャ傚洜鑰屽CPU涓殑緙撳瓨錛屾垜浠彧鑳藉厛灝嗕竴閮ㄥ垎鏁版嵁淇濆瓨鍦ㄧ紦瀛樹腑銆傛鏃訛紝瀵逛簬緙撳瓨錛屾垜浠竴鑸瑙e喅濡備笅闇姹傦細
浣跨敤緇欏畾Key浠嶤ache涓鍙朧alue鍊箋侰PU鏄氳繃鍐呭瓨鍦板潃鏉ュ畾浣嶅唴瀛樺凡鑾峰彇鐩稿簲鍐呭瓨涓殑鍊鹼紝綾諱技鐨勫湪杞歡Cache涓紝闇瑕侀氳繃鏌愪釜Key鍊兼潵鏍囪瘑鐩稿叧鐨勫箋傚洜鑰屽彲浠ョ畝鍗曠殑璁や負杞歡涓殑Cache鏄竴涓瓨鍌ㄩ敭鍊煎鐨凪ap錛屾瘮濡侴emfire涓殑Region灝辯戶鎵胯嚜Map錛屽彧鏄疌ache鐨勫疄鐜版洿鍔犲鏉傘?/li>
褰撶粰瀹氱殑Key鍦ㄥ綋鍓岰ache涓嶅瓨鍦ㄦ椂錛岀▼搴忓憳鍙互閫氳繃鎸囧畾鐩稿簲鐨勯昏緫浠庡叾浠栨簮錛堝鏁版嵁搴撱佺綉緇滅瓑婧愶級涓姞杞借Key瀵瑰簲鐨刅alue鍊鹼紝鍚屾椂灝嗚鍊艱繑鍥炪傚湪CPU涓紝鍩轟簬紼嬪簭灞閮ㄦу師鐞嗭紝涓鑸槸榛樿鐨勫姞杞芥帴涓嬫潵鐨勪竴孌靛唴瀛樺潡錛岀劧鑰屽湪杞歡涓紝涓嶅悓鐨勯渶姹傛湁涓嶅悓鐨勫姞杞介昏緫錛屽洜鑰岄渶瑕佺敤鎴瘋嚜宸辨寚瀹氬搴旂殑鍔犺澆閫昏緫錛岃屼笖涓鑸潵璇翠篃寰堥毦棰勭煡鎺ヤ笅鏉ヨ璇誨彇鐨勬暟鎹紝鎵浠ュ彧鑳戒竴嬈″彧鍔犺澆涓鏉$邯褰曪紙瀵瑰彲棰勭煡鐨勫満鏅笅褰撶劧鍙互鎵歸噺鍔犺澆鏁版嵁錛屽彧鏄鏃墮渶瑕佹潈琛″綋鍓嶆搷浣滅殑鍝嶅簲鏃墮棿闂錛夈?/li>
鍙互鍚慍ache涓啓鍏ey錛峍alue閿煎錛堟柊澧炵殑綰綍鎴栧鍘熸湁鐨勯敭鍊煎鐨勬洿鏂幫級銆傚氨鍍廋PU鐨勫啓鍥炵瓥鐣ヤ腑鏈夊啓鍥炲拰鍐欓氱瓥鐣ワ紝鏈変簺Cache緋葷粺鎻愪緵浜嗗啓閫氭帴鍙c傚鏋滄病鏈夋彁渚涘啓閫氭帴鍙o紝紼嬪簭鍛橀渶瑕侀澶栫殑閫昏緫澶勭悊鍐欓氱瓥鐣ャ備篃鍙互濡侰PU涓殑Cache涓鏍鳳紝鍙綋鐩稿簲鐨勯敭鍊煎縐誨嚭Cache浠ュ悗錛屽啀灝嗗煎啓鍥炲埌鏁版嵁婧愶紝鍙互鎻愪緵涓涓爣璁頒綅浠ュ喅瀹氳涓嶈鍐欏洖錛堜笉榪囨劅瑙夎繖縐嶅疄鐜版瘮杈冨鏉傦紝浠g爜鐨勭殑鑰﹀悎搴︿篃姣旇緝楂橈紝濡傛灉涓烘彁鍗囧啓鐨勯熷害錛岄噰鐢ㄥ紓姝ュ啓鍥炲嵆鍙紝涓洪槻姝㈡暟鎹涪澶憋紝鍙互浣跨敤Queue鏉ュ瓨鍌級銆?/li>
灝嗙粰瀹欿ey鐨勯敭鍊煎縐誨嚭Cache錛堟垨緇欏畾澶氫釜Key浠ユ壒閲忕Щ闄わ紝鐢氳嚦娓呴櫎鏁翠釜Cache錛夈?/li>
閰嶇疆Cache鐨勬渶澶т嬌鐢ㄧ巼錛屽綋Cache瓚呰繃璇ヤ嬌鐢ㄧ巼鏃訛紝鍙厤緗孩鍑虹瓥鐣?
鐩存帴縐婚櫎婧㈠嚭鐨勯敭鍊煎銆傚湪縐婚櫎鏃跺喅瀹氭槸鍚﹁鍐欏洖宸叉洿鏂扮殑鏁版嵁鍒版暟鎹簮銆?/li> 灝嗘孩鍑虹殑婧㈠嚭鐨勯敭鍊煎鍐欏埌紓佺洏涓傚湪鍐欑鐩樻椂闇瑕佽В鍐沖浣曞簭鍒楀寲閿煎錛屽浣曞瓨鍌ㄥ簭鍒楀寲鍚庣殑鏁版嵁鍒扮鐩樹腑錛屽浣曞竷灞紓佺洏瀛樺偍錛屽浣曡В鍐崇鐩樼鐗囬棶棰橈紝濡備綍浠庣鐩樹腑鎵懼洖鐩稿簲鐨勯敭鍊煎錛屽浣曡鍙栫鐩樹腑鐨勬暟鎹茍鏂瑰簭鍒楀寲錛屽浣曞鐞嗙鐩樻孩鍑虹瓑闂銆?/li> 鍦ㄦ孩鍑虹瓥鐣ヤ腑錛岄櫎浜嗗浣曞鐞嗘孩鍑虹殑閿煎闂錛岃繕闇瑕佸鐞嗗浣曢夋嫨婧㈠嚭鐨勯敭鍊煎闂銆傝繖鏈夌偣綾諱技鍐呭瓨鐨勯〉闈㈢疆鎹㈢畻娉曪紙鍏跺疄鍐呭瓨涔熷彲浠ョ湅浣滄槸瀵圭鐩樼殑Cache錛夛紝涓鑸嬌鐢ㄧ殑綆楁硶鏈夛細鍏堣繘鍏堝嚭錛團IFO錛夈佹渶榪戞渶灝戜嬌鐢紙LRU錛夈佹渶灝戜嬌鐢紙LFU錛夈丆lock緗崲錛堢被LRU錛夈佸伐浣滈泦絳夌畻娉曘?/li>
瀵笴ache涓殑閿煎錛屽彲浠ラ厤緗叾鐢熷瓨鏃墮棿錛屼互澶勭悊鏌愪簺閿煎鍦ㄩ暱鏃墮棿涓嶈浣跨敤錛屼絾鏄張娌¤兘婧㈠嚭鐨勯棶棰橈紙鍥犱負婧㈠嚭絳栫暐鐨勯夋嫨鎴栬匔ache娌℃湁鍒版孩鍑洪樁孌碉級錛屼互鎻愬墠閲婃斁鍐呭瓨銆?/li>
瀵規煇浜涚壒瀹氱殑閿煎錛屾垜浠笇鏈涘畠鑳戒竴鐩寸暀鍦ㄥ唴瀛樹腑涓嶈婧㈠嚭錛屾湁浜汣ache緋葷粺鎻愪緵PIN閰嶇疆錛堝姩鎬佹垨闈欐侊級錛屼互紜繚璇ラ敭鍊煎涓嶄細琚孩鍑恒?/li>
鎻愪緵Cache鐘舵併佸懡涓巼絳夌粺璁′俊鎭紝濡傜鐩樺ぇ灝忋丆ache澶у皬銆佸鉤鍧囨煡璇㈡椂闂淬佹瘡縐掓煡璇㈡鏁般佸唴瀛樺懡涓鏁般佺鐩樺懡涓鏁扮瓑淇℃伅銆?/li>
鎻愪緵娉ㄥ唽Cache鐩稿叧鐨勪簨浠跺鐞嗗櫒錛屽Cache鐨勫垱寤恒丆ache鐨勯攢姣併佷竴鏉¢敭鍊煎鐨勬坊鍔犮佷竴鏉¢敭鍊煎鐨勬洿鏂般侀敭鍊煎婧㈠嚭絳変簨浠躲?/li>
鐢變簬寮曞叆Cache鐨勭洰鐨勫氨鏄負浜嗘彁鍗囩▼搴忕殑璇誨啓鎬ц兘錛岃屼笖涓鑸珻ache閮介渶瑕佸湪澶氱嚎紼嬬幆澧冧笅宸ヤ綔錛屽洜鑰屽湪瀹炵幇鏃朵竴鑸渶瑕佷繚璇佺嚎紼嬪畨鍏紝浠ュ強鎻愪緵楂樻晥鐨勮鍐欐ц兘銆?/li>
鍦↗ava涓紝Map鏄渶綆鍗曠殑Cache錛屼負浜嗛珮鏁堢殑鍦ㄥ綰跨▼鐜涓嬌鐢紝鍙互浣跨敤ConcurrentHashMap錛岃繖涔熸鏄垜涔嬪墠鍙備笌鐨勪竴涓」鐩腑鏈寮濮嬬殑瀹炵幇錛堝悗鏉ュ紩鍏HCache錛夈備負浜嗚鎰忔洿鍔犳竻鏅般佷繚鎸佹帴鍙g殑綆鍗曪紝涓嬮潰鎴戝疄鐜頒簡涓涓熀浜嶮ap鐨勬渶綆鍗曠殑Cache緋葷粺錛岀敤浠ユ紨紺篊ache鐨勫熀鏈嬌鐢ㄦ柟寮忋傜敤鎴峰彲浠ュ悜瀹冩彁渚涙暟鎹佹煡璇㈡暟鎹佸垽鏂粰瀹欿ey鐨勫瓨鍦ㄦс佺Щ闄ょ粰瀹氱殑Key(s)銆佹竻闄ゆ暣涓狢ache絳夋搷浣溿備互涓嬫槸Cache鐨勬帴鍙e畾涔夈?br />
public interface Cache<K, V> {
public String getName();
public V get(K key);
public Map<? extends K, ? extends V> getAll(Iterator<? extends K> keys);
public boolean isPresent(K key);
public void put(K key, V value);
public void putAll(Map<? extends K, ? extends V> entries);
public void invalidate(K key);
public void invalidateAll(Iterator<? extends K> keys);
public void invalidateAll();
public boolean isEmpty();
public int size();
public void clear();
public Map<? extends K, ? extends V> asMap();
}
榪欎釜綆鍗曠殑Cache瀹炵幇鍙槸瀵笻ashMap鐨勫皝瑁咃紝涔嬫墍浠ラ夋嫨HashMap鑰屼笉鏄疌oncurrentHashMap鏄洜涓哄湪ConcurrentHashMap鏃犳硶瀹炵幇getAll()鏂規硶錛涘茍涓旇繖閲屾墍鏈夌殑鎿嶄綔鎴戦兘鍔犻攣浜嗭紝鍥犺屼篃涓嶉渶瑕丆oncurrentHashMap鏉ヤ繚璇佺嚎紼嬪畨鍏ㄩ棶棰橈紱涓轟簡鎻愬崌鎬ц兘錛屾垜浣跨敤浜嗚鍐欓攣錛屼互鎻愬崌騫跺彂鏌ヨ鎬ц兘銆傚洜涓轟唬鐮佹瘮杈冪畝鍗曪紝鎵浠ユ妸鎵鏈変唬鐮侀兘璐翠笂浜嗭紙鎳掑緱鏁寸悊浜嗐傘傘傘傦級銆?br />
public class CacheImpl<K, V> implements Cache<K, V> {
private final String name;
private final HashMap<K, V> cache;
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock readLock = lock.readLock();
private final Lock writeLock = lock.writeLock();
public CacheImpl(String name) {
this .name = name;
cache = new HashMap<K, V>();
}
public CacheImpl(String name, int initialCapacity) {
this .name = name;
cache = new HashMap<K, V>(initialCapacity);
}
public String getName() {
return name;
}
public V get(K key) {
readLock.lock();
try {
return cache.get(key);
} finally {
readLock.unlock();
}
}
public Map<? extends K, ? extends V> getAll(Iterator<? extends K> keys) {
readLock.lock();
try {
Map<K, V> map = new HashMap<K, V>();
List<K> noEntryKeys = new ArrayList<K>();
while (keys.hasNext()) {
K key = keys.next();
if (isPresent(key)) {
map.put(key, cache.get(key));
} else {
noEntryKeys.add(key);
}
}
if (!noEntryKeys.isEmpty()) {
throw new CacheEntriesNotExistException(this , noEntryKeys);
}
return map;
} finally {
readLock.unlock();
}
}
public boolean isPresent(K key) {
readLock.lock();
try {
return cache.containsKey(key);
} finally {
readLock.unlock();
}
}
public void put(K key, V value) {
writeLock.lock();
try {
cache.put(key, value);
} finally {
writeLock.unlock();
}
}
public void putAll(Map<? extends K, ? extends V> entries) {
writeLock.lock();
try {
cache.putAll(entries);
} finally {
writeLock.unlock();
}
}
public void invalidate(K key) {
writeLock.lock();
try {
if (!isPresent(key)) {
throw new CacheEntryNotExistsException(this , key);
}
cache.remove(key);
} finally {
writeLock.unlock();
}
}
public void invalidateAll(Iterator<? extends K> keys) {
writeLock.lock();
try {
List<K> noEntryKeys = new ArrayList<K>();
while (keys.hasNext()) {
K key = keys.next();
if (!isPresent(key)) {
noEntryKeys.add(key);
}
}
if (!noEntryKeys.isEmpty()) {
throw new CacheEntriesNotExistException(this , noEntryKeys);
}
while (keys.hasNext()) {
K key = keys.next();
invalidate(key);
}
} finally {
writeLock.unlock();
}
}
public void invalidateAll() {
writeLock.lock();
try {
cache.clear();
} finally {
writeLock.unlock();
}
}
public int size() {
readLock.lock();
try {
return cache.size();
} finally {
readLock.unlock();
}
}
public void clear() {
writeLock.lock();
try {
cache.clear();
} finally {
writeLock.unlock();
}
}
public Map<? extends K, ? extends V> asMap() {
readLock.lock();
try {
return new ConcurrentHashMap<K, V>(cache);
} finally {
readLock.unlock();
}
}
public boolean isEmpty() {
readLock.lock();
try {
return cache.isEmpty();
} finally {
readLock.unlock();
}
}
}
鍏剁畝鍗曠殑浣跨敤鐢ㄤ緥濡備笅錛?
@Test
public void testCacheSimpleUsage() {
Book uml = bookFactory.createUMLDistilled();
Book derivatives = bookFactory.createDerivatives();
String umlBookISBN = uml.getIsbn();
String derivativesBookISBN = derivatives.getIsbn();
Cache<String, Book> cache = cacheFactory.create("book-cache");
cache.put(umlBookISBN, uml);
cache.put(derivativesBookISBN, derivatives);
Book fetchedBackUml = cache.get(umlBookISBN);
System.out.println(fetchedBackUml);
Book fetchedBackDerivatives = cache.get(derivativesBookISBN);
System.out.println(fetchedBackDerivatives);
}
]]> Map deserialize from String http://m.tkk7.com/DLevin/archive/2011/09/20/359078.htmlDLevin DLevin Tue, 20 Sep 2011 07:54:00 GMT http://m.tkk7.com/DLevin/archive/2011/09/20/359078.html http://m.tkk7.com/DLevin/comments/359078.html http://m.tkk7.com/DLevin/archive/2011/09/20/359078.html#Feedback 0 http://m.tkk7.com/DLevin/comments/commentRss/359078.html http://m.tkk7.com/DLevin/services/trackbacks/359078.html 1 public class MapDeserialize { 2 public static void main(String[] args) { 3 Map< String, String > map = new HashMap < String, String > (); 4 map.put(" key1 " , " value1 " ); 5 map.put(" key2 " , null ); 6 map.put(" key3 " , "" ); 7 8 System.out.println(map); 9 10 Map< String, String > emptyMap = new HashMap < String, String > (); 11 System.out.println(emptyMap);12 13 MapDeserialize deserialize = new MapDeserialize(); 14 String str1 = " {key3=, key2=null, key1=value1} " ; 15 String str2 = " {} " ; 16 Map< String, String > map1 = deserialize.str2Map(str1); 17 System.out.println(" map1: " + map1); 18 Map< String, String > map2 = deserialize.str2Map(str2); 19 System.out.println(" map2: " + map2); 20 }21 22 // We are assuming that the str is generated by map.toString(), so the str will be something like: 23 // '{key3=, key2=null, key1=value1}' or '{}' 24 public Map < String, String > str2Map(String str) { 25 Map< String, String > map = new HashMap < String, String > (); 26 // The parameters map is empty 27 if ( " {} " .equals(str) || str == null || str.length() == 0 ) { 28 return map; 29 }30 31 // Remove the '{' prefix and '}' suffix 32 str = str.substring( 1 , str.length() - 1 ); 33 String[] entries = str.split( " , " ); 34 for (String entry : entries) { 35 String[] pair = entry.split( " = " ); 36 String key = pair[ 0 ].trim(); 37 if (pair.length == 1 ) { 38 map.put(key, "" ); 39 } else { 40 String value = pair[ 1 ].trim(); 41 if ( " null " .equals(value)) { 42 map.put(key, null ); 43 } else { 44 map.put(key, value);45 }46 }47 }48 49 return map; 50 }51 } 榪欐浠g爜璨屼技娌′粈涔堜環鍊鹼紝鍙槸淇濈暀鐫錛屼互鍚庡啀閬囧埌鐩稿簲鐨勬儏鍐碉紝鍙互鍐嶅仛鏀硅繘銆? ]]>StopWatch綾?/title> http://m.tkk7.com/DLevin/archive/2011/07/08/353922.htmlDLevin DLevin Fri, 08 Jul 2011 03:05:00 GMT http://m.tkk7.com/DLevin/archive/2011/07/08/353922.html http://m.tkk7.com/DLevin/comments/353922.html http://m.tkk7.com/DLevin/archive/2011/07/08/353922.html#Feedback 0 http://m.tkk7.com/DLevin/comments/commentRss/353922.html http://m.tkk7.com/DLevin/services/trackbacks/353922.html 1/** *//** 2 * 鍦–#涓彁渚涗簡涓涓笓闂ㄧ敤浜庣畝鍗曟祴璇曡繍琛屾椂闂寸殑綾籗topWatch錛?nbsp; 3&nb... 闃呰鍏ㄦ枃 ]]>
主站蜘蛛池模板:
亚洲无人区码一二三码区别图片 |
久久久久亚洲AV无码专区首 |
四虎影院免费视频 |
四虎永久在线精品免费影视 |
亚洲国产一成久久精品国产成人综合 |
337p日本欧洲亚洲大胆裸体艺术 |
亚洲国产精品婷婷久久 |
男人的天堂av亚洲一区2区 |
拍拍拍无挡免费视频网站 |
三年片在线观看免费大全 |
亚洲一区精品伊人久久伊人 |
亚洲人成7777影视在线观看 |
尤物视频在线免费观看 |
97碰公开在线观看免费视频 |
亚洲一区视频在线播放 |
免费无码作爱视频 |
国产一级淫片免费播放 |
特级毛片全部免费播放a一级 |
免费A级毛片无码A∨免费 |
亚洲国产成人久久笫一页 |
youjizz亚洲 |
国产精品免费一区二区三区四区 |
日韩电影免费在线观看视频 |
在线观看亚洲一区二区 |
国产高清对白在线观看免费91 |
国产1024精品视频专区免费 |
亚洲午夜精品久久久久久app |
免费亚洲视频在线观看 |
亚洲欧美自偷自拍另类视 |
无码国产精品一区二区免费式影视
|
人禽伦免费交视频播放 |
亚洲一区二区三区香蕉 |
黄页视频在线观看免费 |
亚洲国产成人一区二区三区 |
一级毛片成人免费看a |
日本免费网站观看 |
国产精品玖玖美女张开腿让男人桶爽免费看
|
十九岁在线观看免费完整版电影 |
亚洲色无码专区在线观看 |
久久久久av无码免费网 |
亚洲av永久无码精品三区在线4 |