精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

原來這就是比 ThreadLocal 更快的玩意

開發(fā) 后端
根據(jù)傳入構(gòu)造 FastThreadLocal 生成的唯一 index 可以直接從 Object 數(shù)組里面找到下標(biāo)并且進(jìn)行替換,這樣一來壓根就不會(huì)產(chǎn)生沖突,邏輯很簡(jiǎn)單,完美。

[[421387]]

本文轉(zhuǎn)載自微信公眾號(hào)「yes的練級(jí)攻略」,作者是Yes呀。轉(zhuǎn)載本文請(qǐng)聯(lián)系yes的練級(jí)攻略公眾號(hào)。

你好,我是yes。

繼上一篇之后我把 ThreadLocal 能問的,都寫了,咱們?cè)賮肀P一盤 FastThreadLocal ,這個(gè)算是 ThreadLocal 的進(jìn)階版,是 Netty 針對(duì) ThreadLocal 自己造的輪子,所以對(duì) ThreadLocal 沒有完全理解的話,建議先看上一篇文章,打個(gè)基礎(chǔ)。

那了解 FastThreadLocal 之后呢,對(duì)平日的一些優(yōu)化可能可以提供一些思路,或者面試就能裝個(gè)x。

面試官:ThreadLocal 竟然有xxx這個(gè)缺點(diǎn),那怎么優(yōu)化啊?

你就把 FastThreadLocal 的實(shí)現(xiàn) BB 一遍,這不就穩(wěn)妥了嘛!

所以,今天我們就來看看 Netty 是如何實(shí)現(xiàn) FastThreadLocal 的,話不多說,本文大綱如下:

  • 數(shù)數(shù) ThreadLocal 的缺點(diǎn)。
  • 應(yīng)該如何針對(duì) ThreadLocal 缺點(diǎn)改進(jìn)?
  • FastThreadLocal 的原理。
  • FastThreadLocal VS ThreadLocal 的實(shí)操。

這篇下來,進(jìn)階版 ThreadLocal 基本拿下,下篇我會(huì)基于這篇做一個(gè)延伸,一個(gè)比較底層的延伸,屬于絕對(duì)裝x的那種,等下看文章你就知道了,我會(huì)埋坑的,哈哈。

預(yù)告一下,這篇是個(gè)長(zhǎng)文,源碼也有點(diǎn)多,但是耐心看完肯定會(huì)有收獲的。

發(fā)車發(fā)車!

數(shù)數(shù) ThreadLocal 的缺點(diǎn)

看完上篇文章的同學(xué),應(yīng)該都很清楚了 ThreadLocal 的一個(gè)缺點(diǎn):hash 沖突用的是線性探測(cè)法,效率低。

可以看到,圖上顯示的是經(jīng)過兩個(gè)遍歷找到了空位,假設(shè)沖突多了,需要遍歷的次數(shù)就多了。并且下次 get 的時(shí)候,hash 直接命中的位置發(fā)現(xiàn)不是要找的 Entry ,于是就接著遍歷向后找,所以說這個(gè)效率低。

而像 HashMap 是通過鏈表法來解決沖突,并且為了防止鏈表過長(zhǎng)遍歷的開銷變大,在一定條件之后又會(huì)轉(zhuǎn)變成紅黑樹來查找,這樣的解決方案在頻繁沖突的條件下,肯定是優(yōu)于線性探測(cè)法,所以這是一個(gè)優(yōu)化方向。

不過 FastThreadLocal 不是這樣優(yōu)化的,我們下面再說。

還有一個(gè)缺點(diǎn)是 ThreadLocal 使用了 WeakReference 以保證資源可以被釋放,但是這可能會(huì)產(chǎn)生一些 Etnry 的 key 為 null,即無用的 Entry 存在。

所以調(diào)用 ThreadLocal 的 get 或 set 方法時(shí),會(huì)主動(dòng)清理無用的 Entry,減輕內(nèi)存泄漏的發(fā)生。

這其實(shí)等于把清理的開銷弄到了 get 和 set 上,萬一 get 的時(shí)候清理的無用 Entry 特別多,那這次 get 相對(duì)而言就比較慢了。

還有一個(gè)就是內(nèi)存泄漏的問題了,當(dāng)然這個(gè)問題只存在于用線程池使用的時(shí)候,并且上面也提到了 get 和 set 的時(shí)候也能清理一些無用的 Key,所以沒有那么的夸張,只要記得用完后調(diào)用 ThreadLocal#remove 就不會(huì)有內(nèi)存泄漏的問題了。

大致就這么幾點(diǎn)。

應(yīng)該如何針對(duì) ThreadLocal 缺點(diǎn)改進(jìn)

所以怎么改呢?

前面提到 ThreadLocal hash 沖突的線性探測(cè)法不好,還有 Entry 的弱引用可能會(huì)發(fā)生內(nèi)存泄漏,這些都和 ThreadLocalMap 有關(guān),所以需要搞個(gè)新的 map 來替換 ThreadLocalMap。

而這個(gè) ThreadLocalMap 又是 Thread 里面的一個(gè)成員變量,這么一看 Thread 也得動(dòng)一動(dòng),但是我們又無法修改 Thread 的代碼,所以配套的還得弄個(gè)新的 Thread。

所以我們不僅得弄個(gè)新的 ThreadLocal、ThreadLocalMap 還得弄個(gè)配套的 Thread 來用上新的 ThreadLocalMap 。

所以如果想改進(jìn) ThreadLocal ,就需要?jiǎng)舆@三個(gè)類。

對(duì)應(yīng)到 Netty 的實(shí)現(xiàn)就是 FastThreadLocal、InternalThreadLocalMap、FastThreadLocalThread

然后發(fā)散一下思維,既然 Hash 沖突的想線性探測(cè)效果不好,你可能比較容易想到的就是上面提到的鏈表法,然后再基于鏈表法說個(gè)改成紅黑樹,這個(gè)確實(shí)是一方面,但是可以再想想。

比如,讓 Hash 不沖突,所以設(shè)計(jì)一個(gè)不會(huì)沖突的 hash 算法?不存在的!

所以怎么樣才不會(huì)產(chǎn)生沖突呢?

各自取號(hào)入座

什么意思?就是每往 InternalThreadLocalMap 中塞入一個(gè)新的 FastThreadLocal 對(duì)象,就給這個(gè)對(duì)象發(fā)個(gè)唯一的下標(biāo),然后讓這個(gè)對(duì)象記住這個(gè)下標(biāo),到時(shí)候去 InternalThreadLocalMap 找 value 的時(shí)候,直接通過下標(biāo)去取對(duì)應(yīng)的 value 。

這樣不就不會(huì)沖突了?

這就是 FastThreadLocal 給出的方案,具體下面分析。

還有個(gè)內(nèi)存泄漏的問題,這個(gè)其實(shí)只要規(guī)范的使用即用完后 remove 就好了,其實(shí)也沒太好的解決方案,不過 FastThreadLocal 曲線救國(guó)了一下,這個(gè)也且看下面的分析!

FastThreadLocal 的原理

以下 Netty 基于 4.1 版本分析

先來看下 FastThreadLocal 的定義:

可以看到有個(gè)叫 variablesToRemoveIndex 的類成員,并且用 final 修飾的,所以等于每個(gè) FastThreadLocal 都有個(gè)共同的不可變 int 值,值為多少等下分析。

然后看到這個(gè) index 沒,在 FastThreadLocal 構(gòu)造的時(shí)候就被賦值了,且也被 final 修飾,所以也不可變,這個(gè) index 就是我上面說的給每個(gè)新 FastThreadLocal 都發(fā)個(gè)唯一的下標(biāo),這樣每個(gè) index 就都知道自己的位置了。

上面兩個(gè) index 都是通過 InternalThreadLocalMap.nextVariableIndex() 賦值的,盲猜一下,這個(gè)肯定是用原子類遞增實(shí)現(xiàn)的。

我們來看一下實(shí)現(xiàn):

確實(shí),在 InternalThreadLocalMap 也定義了一個(gè)靜態(tài)原子類,每次調(diào)用 nextVariableIndex 就返回且遞增,沒有什么別的賦值操作,從這里也可以得知 variablesToRemoveIndex 的值為 0,因?yàn)樗鼘儆诔A抠x值,第一次調(diào)用時(shí) nextIndex 的值為 0 。

看到這,不知道大家是否已經(jīng)感覺到一絲不對(duì)勁了。好像有點(diǎn)浪費(fèi)空間的意思,我們繼續(xù)往下看。

InternalThreadLocalMap 對(duì)標(biāo)的就是之前的 ThreadLocalMap 也就是 ThreadLocal 缺點(diǎn)集中的類,需要重點(diǎn)看下。

我們?cè)賮砘仡櫼幌?ThreadLocalMap 的定義。

它是個(gè) Entry 數(shù)組,然后 Entry 里面弱引用了 ThreadLocal 作為 Key。

而 InternalThreadLocalMap 有點(diǎn)不太一樣:

可以看到, InternalThreadLocalMap 好像放棄了 map 的形式,沒用定義 key 和 value,而是一個(gè) Object 數(shù)組?

那它是如何通過 Object 來存儲(chǔ) FastThreadLocal 和對(duì)應(yīng)的 value 的呢?我們從 FastThreadLocal#set 開始分析:

因?yàn)槲覀円呀?jīng)熟悉 ThreadLocal 的套路,所以我們知道 InternalThreadLocalMap 肯定是 FastThreadLocalThread 里面的一個(gè)變量。

然后我們從對(duì)應(yīng)的 FastThreadLocalThread 里面拿到了 map 之后,就要執(zhí)行塞入操作即 setKnownNotUnset。

我們先看一下塞入操作里面的 setIndexedVariable 方法:

可以看到,根據(jù)傳入構(gòu)造 FastThreadLocal 生成的唯一 index 可以直接從 Object 數(shù)組里面找到下標(biāo)并且進(jìn)行替換,這樣一來壓根就不會(huì)產(chǎn)生沖突,邏輯很簡(jiǎn)單,完美。

那如果塞入的 value 不是 UNSET(默認(rèn)值),則執(zhí)行 addToVariablesToRemove 方法,這個(gè)方法又有什么用呢?

是不是看著有點(diǎn)奇怪?這是啥操作?別急,看我畫個(gè)圖來解釋解釋:

這就是 Object 數(shù)組的核心關(guān)系圖了,第一個(gè)位置放了一個(gè) set ,set 里面存儲(chǔ)了所有使用的 FastThreadLocal 對(duì)象,然后數(shù)組后面的位置都放 value。

那為什么要放一個(gè) set 保存所有使用的 FastThreadLocal 對(duì)象?

用于刪除,你想想看,假設(shè)現(xiàn)在要清空線程里面的所有 FastThreadLocal ,那必然得有一個(gè)地方來存放這些 FastThreadLocal 對(duì)象,這樣才能找到這些家伙,然后干掉。

所以剛好就把數(shù)組的第一個(gè)位置騰出來放一個(gè) set 來保存這些 FastThreadLocal 對(duì)象,如果要?jiǎng)h除全部 FastThreadLocal 對(duì)象的時(shí)候,只需要遍歷這個(gè) set ,得到 FastThreadLocal 的 index 找到數(shù)組對(duì)應(yīng)的 位置將 value 置空,然后把 FastThreadLocal 從 set 中移除即可。

剛好 FastThreadLocal 里面實(shí)現(xiàn)了這個(gè)方法,我們來看下:

圖片內(nèi)容可能有點(diǎn)多了,我們做下小結(jié),理一理上面說的:

首先 InternalThreadLocalMap 沒有采用 ThreadLocalMap k-v形式的存儲(chǔ)方式,而是用 Object 數(shù)組來存儲(chǔ) FastThreadLocal 對(duì)象和其 value,具體是在第一個(gè)位置存放了一個(gè)包含所使用的 FastThreadLocal 對(duì)象的 set,然后后面存儲(chǔ)所有的 value。

之所以需要個(gè) set 是為了存儲(chǔ)所有使用的 FastThreadLocal 對(duì)象,這樣就能找到這些對(duì)象,便于后面的刪除工作。

之所以數(shù)組其他位置可以直接存儲(chǔ) value ,是因?yàn)槊總€(gè) FastThreadLocal 構(gòu)造的時(shí)候已經(jīng)被分配了一個(gè)唯一的下標(biāo),這個(gè)下標(biāo)對(duì)應(yīng)的就是 value 所處的下標(biāo)。

看到這里,不知道大家是否有感受到空間的浪費(fèi)?

我舉個(gè)例子。

假設(shè)系統(tǒng)里面一個(gè) new 了 100 個(gè) FastThreadLocal ,那第 100 個(gè) FastThreadLocal 的下標(biāo)就是 100 ,這個(gè)應(yīng)該沒有疑義。

從上面的 set 方法可以得知,只有調(diào)用 set 的時(shí)候,才會(huì)從當(dāng)前線程中拿出 InternalThreadLocalMap ,然后往這個(gè) map 的數(shù)組里面塞入 value,這里我們?cè)倩仡櫼幌?set 的方法。

那這里是什么意思呢?

如果我這個(gè)線程之前都沒塞過 FastThreadLocal ,此時(shí)要塞入第一個(gè) FastThreadLocal ,構(gòu)造出來的數(shù)組長(zhǎng)度是32,但是這個(gè) FastThreadLocal 的下標(biāo)已經(jīng)漲到了 100 了,所以這個(gè)線程第一次塞值,也僅僅只有這么一個(gè)值,數(shù)組就需要擴(kuò)容。

看到?jīng)],這就是我所說的浪費(fèi),空間被浪費(fèi)了。

Netty 相關(guān)實(shí)現(xiàn)者知道這樣會(huì)浪費(fèi)空間,所以數(shù)組的擴(kuò)容是基于 index 而不是原先數(shù)組的大小,你看看如果是基于原先數(shù)組的擴(kuò)容,那么第一次擴(kuò)容 2 倍,32 變成 64,還是塞不下下標(biāo) 100 的數(shù)據(jù),所以還得擴(kuò)容一次,這就不美了。

所以可以看到擴(kuò)容傳進(jìn)去的參數(shù)是 index 。

可以看到,直接基于 index 的向上 2 次冪取整。然后就是擴(kuò)容的拷貝,這里是直接進(jìn)行數(shù)組拷貝,不需要進(jìn)行 rehash,而 ThreadLocalMap 的擴(kuò)容需要進(jìn)行rehash,也就是重新基于 key 的 hash 值進(jìn)行位置的分配,所以這個(gè)也是 FastThreadLocal 優(yōu)于ThreadLocal 的一個(gè)點(diǎn)。

對(duì)了,上面那個(gè)向上 2 次冪取整的操作,不知道你們熟悉不熟悉,這個(gè)和 HashMap 的實(shí)現(xiàn)是一致的。

咳咳,但是我沒有證據(jù),只能說優(yōu)秀的代碼,就是源遠(yuǎn)流長(zhǎng)。

所以從上面的實(shí)現(xiàn)可以得知 Netty 就是特意這樣設(shè)計(jì)的,用多余的空間去換取不會(huì)沖突的 set 和 get ,這樣寫入和獲取的速度就更快了,這就是典型的空間換時(shí)間。

好了,想必此時(shí)你已經(jīng)弄懂了 FastThreadLocal 的核心原理了,我們?cè)賮砜纯?get 方法的實(shí)現(xiàn),我想你應(yīng)該能腦補(bǔ)這個(gè)實(shí)現(xiàn)了。

是吧,沒啥難度,index 就是 FastThreadLocal 構(gòu)造時(shí)候預(yù)先分配好的那個(gè)下標(biāo),然后直接進(jìn)行一個(gè)數(shù)組下標(biāo)查找,如果沒找到就調(diào)用 init 方法進(jìn)行初始化。

我們這里再繼續(xù)探究一下InternalThreadLocalMap.get(),這里面做了一個(gè)兼容。不過我要先介紹一下 FastThreadLocalThread ,就是這玩意替代了 Thread。

可以看到它繼承了 Thread ,并且弄了一個(gè)成員變量就是我們前面說的 InternalThreadLocalMap。

然后我們?cè)賮砜匆幌?get 方法,我截了好幾個(gè),不過邏輯很簡(jiǎn)單。

這里之所以分了 fastGet 和 slowGet 是為了做一個(gè)兼容,假設(shè)有個(gè)不熟悉的人,他用了 FastThreadLocal 但是沒有配套使用 FastThreadLocalThread ,然后調(diào)用 FastThreadLocal#get 的時(shí)候去 Thread 里面找 InternalThreadLocalMap 那不就傻了嗎,會(huì)報(bào)錯(cuò)的。

所以就再弄了個(gè) slowThreadLocalMap ,它是個(gè) ThreadLocal ,里面保存 InternalThreadLocalMap 來兼容一下這個(gè)情況。

從這里我們也能得知,F(xiàn)astThreadLocal 最好和 FastThreadLocalThread 配套使用,不然就隔了一層了。

  1. FastThreadLocal<String> threadLocal = new FastThreadLocal<String>(); 
  2. Thread t = new FastThreadLocalThread(new Runnable() { //記得要 new FastThreadLocalThread 
  3.      public void run() { 
  4.       threadLocal.get(); 
  5.       .... 
  6.      } 
  7.  }); 

好了,get 和 set 這兩個(gè)核心操作都分析完了,我們最后再來看一下 remove 操作吧。

很簡(jiǎn)單對(duì)吧,把數(shù)組里的 value 給覆蓋了,然后再到 set 里把對(duì)應(yīng)的 FastThreadLocal 對(duì)象給刪了。

不過看到這里,可能有人會(huì)發(fā)出疑惑,內(nèi)存泄漏相關(guān)的點(diǎn)呢?

其實(shí)吧,可以看到 FastThreadLocal 就沒用弱引用,所以它把無用 FastThreadLocal 的清理就寄托到規(guī)范使用上,即沒用了就主動(dòng)調(diào)用 remove 方法。

但是它曲線救國(guó)了一下,我們來看一下 FastThreadLocalRunnable 這個(gè)類:

我已經(jīng)把重點(diǎn)畫出來了,可以看到這個(gè) Runnable 執(zhí)行完畢之后,會(huì)主動(dòng)調(diào)用 FastThreadLocal.removeAll() 來清理所有的 FastThreadLocal,這就是我說的曲線救國(guó),怕你完了調(diào)用 remove ,沒事我?guī)湍惴庋b一下,就是這么貼心。

當(dāng)然,這個(gè)前提是你不能用 Runnable 而是用 FastThreadLocalRunnable。不過這里 Netty 也是做了封裝的。

Netty 實(shí)現(xiàn)了一個(gè) DefaultThreadFactory 工廠類來創(chuàng)建線程。

你看,你傳入 Runnable 是吧,沒事,我把它包成 FastThreadLocalRunnable,并且我 new 回去的線程是 FastThreadLocalThread 類型,這樣就能在很大程度上避免使用的錯(cuò)誤,也減少了使用的難度。

這也是工廠方法這個(gè)設(shè)計(jì)模式的好處之一啦。所以工程上如果怕對(duì)方?jīng)]用對(duì),我們就封裝了再給別人使用,這樣也屏蔽了一些細(xì)節(jié),他好你也好。

所以說多看看開源框架的源碼,有很多可以學(xué)習(xí)的地方!好了,F(xiàn)astThreadLocal 原理大致就說到這里。

FastThreadLocal VS ThreadLocal

到此,我們已經(jīng)充分了解了兩者之間的不同,但是 Fast 到底有多 Fast 呢?

我們用實(shí)驗(yàn)說話,Netty 源碼里面已經(jīng)有 benchmark 了,我們直接跑就行了

里面有兩個(gè)實(shí)驗(yàn):

FastPath 對(duì)應(yīng)的是使用 FastThreadLocalThread 線程對(duì)象。

SlowPath 對(duì)應(yīng)的是使用 Thread 線程對(duì)象。

兩個(gè)實(shí)驗(yàn)都是分別定義了 ThreadLocal 和 FastThreadLocal :

我們來看一下執(zhí)行的結(jié)果:

FastPath:

SlowPath:

可以看到搭配 FastThreadLocalThread 來使用 FastThreadLocal 吞吐確實(shí)比使用 ThreadLocal 大,但是好像也沒大太多?

不過,我在網(wǎng)上有看別比人的 benchmark 對(duì)比,同樣的代碼,他的結(jié)果是大了三倍。

我反正又跑了幾遍,每次都比原生的 ThreadLocal 吞吐好,但是也沒好那么多...有點(diǎn)奇怪。

至于 FastThreadLocal 搭配 Thread 則吞吐比 ThreadLocal 都少,說明 FastThreadLocal 的使用必須得搭配 FastThreadLocalThread ,不然就是反向優(yōu)化了。

代碼在 netty 的 microbench 這個(gè)項(xiàng)目里,有興趣的可以自己 down 下來跑一跑看看。

最后

我們?cè)賮砜偨Y(jié)一下:

  • FastThreadLocal 通過分配下標(biāo)直接定位 value ,不會(huì)有 hash 沖突,效率較高。
  • FastThreadLocal 采用空間換時(shí)間的方式來提高效率。
  • FastThreadLocal 需要配套 FastThreadLocalThread 使用,不然還不如原生 ThreadLocal。
  • FastThreadLocal 使用最好配套 FastThreadLocalRunnable,這樣執(zhí)行完任務(wù)后會(huì)主動(dòng)調(diào)用 removeAll 來移除所有 FastThreadLocal ,防止內(nèi)存泄漏。
  • FastThreadLocal 的使用也是推薦用完之后,主動(dòng)調(diào)用 remove。

這就是 Netty 實(shí)現(xiàn)的加強(qiáng)版 ThreadLocal,如果你看過 Netty 源碼,你會(huì)發(fā)現(xiàn)內(nèi)部是有挺多使用 ThreadLocal 的場(chǎng)景,所以這個(gè)優(yōu)化還是有必要的。

并且 Netty work 線程池默認(rèn)線程數(shù)是兩倍 CPU 核心數(shù),所以線程不會(huì)太多,那么空間的浪費(fèi)其實(shí)也不會(huì)很多,所以這波空間換時(shí)間影響不大。

好了,文章就到這了。挖個(gè)坑,我在 InternalThreadLocalMap 這個(gè)類里面發(fā)現(xiàn)了一些奇怪的 long 變量。

懂行的同學(xué)看著可能知道,這是為了填充 Cache Line,避免偽共享問題的產(chǎn)生。

ok ,那為什么被標(biāo)記了@deprecated?并且說將來的版本要被移除?

且聽下回分解。

 

責(zé)任編輯:武曉燕 來源: yes的練級(jí)攻略
相關(guān)推薦

2021-06-15 11:16:49

代碼耦合開發(fā)

2020-07-17 19:31:19

PythonR編程

2018-11-08 15:30:04

JavaScriptES6異步

2015-07-21 10:24:02

Windows RT升級(jí)

2014-01-02 14:04:42

2019-01-02 04:40:19

物聯(lián)網(wǎng)企業(yè)IOT

2024-12-13 16:37:56

SpringBootJava

2016-01-12 17:01:45

Bootstrap原因

2015-07-27 10:56:02

2020-02-17 15:55:22

Office 365

2024-04-24 09:47:36

2018-11-01 13:38:51

Java中斷停止

2015-01-09 10:10:00

Linux

2015-09-19 13:45:27

2022-11-21 16:10:31

奔馳可靠性排名

2025-09-01 08:12:37

JavaScrip框架DOM

2021-08-17 13:31:11

加密貨幣區(qū)塊鏈貨幣

2023-07-13 09:00:00

人工智能GPT模型

2021-01-13 10:51:08

PromissetTimeout(函數(shù)

2019-11-27 08:52:13

網(wǎng)易裁員微博
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

九九亚洲视频| 成人看av片| 免费在线亚洲| 日韩大片免费观看视频播放| 91九色在线观看视频| 视频国产在线观看| 免费成人你懂的| 久久不射热爱视频精品| av在线天堂网| a毛片在线观看| 国产99久久久国产精品潘金网站| 久久免费视频在线观看| 中文字幕在线免费看线人| 欧美freesex| 国产精品天干天干在观线| 91精品国产高清久久久久久91裸体 | 超碰在线免费av| 91亚洲天堂| 国产精品中文字幕一区二区三区| 国模精品一区二区三区色天香| 成人免费av片| 欧美亚洲综合视频| 亚洲国产精品人人做人人爽| 蜜桃欧美视频| 一级片免费网站| 国产精品www.| 亚洲国产日韩欧美在线图片 | 欧美日韩激情电影| 91社区在线播放| 国产免费一区视频观看免费 | 亚洲国产精品一区二区www在线| 欧美精品一区二区三区久久| 国产色视频在线| 久久精品导航| 久久99精品视频一区97| 亚洲区自拍偷拍| 精品网站999| 色网综合在线观看| 妞干网视频在线观看| 国产精品久久久久一区二区国产 | 天天做天天摸天天爽国产一区| 视频一区国产精品| 视频一区 中文字幕| 日韩av中文在线观看| 久久久中文字幕| 亚洲精品一区二区三区影院忠贞| 欧美日韩视频免费看| 精品国产91久久久久久| 中文字幕の友人北条麻妃| 国产在线你懂得| 丰满白嫩尤物一区二区| 国产一区二区丝袜| 成人一二三四区| 国产欧美日韩综合一区在线播放| 欧美成人剧情片在线观看| 美女av免费看| 午夜先锋成人动漫在线| 91精品国产一区二区三区香蕉| 99热成人精品热久久66| √8天堂资源地址中文在线| 亚洲精品久久久蜜桃| 伊人色综合久久天天五月婷| 国产三级视频在线看| 久久久久久久久99精品| 久久久久久99| 天天舔天天干天天操| 成人免费毛片嘿嘿连载视频| 亚洲影院色无极综合| 在线亚洲欧美日韩| 奇米色一区二区| 国产成人精品免费视频| 六月丁香激情综合| 翔田千里一区二区| 国产91成人video| 国产女人18毛片水18精| 国产成人精品三级高清久久91| 日韩欧美中文字幕精品| 一本岛在线视频| 91精品国产经典在线观看| 色系网站成人免费| 日本一本二本在线观看| av中文字幕在线观看第一页| 亚洲一卡二卡三卡四卡无卡久久| 91麻豆天美传媒在线| aa在线视频| 一区二区三区四区在线播放| 国产美女作爱全过程免费视频| 国产婷婷视频在线| 亚洲精品国产成人久久av盗摄| 无码人妻aⅴ一区二区三区日本| 免费观看成人高潮| 一区二区三区四区中文字幕| 亚洲人精品午夜射精日韩| 色偷偷色偷偷色偷偷在线视频| 欧美天堂在线观看| 成人在线看视频| 91网址在线看| 国产欧美亚洲精品| 国产精品视频a| 国内精品视频一区二区三区八戒| 成人在线精品视频| 超碰在线人人干| 91日韩在线专区| 伊人精品久久久久7777| 日本三级在线观看网站| 婷婷成人激情在线网| 日韩av播放器| 国产精品亚洲欧美一级在线| 亚洲精品一区二区三区四区高清| 黄色a一级视频| 日韩a一区二区| 欧美国产亚洲精品久久久8v| 天天干天天干天天干天天| 麻豆精品一区二区三区| 成人午夜黄色影院| 日韩精品一二| 亚洲精品老司机| 每日在线更新av| 国模私拍国内精品国内av| 日韩一区二区在线看片| 短视频在线观看| 婷婷激情综合| 日韩av不卡电影| 中文字幕av无码一区二区三区| 免费成人你懂的| 韩日午夜在线资源一区二区| 日本网站在线免费观看视频| 五月婷婷激情综合| 久久久精品高清| 激情av综合| 色av吧综合网| 中文在线第一页| 激情欧美一区二区| 欧美日韩在线精品一区二区三区| 高潮毛片在线观看| 一本久久精品一区二区| 人妻体体内射精一区二区| 精品国产91乱码一区二区三区四区 | 国产美女亚洲精品7777| 日韩电影大片中文字幕| 蜜臀久久精品久久久用户群体| 日韩高清一级片| 欧美xxxx黑人又粗又长密月| 日韩av官网| 91精品国产综合久久婷婷香蕉| 强伦人妻一区二区三区| 黄色在线成人| 51成人做爰www免费看网站| 成人在线免费看| 欧美性xxxx在线播放| 久久精品无码一区二区三区毛片| 天天躁日日躁狠狠躁欧美巨大小说| 久久天堂电影网| 亚洲一区二区三区高清视频| 久久精品免费在线观看| av动漫在线看| 美女网站色精品尤物极品姐弟| 欧美尺度大的性做爰视频| 亚洲一区二区三区高清视频| 91免费看片在线观看| 精品无码国产一区二区三区av| 欧美区一区二区| 久久夜色撩人精品| 国产精品久久久久久久久久久久久久久久久久 | 精品中文字幕一区二区三区| 俺去啦;欧美日韩| 中文字幕精品无码亚| 国产精品卡一卡二| 亚洲欧美日韩一级| 日韩国产欧美| 91精品啪在线观看麻豆免费| 精品美女视频在线观看免费软件| 一本大道综合伊人精品热热| 草草影院第一页| 美女精品网站| 亚洲三区视频| 96视频在线观看欧美| 久久久极品av| 国产欧美一级片| 亚洲综合色自拍一区| www.美色吧.com| 亚洲精品专区| 久久亚洲综合网| 精品欧美日韩精品| 日韩中文字幕第一页| 国产精品久久久久久久成人午夜| 亚洲欧美日本在线| 国产精品久久久久久亚洲av| 国产欧美欧美| 午夜精品短视频| 超碰国产精品一区二页| 色在人av网站天堂精品| 黄色av中文字幕| 亚洲国产日韩在线一区模特| 97人妻天天摸天天爽天天| 视频一区二区三区中文字幕| 亚洲欧洲一区二区福利| 在线免费成人| 97视频在线看| av在线电影播放| 欧美高清视频www夜色资源网| 草视频在线观看| 91蝌蚪porny九色| 色播五月激情五月| 亚洲高清在线| 亚洲一区二区不卡视频| 成人台湾亚洲精品一区二区| 欧美在线视频免费播放| 精品国产丝袜高跟鞋| 亚洲第一精品福利| 国产成人a v| 亚洲精品欧美二区三区中文字幕| 免费不卡av网站| 在线欧美不卡| 亚洲欧美精品| 天天躁日日躁成人字幕aⅴ| 成人免费福利在线| 欧美13videosex性极品| 久久九九热免费视频| 天堂av在线7| 欧美日韩一级黄| 日本高清www免费视频| 国产精品灌醉下药二区| 在线观看国产网站| 国产一区二区导航在线播放| 欧美三级午夜理伦三级| 午夜激情久久| 青青影院一区二区三区四区| 99精品国产一区二区三区2021 | 色香欲www7777综合网| 欧美成人精品在线视频| av网页在线| 亚洲高清免费观看高清完整版| 国产又粗又长视频| 色综合久久88色综合天天| 国产一级二级三级视频| 国产精品久线观看视频| 在线观看日本中文字幕| 成人午夜视频福利| 欧美性受xxxxxx黑人xyx性爽| 国产精品久久久久久久久久妞妞| 狠狠精品干练久久久无码中文字幕| 欧美精品一区二区三区中文字幕| 国产在线精品一区二区中文| 日本在线一区二区三区| 国产欧美在线播放| 99久久亚洲国产日韩美女 | 免费在线黄色网| 中文字幕一区二区不卡| 中文字幕网站在线观看| 91一区二区三区在线观看| 国产sm在线观看| 国产一区二区三区免费播放| www.超碰97.com| 日本系列欧美系列| 成人一级片网站| 美女精品网站| www.日日操| 亚洲欧美日本视频在线观看| 免费在线观看亚洲视频| 在线亚洲自拍| 日本在线观看a| 日韩精品一二三| 午夜免费精品视频| 日日夜夜精品视频天天综合网| 久久精品99国产| 日本亚洲天堂网| 在线看免费毛片| 国产一区二区三区观看| 久久成年人网站| 国精产品一区一区三区mba视频 | 欧美日韩在线观看首页| 国语自产精品视频在免费| 影音先锋男人在线资源| 欧美日韩电影在线观看| 92久久精品| 欧美一级大胆视频| 日韩欧美看国产| 国产精品久久久久久久一区探花 | 香蕉在线观看视频| 成人动漫av在线| 国产精品一区二区入口九绯色| av在线一区二区三区| 亚洲欧美色图视频| 国产欧美一二三区| 亚洲天堂网av在线| 一区二区三区欧美激情| 日韩aaaaaa| 色婷婷久久久综合中文字幕| 一级黄色大片免费| 欧美xxxxxxxxx| 国产激情久久久久久熟女老人av| 亚洲第一福利视频| 国产高清视频在线| 久久精品国产99国产精品澳门| 羞羞视频在线免费国产| 2019中文字幕免费视频| 黄页免费欧美| av一区二区三区免费| 久久综合欧美| 久久久99精品视频| 蜜桃视频一区| 成人三级做爰av| 久久久久久**毛片大全| 亚洲五月激情网| proumb性欧美在线观看| 99精品中文字幕| 色呦呦一区二区三区| 亚洲国产日韩在线观看| 色婷婷av一区二区三区在线观看| 国产激情在线播放| **亚洲第一综合导航网站| 精品国产91| 波多野结衣家庭教师视频| 懂色av中文字幕一区二区三区| 久久精品色妇熟妇丰满人妻| 性做久久久久久| 精品国产18久久久久久| 最近2019年中文视频免费在线观看| 九色porny视频在线观看| 亚洲最大福利网| 久久综合国产| 九色porny91| 2020国产精品| 中文在线观看免费网站| 日韩欧美国产三级电影视频| 69av亚洲| 国产欧美日韩精品丝袜高跟鞋| 免费观看久久av| 97xxxxx| 91在线云播放| 国产精品二区一区二区aⅴ| 日韩一级免费观看| 韩国中文字幕在线| 国产在线观看一区二区三区| 久久视频在线| 最新中文字幕免费视频| 国产日韩欧美a| 无码人妻丰满熟妇精品| 亚洲男人天堂视频| 中文字幕一区久| 久久视频在线观看中文字幕| 中文日韩欧美| 李宗瑞91在线正在播放| 日韩欧亚中文在线| 精品美女视频在线观看免费软件| 欧洲日韩成人av| 最新国产一区| 99视频在线免费| 欧美国产在线观看| 国产精品国产精品国产| 色综合伊人色综合网| 成人黄色91| 日本一本中文字幕| 成人精品国产一区二区4080| 久久久精品视频免费| 亚洲高清久久久久久| 自拍偷拍欧美视频| 日本一区二区三区免费观看| 日本vs亚洲vs韩国一区三区| 毛片久久久久久| 欧美一区二区三区四区五区| 欧美激情成人动漫| 精品国产一区二区三区四区vr| 亚洲一区日本| 麻豆一区在线观看| 日韩一区二区三区四区五区六区| 免费毛片在线看片免费丝瓜视频 | 亚洲日本免费| 日本高清www| 欧美日韩视频在线第一区| 免费a级毛片在线播放| 99r国产精品视频| 国产日韩欧美一区| 国产三级在线观看完整版| 欧美日韩精品福利| 国产偷倩在线播放| 欧美男人的天堂| 国产一区二区三区av电影| 国产精品第108页| 亚洲欧美精品在线| 国产午夜亚洲精品一级在线| 日韩av在线播放不卡| 国产视频一区二区在线| 国产精品久久综合青草亚洲AV| 久久久亚洲精选| 成人在线免费观看网站| 成人免费看片载| 在线视频国内自拍亚洲视频| 18视频在线观看| 蜜桃网站成人| 国产一区不卡在线| 午夜影院免费在线观看| 欧美成人精品在线观看| 伊人久久综合影院| 2020国产精品| 中文在线观看av| 久久久免费在线观看| 日韩av久操| 爱爱的免费视频|