1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        ConcurrentHashMap面試靈魂拷問,你能扛多久?

        共 5140字,需瀏覽 11分鐘

         ·

        2022-04-09 21:18

        來自:blog.csdn.net/zwx900102/article/details/114547968

        前言

        本文從?ConcurrentHashMap?常見的面試問題引入話題,并逐步揭開其設(shè)計原理,相信讀完本文,對面試中的相關(guān)問題會有很大的幫助。
        HashMap 在我們?nèi)粘5拈_發(fā)中使用頻率最高的一個工具類之一,然而使用 HashMap 最大的問題之一就是它是線程不安全的,如果我們想要線程安全應(yīng)該怎么辦呢?這時候就可以選擇使用?ConcurrentHashMap,ConcurrentHashMap?和?HashMap?的功能是基本一樣的,ConcurrentHashMap?是 HashMap 的線程安全版本。
        因?ConcurrentHashMap?和 HashMap 在 jdk1.8 版本中排除線程的安全性方面,其他的設(shè)計都很類似,所以有很多相同的設(shè)計思想本文不會做太多重復(fù)介紹。

        ConcurrentHashMap 原理

        ConcurrentHashMap?是 HashMap 的線程安全版本,其內(nèi)部和 HashMap 一樣,也是采用了數(shù)組 + 鏈表 + 紅黑樹的方式來實現(xiàn)。
        如何實現(xiàn)線程的安全性?加鎖。但是這個鎖應(yīng)該怎么加呢?在?HashTable?中,是直接在 put 和 get 方法上加上了?synchronized,理論上來說?ConcurrentHashMap?也可以這么做,但是這么做鎖的粒度太大,會非常影響并發(fā)性能,所以在?ConcurrentHashMap?中并沒有采用這么直接簡單粗暴的方法,其內(nèi)部采用了非常精妙的設(shè)計,大大減少了鎖的競爭,提升了并發(fā)性能。
        ConcurrentHashMap?中的初始化和 HashMap 中一樣,而且容量也會調(diào)整為 2 的 N 次冪,在這里不做重復(fù)介紹這么做的原因。

        JDK1.8 版本 ConcurrentHashMap 做了什么改進

        在 JDK1.7 版本中,ConcurrentHashMap?由數(shù)組 + Segment + 分段鎖實現(xiàn),其內(nèi)部分為一個個段(Segment)數(shù)組,Segment 通過繼承?ReentrantLock?來進行加鎖,通過每次鎖住一個 segment 來降低鎖的粒度而且保證了每個 segment 內(nèi)的操作的線程安全性,從而實現(xiàn)全局線程安全。下圖就是 JDK1.7 版本中?ConcurrentHashMap?的結(jié)構(gòu)示意圖:
        但是這么做的缺陷就是每次通過 hash 確認(rèn)位置時需要 2 次才能定位到當(dāng)前 key 應(yīng)該落在哪個槽:
        • 通過 hash 值和 段數(shù)組長度-1 進行位運算確認(rèn)當(dāng)前 key 屬于哪個段,即確認(rèn)其在 segments 數(shù)組的位置。
        • 再次通過 hash 值和 table 數(shù)組(即 ConcurrentHashMap 底層存儲數(shù)據(jù)的數(shù)組)長度 - 1進行位運算確認(rèn)其所在桶。
        為了進一步優(yōu)化性能,在 jdk1.8 版本中,對?ConcurrentHashMap?做了優(yōu)化,取消了分段鎖的設(shè)計,取而代之的是通過 cas 操作和?synchronized?關(guān)鍵字來實現(xiàn)優(yōu)化,而擴容的時候也利用了一種分而治之的思想來提升擴容效率,在 JDK1.8 中?ConcurrentHashMap?的存儲結(jié)構(gòu)和 HashMap 基本一致,如下圖所示:

        為什么 key 和 value 不允許為 null

        在 HashMap 中,key 和 value 都是可以為 null 的,但是在?ConcurrentHashMap?中卻不允許,這是為什么呢?
        作者 Doug Lea 本身對這個問題有過回答,在并發(fā)編程中,null 值容易引來歧義, 假如先調(diào)用?get(key)?返回的結(jié)果是 null,那么我們無法確認(rèn)是因為當(dāng)時這個 key 對應(yīng)的 value 本身放的就是 null,還是說這個 key 值根本不存在,這會引起歧義,如果在非并發(fā)編程中,可以進一步通過調(diào)用?containsKey?方法來進行判斷,但是并發(fā)編程中無法保證兩個方法之間沒有其他線程來修改 key 值,所以就直接禁止了 null 值的存在。
        而且作者 Doug Lea 本身也認(rèn)為,假如允許在集合,如 map 和 set 等存在 null 值的話,即使在非并發(fā)集合中也有一種公開允許程序中存在錯誤的意思,這也是 Doug Lea 和 Josh Bloch(HashMap作者之一) 在設(shè)計問題上少數(shù)不同意見之一,而?ConcurrentHashMap?是 Doug Lea 一個人開發(fā)的,所以就直接禁止了 null 值的存在。

        ConcurrentHashMap 如何保證線程的安全性

        在 ConcurrentHashMap 中,采用了大量的分而治之的思想來降低鎖的粒度,提升并發(fā)性能。其源碼中大量使用了 cas 操作來保證安全性,而不是和 HashTable 一樣,不論什么方法,直接簡單粗暴的使用 synchronized關(guān)鍵字來實現(xiàn),接下來的原理分析中,部分和 HashMap 類似之處本文就不在重復(fù),本文主要從安全性方面來分析 ConcurrentHashMap 的設(shè)計。

        如何用 CAS 保證數(shù)組初始化的安全

        下面就是初始化的方法:
        這里面有一個非常重要的變量 sizeCtl,這個變量對理解整個?ConcurrentHashMap?的原理非常重要。
        sizeCtl 有四個含義:
        • sizeCtl<-1?表示有 N-1 個線程正在執(zhí)行擴容操作,如 -2 就表示有 2-1 個線程正在擴容。
        • sizeCtl=-1?占位符,表示當(dāng)前正在初始化數(shù)組。
        • sizeCtl=0?默認(rèn)狀態(tài),表示數(shù)組還沒有被初始化。
        • sizeCtl>0?記錄下一次需要擴容的大小。
        知道了這個變量的含義,上面的方法就好理解了,第二個分支采用了 CAS 操作,因為 SIZECTL 默認(rèn)為 0,所以這里如果可以替換成功,則當(dāng)前線程可以執(zhí)行初始化操作,CAS 失敗,說明其他線程搶先一步把 sizeCtl 改為了 -1。擴容成功之后會把下一次擴容的閾值賦值給 sc,即 sizeClt。

        put 操作如何保證數(shù)組元素的可見性

        ConcurrentHashMap?中存儲數(shù)據(jù)采用的 Node 數(shù)組是采用了 volatile 來修飾的,但是這只能保證數(shù)組的引用在不同線程之間是可用的,并不能保證數(shù)組內(nèi)部的元素在各個線程之間也是可見的,所以這里我們判定某一個下標(biāo)是否有元素,并不能直接通過下標(biāo)來訪問,那么應(yīng)該如何訪問呢?源碼給你答案:
        可以看到,這里是通過 tabAt 方法來獲取元素,而 tableAt 方法實際上就是一個 CAS 操作:
        如果發(fā)現(xiàn)當(dāng)前節(jié)點元素為空,也是通過 CAS 操作(casTabAt)來存儲當(dāng)前元素。
        如果當(dāng)前節(jié)點元素不為空,則會使用?synchronized?關(guān)鍵字鎖住當(dāng)前節(jié)點,并進行對應(yīng)的設(shè)值操作:

        精妙的計數(shù)方式

        在 HashMap 中,調(diào)用 put 方法之后會通過?++size?的方式來存儲當(dāng)前集合中元素的個數(shù),但是在并發(fā)模式下,這種操作是不安全的,所以不能通過這種方式,那么是否可以通過 CAS 操作來修改 size 呢?
        直接通過 CAS 操作來修改 size 是可行的,但是假如同時有非常多的線程要修改 size 操作,那么只會有一個線程能夠替換成功,其他線程只能不斷的嘗試 CAS,這會影響到?ConcurrentHashMap?集合的性能,所以作者就想到了一個分而治之的思想來完成計數(shù)。
        作者定義了一個數(shù)組來計數(shù),而且這個用來計數(shù)的數(shù)組也能擴容,每次線程需要計數(shù)的時候,都通過隨機的方式獲取一個數(shù)組下標(biāo)的位置進行操作,這樣就可以盡可能的降低了鎖的粒度,最后獲取 size 時,則通過遍歷數(shù)組來實現(xiàn)計數(shù):
        //用來計數(shù)的數(shù)組,大小為2的N次冪,默認(rèn)為2
        private?transient?volatile?CounterCell[]?counterCells;

        @sun.misc.Contended?static?final?class?CounterCell?{//數(shù)組中的對象
        ????????volatile?long?value;//存儲元素個數(shù)
        ????????CounterCell(long?x)?{?value?=?x;?}
        ????}

        addCount 計數(shù)方法

        接下來我們看看 addCount 方法:
        首先會判斷?CounterCell?數(shù)組是不是為空,需要這里的是,這里的 CAS 操作是將?BASECOUNT?和 baseCount 進行比較,如果相等,則說明當(dāng)前沒有其他線程過來修改 baseCount(即 CAS 操作成功),此時則不需要使用?CounterCell?數(shù)組,而直接采用 baseCount 來計數(shù)。
        假如?CounterCell?為空且 CAS 失敗,那么就會通過調(diào)用?fullAddCount?方法來對?CounterCell?數(shù)組進行初始化。

        fullAddCount 方法

        這個方法也很長,看起來比較復(fù)雜,里面包含了對?CounterCell?數(shù)組的初始化和賦值等操作。

        初始化 CounterCell 數(shù)組

        我們先不管,直接進入初始化的邏輯:
        這里面有一個比較重要的變量 cellsBusy,默認(rèn)是 0,表示當(dāng)前沒有線程在初始化或者擴容,所以這里判斷如果?cellsBusy==0,而 as 其實在前面就是把全局變量?CounterCell?數(shù)組的賦值,這里之所以再判斷一次就是再確認(rèn)有沒有其他線程修改過全局?jǐn)?shù)組?CounterCell,所以條件滿足的話就會通過 CAS 操作修改?cellsBusy?為 1,表示當(dāng)前自己在初始化了,其他線程就不能同時進來初始化操作了。
        最后可以看到,默認(rèn)是一個長度為 2 的數(shù)組,也就是采用了 2 個數(shù)組位置進行存儲當(dāng)前?ConcurrentHashMap?的元素數(shù)量。

        CounterCell 如何賦值

        初始化完成之后,如果再次調(diào)用 put 方法,那么就會進入?fullAddCount?方法的另一個分支:
        這里面首先判斷了?CounterCell?數(shù)組不為空,然后會再次判斷數(shù)組中的元素是不是為空,因為如果元素為空,就需要初始化一個?CounterCell?對象放到數(shù)組,而如果元素不為空,則只需要 CAS 操作替換元素中的數(shù)量即可。
        所以這里面的邏輯也很清晰,初始化?CounterCell?對象的時候也需要將?cellBusy?由 0 改成 1。

        計數(shù)數(shù)組 CounterCell 也能擴容嗎

        最后我們再繼續(xù)看其他分支:
        主要看上圖紅框中的分支,一旦會進入這個分支,就說明前面所有分支都不滿足,即:
        • 當(dāng)前?CounterCell?數(shù)組已經(jīng)初始化完成。
        • 當(dāng)前通過 hash 計算出來的?CounterCell?數(shù)組下標(biāo)中的元素不為 null。
        • 直接通過 CAS 操作修改?CounterCell?數(shù)組中指定下標(biāo)位置中對象的數(shù)量失敗,說明有其他線程在競爭修改同一個數(shù)組下標(biāo)中的元素。
        • 當(dāng)前操作不滿足不允許擴容的條件。
        • 當(dāng)前沒有其他線程創(chuàng)建了新的?CounterCell?數(shù)組,且當(dāng)前?CounterCell?數(shù)組的大小仍然小于 CPU 數(shù)量。
        所以接下來就需要對?CounterCell?數(shù)組也進行擴容,這個擴容的方式和?ConcurrentHashMap?的擴容一樣,也是將原有容量乘以 2,所以其實?CounterCell?數(shù)組的容量也是滿足 2 的 N 次冪。

        ConcurrentHashMap 的擴容

        接下來我們需要回到 addCount 方法,因為這個方法在添加元素數(shù)量的同時,也會判斷當(dāng)前?ConcurrentHashMap?的大小是否達(dá)到了擴容的閾值,如果達(dá)到,需要擴容。

        擴容也能支持并發(fā)嗎

        這里可能令大家有點意外的是,ConcurrentHashMap?擴容也支持多線程同時進行,這又是如何做到的呢?接下來就讓我們回到 addCount 方法一探究竟。
        這里 check 是傳進來的鏈表長度,>=0?才開始檢查是否需要擴容,緊挨之后是一個 while 循環(huán),主要是滿足兩個條件:
        前面我們提到,sizeCtl在初始化的時候會被賦值為下一次擴容的大?。〝U容之后也會),所以?>=sizeCtl?表示的就是是否達(dá)到擴容閾值。
        table 不為 null 且當(dāng)前數(shù)組長度小于最大值 2 的 30 次方。

        擴容戳有什么用

        當(dāng)滿足擴容條件之后,首先會先調(diào)用一個方法來獲取擴容戳,這個擴容戳比較有意思,要理解擴容戳,必須從二進制的角度來分析。resizeStamp?方法就一句話,其中?RESIZE_STAMP_BITS?是一個默認(rèn)值 16。
        ?static?final?int?resizeStamp(int?n)?{
        ????????return?Integer.numberOfLeadingZeros(n)?|?(1?<1));
        ????}
        這里面關(guān)鍵就是?Integer.numberOfLeadingZeros(n)?這個方法,這個方法源碼就不貼出來了,實際上這個方法就是做一件事,那就是獲取當(dāng)前數(shù)據(jù)轉(zhuǎn)成二進制后的最高非 0 位前的 0 的個數(shù)。
        這句話有點拗口,我們舉個例子,就以 16 為準(zhǔn),16 轉(zhuǎn)成二進制是 10000,最高非 0 位是在第 5 位,因為 int 類型是 32 位,所以他前面還有 27 位,而且都是 0,那么這個方法得到的結(jié)果就是 27(1 的前面還有 27 個 0)。
        然后?1 << (RESIZE_STAMP_BITS - 1)在當(dāng)前版本就是 1<<15,也就是得到一個二進制數(shù)?1000000000000000,這里也是要做一件事,把這個 1 移動到第 16 位。最后這兩個數(shù)通過 | 操作一定得到的結(jié)果就是第 16 位是 1,因為 int 是 32 位,最多也就是 32 個 0,而且因為 n 的默認(rèn)大小是 16(ConcurrentHashMap?默認(rèn)大?。?,所以實際上最多也就是 27(11011),也就是說這個數(shù)最高位的 1 也只是在第五位,執(zhí)行 | 運算最多也就是影響低 5 位的結(jié)果。
        注意:這里之所以要保證第 16 位為 1,是為了保證 sizeCtl 變量為負(fù)數(shù),因為前面我們提到,這個變量為負(fù)數(shù)才代表當(dāng)前有線程在擴容,至于這個變量和 sizeCtl 的關(guān)系后面會介紹。

        首次擴容為什么計數(shù)要 +2 而不是 +1

        首次擴容一定不會走前面兩個條件,而是走的最后一個紅框內(nèi)條件,這個條件通過 CAS 操作將 rs 左移了 16(RESIZE_STAMP_SHIFT)位,然后加上一個 2,這個代表什么意思呢?為什么是加 2 呢?
        要回答這個問題我們先回答另一個問題,上面通過方法獲得的擴容戳 rs 究竟有什么用?實際上這個擴容戳代表了兩個含義:
        • 高 16 位代表當(dāng)前擴容的標(biāo)記,可以理解為一個紀(jì)元。
        • 低 16 位代表了擴容的線程數(shù)。
        知道了這兩個條件就好理解了,因為 rs 最終是要賦值給 sizeCtl 的,而 sizeCtl 負(fù)數(shù)才代表擴容,而將 rs 左移 16 位就剛好使得最高位為 1,此時低 16 位全部是 0,而因為低 16 位要記錄擴容線程數(shù),所以應(yīng)該 +1,但是這里是 +2,原因是 sizeCtl 中 -1 這個數(shù)值已經(jīng)被使用了,用來代替當(dāng)前有線程準(zhǔn)備擴容,所以如果直接 +1 是會和標(biāo)志位發(fā)生沖突。
        所以繼續(xù)回到上圖中的第二個紅框,就是正常繼續(xù) +1 了,只有初始化第一次記錄擴容線程數(shù)的時候才需要 +2。

        擴容條件

        接下來我們繼續(xù)看上圖中第一個紅框,這里面有 5 個條件,代表是滿足這 5 個條件中的任意一個,則不進行擴容:
        • (sc >>> RESIZE_STAMP_SHIFT) != rs 這個條件實際上有 bug,在 JDK12 中已經(jīng)換掉。
        • sc == rs + 1 表示最后一個擴容線程正在執(zhí)行首位工作,也代表擴容即將結(jié)束。
        • sc == rs + MAX_RESIZERS 表示當(dāng)前已經(jīng)達(dá)到最大擴容線程數(shù),所以不能繼續(xù)讓線程加入擴容。
        • 擴容完成之后會把 nextTable(擴容的新數(shù)組) 設(shè)為 null。
        • transferIndex <= 0 表示當(dāng)前可供擴容的下標(biāo)已經(jīng)全部分配完畢,也代表了當(dāng)前線程擴容結(jié)束。

        多并發(fā)下如何實現(xiàn)擴容

        在多并發(fā)下如何實現(xiàn)擴容才不會沖突呢?可能大家都想到了采用分而治之的思想,在?ConcurrentHashMap?中采用的是分段擴容法,即每個線程負(fù)責(zé)一段,默認(rèn)最小是 16,也就是說如果?ConcurrentHashMap?中只有 16 個槽位,那么就只會有一個線程參與擴容。如果大于 16 則根據(jù)當(dāng)前 CPU 數(shù)來進行分配,最大參與擴容線程數(shù)不會超過 CPU 數(shù)。
        擴容空間和 HashMap 一樣,每次擴容都是將原空間大小左移一位,即擴大為之前的兩倍。注意這里的?transferIndex?代表的就是推進下標(biāo),默認(rèn)為舊數(shù)組的大小。

        擴容時的數(shù)據(jù)遷移如何保證安全性

        初始化好了新的數(shù)組,接下來就是要準(zhǔn)備確認(rèn)邊界。也就是要確認(rèn)當(dāng)前線程負(fù)責(zé)的槽位,確認(rèn)好之后會從大到小開始往前推進,比如線程一負(fù)責(zé) 1-16,那么對應(yīng)的數(shù)組邊界就是 0-15,然后會從最后一位 15 開始遷移數(shù)據(jù):
        這里面有三個變量比較關(guān)鍵:
        • fwd 節(jié)點:?這個代表的是占位節(jié)點,最關(guān)鍵的就是這個節(jié)點的 hash 值為 -1,所以一旦發(fā)現(xiàn)某一個節(jié)點中的 hash 值為 -1 就可以知道當(dāng)前節(jié)點已經(jīng)被遷移了。
        • advance:?代表是否可以繼續(xù)推進下一個槽位,只有當(dāng)前槽位數(shù)據(jù)被遷移完成之后才可以設(shè)置為 true
        • finishing:?是否已經(jīng)完成數(shù)據(jù)遷移。
        知道了這幾個變量,再看看上面的代碼,第一次一定會進入 while 循環(huán),因為默認(rèn) advance 為 true,第一次進入循環(huán)的目的為了確認(rèn)邊界,因為邊界值還沒有確認(rèn),所以會直接走到最后一個分支,通過 CAS 操作確認(rèn)邊界。
        確認(rèn)邊界這里直接表述很難理解,我們通過一個例子來說明:
        假設(shè)說最開始的空間為 16,那么擴容后的空間就是 32,此時?transferIndex?為舊數(shù)組大小 16,而在第二個 if判斷中,transferIndex?賦值給了 nextIndex,所以?nextIndex?為 1,而 stride 代表的是每個線程負(fù)責(zé)的槽位數(shù),最小就是 16,所以 stride 也是 16,所以?nextBound= nextIndex > stride ? nextIndex - stride : 0?皆可以得到:nextBound=0?和?i=15?了,也就是當(dāng)前線程負(fù)責(zé) 0-15 的數(shù)組下標(biāo),且從 0 開始推進,確認(rèn)邊界后立刻將 advance 設(shè)置為 false,也就是會跳出 while 循環(huán),從而執(zhí)行下面的數(shù)據(jù)遷移部分邏輯。
        PS:因為?nextBound=0,所以 CAS 操作實際上也是把?transferIndex?變成了 0,表示當(dāng)前擴容的數(shù)組下標(biāo)已經(jīng)全部分配完畢,這也是前面不滿足擴容的第 5 個條件。
        數(shù)據(jù)遷移時,會使用?synchronized?關(guān)鍵字對當(dāng)前節(jié)點進行加鎖,也就是說鎖的粒度精確到了每一個節(jié)點,可以說大大提升了效率。加鎖之后的數(shù)據(jù)遷移和 HashMap 基本一致,也是通過區(qū)分高低位兩種情況來完成遷移,在本文就不重復(fù)講述。
        當(dāng)前節(jié)點完成數(shù)據(jù)遷移之后,advance 變量會被設(shè)置為 true,也就是說可以繼續(xù)往前推進節(jié)點了,所以會重新進入上面的 while 循環(huán)的前面兩個分支,把下標(biāo) i 往前推進之后再次把 advance 設(shè)置為 false,然后重復(fù)操作,直到下標(biāo)推進到 0 完成數(shù)據(jù)遷移。
        while 循環(huán)徹底結(jié)束之后,會進入到下面這個 if 判斷,紅框中就是當(dāng)前線程自己完成了遷移之后,會將擴容線程數(shù)進行遞減,遞減之后會再次通過一個條件判斷,這個條件其實就是前面進入擴容前條件的反推,如果成立說明擴容已經(jīng)完成,擴容完成之后會將?nextTable?設(shè)置為 null,所以上面不滿足擴容的第 4 個條件就是在這里設(shè)置的。

        總結(jié)

        本文主要講述了?ConcurrentHashMap?中是如何保證安全性的,并且挑選了一些比較經(jīng)典的面試常用問題進行分析解答,在整個?ConcurrentHashMap?中,整個思想就是降低鎖的粒度,減少鎖的競爭,所以采用了大量的分而治之的思想,比如多線程同時進行擴容,以及通過一個數(shù)組來實現(xiàn) size 的計數(shù)等。

        瀏覽 36
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美大香蕉视频| 一区二区三区成人| 免费一级A片在线播放| 婷婷情色五月| 日韩中文字幕久久| 日本无码在线视频| 9l视频自拍九色9l视频成人 | 日韩无码免费| 亚洲天堂精品在线观看| 淫荡人妻视频| 麻豆精品秘国产| 伊人免费视频在线观看| 大地8免费高清视频观看大全| 久久女人| 亚洲影院在线观看| 亚洲视频免费在线播放| 色情网站在线| 国产在线精品自拍| 苍井空中文字幕在线观看| 91香蕉视频在线| 一道本无吗一区| JLZZJLZZ亚洲女人| 3D动漫精选啪啪一期二期三期| 91视频亚洲| 操逼一级| 国产在线视频导航| 囯产精品一区二区三区线一牛影视1 | 日本乱轮视频| 俺来俺去www色婷婷| 国产成人精品AV在线观| 日韩二区三区| ThePorn日本无码| 色妞视频| 亚洲网站免费观看| 国产精品同| 黄片视频在线免费播放| www.怡春院| 久久三级| 亚洲综合日韩在线| 日韩精品久久久久久久| 亚洲一区高清| 亚州黄色电影| 亚洲免费在线婷婷| 大雞巴疯狂浓精合集| 亚洲成人精品在线观看| 日本特级黄A片免费观看| 日本黄色录像| 色天堂在线观看视频| 激情无码在线观看| 高清无码直接看| 日韩v欧美v日本v亚洲v国产v| 国产日韩欧美综合精品在线观看| 色网在线观看| 免费在线观看黄色视频| AA无码| 操逼视频在线看| 国产高清无码18| 久热精品在线观看视频| 刘玥精品国产一区二区三区| 91精品视频在线免费观看| 一区二区不卡视频| 国产激情| 蜜桃BBwBBWBBwBBw| 日韩午夜AV| 国产精品久久久精品cos| 欧美日韩国产激情| 久久AV网站| 蜜桃视频app| 日韩成人AV电影| 亚洲无码免费在线视频| 性欧美日韩| 青青草大香蕉在线| 乱子伦一区二区三区视频在线观看| 色婷婷天天操天天干| 国产精品9999| 日韩精品在线免费观看| 99大香蕉| 毛片网| 日本欧美在线| 男人先锋| 亚洲秘一区二区三区-精品亚洲二区- | 无码在线视频免费观看| 国产婷婷久久Av免费高清| 一级免费毛片| 国产一级a| 91人妻成人精品一区二区| 九九热精品视频在线播放| 成人激情五月天| 日韩小电影免费观看高清完整版在线观| 中文字幕2025年最好看电视剧| 成人午夜小视频| 99热精品国产| 波多野结衣一级婬片A片免费下载| 色婷婷播放| 亚洲无码AV在线观看| 人人干视频| 久久国产亚洲| 一区二区三区无码区| 波多野结衣av在线观看| 亚洲免费人妻| 爱爱视频日韩| 天天干强奸视频在线综合| 粉嫩AV蜜乳AV蜜臀AV蜂腰AV | 久操大香蕉| 欧美视频一区二区三区| 色色婷婷五月天| 黄片无码| 久久精品99久久久久久久久| 午夜黄片| 健身房被教练3p喷水了| 成人网一区二区| 国产精品久久久久久久久A| 69成人导航| 99久久综合九九| 一级a片在线免费观看| 欧美日本一区二区三区| 日韩在线高清视频| 俺去啦俺去也| 乱伦小说五月天| 男女黄色免费网站| 无码乱码在线观看| 四川美人搡BBw搡BBw| 国产成人精品无码区在线| 熟女在线视频| 俺去也在线视频| 欧美嗯啊| 超碰在线天天干| 成人操B| 在线免费观看黄色片| 日韩无码一区二区三区四区| 专区无日本视频高清8| 色哟哟精品| 国产成人三级| 亚洲免费网站| 国产三级日本三级国产三级| 可以免费观看的AV| 色色色免费视频| 中文字幕国产综合| 亚洲在线一区二区| 亚洲国产成人一区二区| 欧美日日干| 北条麻妃无码一区二区| 国产精品av在线| 亚洲无码A片在线观看| 18禁www| 亚洲中文字幕第一页| 天天色天天日| 999久久精品| 一本色道久久88综合无码| 超碰自拍97| 日韩av无码电影| 人人超碰在线| 午夜成人福利剧场| 国产成人高清无码| 91探花国产综合在线精品| 人妻无码免费视频| 亚洲无码久久久| 女人自慰网站在线观看| 欧美日韩一区二区三区视频| 波多野吉衣av| 五月停亭六月,六月停亭的英语| 你懂的国产| x88AV吊钟奶熟女| 国产AⅤ爽aV久久久久成人| 影音先锋成人资源站| 二区无码| 蜜臀av一区二区三区| 特级西西444www高清大胆免费看| xxx一区二区| 久久怡春院| 欧一美一色一伦一A片| 无码人妻精品一区二区三千菊电影 | www黄片| 男人av网站| 一本色道久久综合狠狠躁| 色噜噜狠狠一区二区三区| 一区电影网| 日韩成人黄片| 亚洲专区在线| 婷婷综合色| 欧美视频在线观看| 日本黄色视频官网| 看免费操逼视频| av无码精品一区| 激情成人五月天| 人人干人人操人人摸| 天天日天天舔| 日韩视频一级| 国产精品免费一区二区三区四区视频 | www.51av| 俺来也操逼| 国产精品久久久久的角色| 人人妻人人操人人干| 亚洲成人无码视频| 亚洲AⅤ欧美AⅤ| 久久久久久无码精品亚洲日韩麻豆| 人人操人人操人人操人人操 | 青青三级片| 黄片视频在线免费播放| 亚洲vs无码秘蜜桃| 91av免费| 插综合网| 色色加勒比综合| 婷婷五月免费视频| 国产精品美女在线观看| 农村老太HD肉HD| 天天爽| 亚洲91视频| 精品中文一区二区三区| 亚洲AV成人电影| 婷婷五月丁香色| 香蕉久久a毛片| 黑巨茎大战欧美白妞| 久热在线资源福利站| 蜜臀AV在线观看| 成人在线欧美| 99精品视频在线观看免费| 不雅一级| 伊人三级片| 欧美亚洲成人电影| 天美精东蜜桃91| www.四虎成人网站| 影音先锋女人资源| 羽月希奶水饱胀在线播放| a天堂8在线资源| 97人妻人人澡| 影音先锋人妻资源| 日韩成人免费在线| 色婷婷一区二区三区久久午夜| 久草综合在线| 干欧美美女| ThePorn精品无码| Japanese在线观看| 日本一区二区三区免费视频| 欧美又粗又大AAA片| 成人精品秘久久久按摩下载| 成人小说一区二区三区| 全国最大成人网站| 欧美精品在线免费| 豆花视频一区二区| 国产精品久久久久久久久夜色| 中文字幕在线一区| 国产一毛a一毛a在线观看| 国产激情在线观看视频| 一区二区三区无码免费| 久久一级片| 99精品一区二区| 黑人一区二区| 亚洲国产精品久久久| 色逼高清| 丝瓜视频黄| 成人短视频在线观看| 免费无码婬片A片AAA毛片96| 成人亚洲性情网站www在线| 91人妻日韩人妻无码| 国产午夜在线视频| 无码中文暮| 久久久永久免费视频| 男人天堂视频在线观看| 色妹子综合| gogogo免费高清在线偷拍| 久久一二三四| 潮喷在线| 国产卡一卡二在线观看| 日本电影一区二区三区| 天堂中文字幕在线| www.色在线观看| 色婷婷18正码国产| 天天日天天射天天干| 中韩AV在线免费观看| 亚洲天堂AV在线观看| 一区二区三区视频在线| 国产小视频在线| 欧美wwwww| 亚洲中文综合| 天天日夜夜爽| 国产丰满大乳无码免费播放| 91九色在线| 一道本在线| 女邻居的B好大| 日韩中文字幕高清| 伊人网视频| 91啦丨熟女露脸| 亚洲中文字幕影院| 巨い巨乳の少妇あジed2k| 精品一区二区三区四区五区| 四虎精品成人无码A片| 香蕉黄色三级片| 天天操欧美| 日韩人妻视频| 91国产精品视频在线| 开心激情婷婷| 国产精品扒开腿做爽爽爽A片唱戏| AA片免费看| 成人无码免费一区二区中文| 国产美女高潮| 天天色天天色| 人人射视频| 最近中文字幕高清2019中文字幕| 日B免费视频| 无码人妻精品一区二区三| 狠狠狠久久久| 成人免费黄色片| 九九偷拍视频| 日韩色爱| 亚洲中文娱乐| 高清无码免费在线视频| 亚洲黄色电影网| 国产久久久久久| 色色色五月婷婷| AV天堂无码| 中文字幕人妻精品一区| 可以免费看av的网站| 日韩无码小电影| 国产人妻中文字幕| 国产成人a亚洲精品| 日韩精品欧美一区二区三区| 天堂在线9| 91精品人妻一区二区三区蜜桃欧美 | 日韩欧美成人视频| 成人国产精品免费观看| 黄色永久网站| 成人网在线视频| 天堂网一区二区三区| 天天操一操| V天堂在线视频| 91久久免费视频| 黄色视频在线观看免费| av六月天| 怡春院国产| 免费的黄色视频网站| 亚洲av免费在线| 欧美久久国产精品| 欧美精品系列| 久久久久久久| 玖玖激情| 欧美一区二区无码视频| 麻豆一级| 丁香五月激情视频| 欧美99视频| 少妇搡BBBB搡BBB搡造水爽| 欧美在线va| 婷婷五月丁香激情| 超碰麻豆| 免费观看高清无码视频| 97资源视频| 久久68| 国产精品无码怀孕软件| 性无码一区二区三区在线观看| 欧美日韩中文视频| 亚洲综合成人在线| 91视频熟女| 揄拍成人国产精品视频| 中文字幕日韩无码电影| 天天摸天天操| 91视频亚洲| 亚州精品无码| 暴操美女网站| 姐弟乱伦性爱| 亚洲AV免费| 一本色道久久综合亚洲怎么玩| 日韩三级片网址| 国产乱子伦视频国产印度| 中文字幕无码一区二区| 蜜桃av一区二区三区| 日本三级AAA三级AAAA97| 最近中文字幕在线中文字幕7| 综合导航无码| 初尝人妻滑进去了莹莹视频| 色婷婷一区二区三区四区五区精品视| 91人人操人人爽| 黄色操逼网站?| 福利视频一区二区| 成人小说视频在线社区| 色五月在线视频| 婷婷开心色四房播播在线| 免费中文字幕av| 日本性爱中文字幕| 九九九九色| 国产免费视频69| 双腿张开被9个男人调教| 欧美操b| 国产做受精品网站在线观看| 亚洲高清成人动漫| 亚洲精品一区中文字幕乱码| 亚洲va中文字幕| 免费无码一区二区三区四区五区| 久久午夜影院| 国产性受XXXXXYX性爽| 亚洲AV观看| 北条麻妃免费视频| 亚洲人妻在线视频| 欧美精品不卡| 亚洲视频在线观看免费| 免费网站观看www在线观| 色婷婷av| www.俺去| 国产传媒AV| 亚洲日韩一级片| 青草视频在线观看免费| 久久综合五月| 日日夜夜无码| 久草资源在线| 国外成人性视频免费| 亚洲精品天堂无码AV片| 亚洲黄色视频在线| 一区在线看| 亚洲精品97久久中文字幕| 中文免费高清在线| 激情操逼| 无码不卡av| 中文视频免费播放| 国产成人精品av| 黄色视频免费在线看| 国产高清Av| 婷婷无码成人精品俺来俺去| 91免费观看视频| 嫩草91| 中文免费高清在线观看视频| 亚洲无码人妻| 免看一级a一片| 91国产爽黄| 狼友自拍| 秋霞二区| 精品资源成人| 蝌蚪窝在线视频观看| 日本一区二区在线| 色老板在线观看视频| 国产欧美精品成人在线观看| 欧美性夜黄A片爽爽免费视频| 国产女人18| 碰碰97| 成人做爰黄A片免费看| 男女操逼视频网站免费观看| 乖我硬了让老子cao你小视频| 一大高清日韩| 91站街农村熟女露脸| 秘亚洲国产精品成人网站| 俺来也俺去啦欧美www| 91禁樱桃在线| 久久国产热| 99在线精品视频| 高清无码视频观看| 夜夜夜操操操| 亚洲久久无码| 夜夜夜叫天天天做| 在线观看免费视频无码| 在线视频日韩| 亚洲AV无码久久寂寞少妇多毛| 日韩av三级在线观看| 日韩中文字幕人妻| 久久久久久久艹| 国产黄色电影在线观看| 思思热在线观看视频| 久草网在线观看| 色哟哟AV| 天天色天天色天天色| 91嫩草久久久久久久| 超碰久热| 伦理被部长侵犯HD中字| 天堂av中文字幕| 国产第一页在线观看| 日产精品久久久久| 欧美大鸡巴视频| 伊人99| 激情人妻AV| 欧美熟妇擦BBBB擦BBBB| 成人网在线观看| 成人日批视频| 人人操夜夜爽| 日韩成人片| 色婷婷日韩精品一区二区三区| 最近中文字幕中文翻译歌词| 另类av| 精品一区二区ww| 成人精品一区二区三区电影| 人人妻人人澡人人爽久久con | 一区二区入口| 97精产国品久久蜜桃臀| 黄色片在线免费观看| 高潮AV在线观看| 91探花秘入囗| 日本高清色清di免费观看| 五月天狠狠干| 亚洲视频www| 污视频在线免费| 91在线精品一区二区| 91精片| 福利视频中文字幕| 人人妻人人澡人人爽| 亚洲欧美激情小说| 国产精品同| 天天操人人妻| 三级网址在线观看| 韩国精品在线观看| 婷婷亚洲国产| 中文字幕av高清片,中文在线观看| 91天堂网| 亚洲91网站| 免费的黄色片| 国产aa| www.尤物视频| 亚洲成人AAAAA| 大香蕉福利在线| 日日撸| 奇米91| 无码中文一区| 777国产盗摄偷窥精品0000| 欧一美一婬一伦一区| av天堂中文在线| 淫香淫色天天影视| 久久久女女女女999久久| 国产精品9| 国产AV黄片| 日韩黄色小电影| 亚洲九九在线| 日本精品人妻无码77777| 中文字幕777| 国产免费观看视频| 久久天堂一区| 亚洲乱伦| 青青草精品视频| 亚洲熟妇在线| 国产欧美综合一区二区| 精品少妇视频| 美女被操网站| 日韩在线视频免费| 天天无码视频| 五月天啪啪视频| 国产精品剧情| 久草手机在线| A片免费播放| 东北操逼视频| 日韩在线视频二区| 午夜做爱福利视频| 成人免费视频18| 无码人妻精品一区二区三区蜜桃91| 日本A在线播放| 无码精品人妻一区二区欧美| 99热1| 青娱乐无码| 特级西西444www大精品| 久久久黄色电影| 日韩欧美国产成人| 日韩精品高清中文| 一本道高清无码视频| 久草大| 在线欧美日韩| 91区视频| 韩国午夜福利视频| 怡红院成人网| 蜜臀99久久精品久久久久久软件| 日韩高清无码三级片| 日韩AV大片| 少妇熟女视频| 色眯眯久久爱| 91玖玖| 亚洲AV成人无码精品直播在线 | 豆花视频logo进入官网| 免费看黄色的视频| 欧美国产操逼| 日本大香蕉在线视频| 爆乳一区二区三区AV| 狠狠操在线视频| 婷婷色在线视频| 日韩在线视频中文字幕码无| 国产乱子伦精品久久| 日韩国产综合| 天堂精品在线| 日本在线免费观看| 美日韩无码| 91精品久久久久久久久| 午夜黄色大片| 国产精品无码无套在线照片| 2020人妻中文字幕| 欲撸视频| 国产精品免费在线| 色婷婷国产| 欧美在线小视频| 黄片视频国产| 免费黄色视频网站在线观看| 操逼网123首页| 精品人妻一区二区乱码一区二区| 日韩无码成人电影| 大香蕉伊人在线观看| 色色影院| 狠狠躁18三区二区一区免费人| 亚洲三级毛片| 九月丁香婷婷| 亚洲欧美成人片| 亚洲性爱手机版| 天天澡天天爽日日AV| 乱伦A片| 强辱丰满人妻HD中文字幕| 国产综合在线播放| 欧美日韩亚洲视频| 狠狠色噜噜狠狠狠7777| 肏屄视频在线看| 天天干夜夜操| 日韩网站在线| 欧美亚洲成人精品| 国产成人片| 先锋影音在线资源| 免费看黃色AAAAAA片| 亚洲无码电影网站| 亚欧成人网站| 国产人妖TS重口系列网站观看| 日本黄色A片免费看| 中文字幕无码一区二区三区一本久| 这里视频很精彩免费观看电视剧最新 | 婷婷五月在线观看| 亚洲综合色色| 精品国产成人a在线观看| 三级片免费网址| 国产免费观看视频| 五月天综合在线| 欧美在线视频你懂的| 强开小嫩苞毛片一二三区| av三级片在线播放| 偷拍视频网站北条麻妃| 高清一区二区| 欧美不卡视频| 日韩无码国产精品| 日韩色情视频| 91夫妻视频| 五月天欧美性爱| 99视频在线看| 人人操综合| 91九色91蝌蚪91成人| 一本无码视频| 成人无码免费视频| 国产热99| www.199麻豆在线观看网站| 免费观看亚洲视频| 99热这里只有精品999| 无码欧美精品一区二区| 三级高清无码视频| 国产精品一品二区三区的使用体验| 午夜国产精品AV| www伦理片-韩国三级三级三级a三级-成人AV| 日本黄色免费网站| 五月婷婷在线观看| 久草资源在线| 少妇大战黑人46厘米| 狠狠撸在线| 伊人操| 青青草原AV| 日韩无码激情| 中文字幕第八页| 中文字幕日韩在线观看| 欧美精品一二三区| 四虎一区二区| 国产精品一线| 97色在线| 免费亚洲无码| av天堂中文字幕| 青青草伊人网| 国产成人综合网| 国产午夜精品电影| 国产91福利| 丁香五月色情| 嫩小槡BBBB槡BBBB槡漫画| 97自拍视频| 免费成人黄色网址| 无码人妻精品一区二区三| 色午夜| 特级毛片www| 亚洲第一页在线观看| 操屄免费视频| 操美女逼逼| 91精品久久香蕉国产线看观看| 精品91海角乱| 91麻豆国产| 国产精品久久久久毛片SUV| 18禁www| 亚洲性爱一区| 日韩在线小视频| 少妇一级片| 亚洲中文字幕电影| 操逼网址| 一区二区三区操逼| 婷婷深爱五月丁香网| 亚洲无码三级片在线观看| 做爱网站在线观看| 日韩成人AV在线播放| 色就是亚洲| 熟女人妻人妻の视频| 欧美一级高清片免费一级a| 欧美韩日一区二区| 三级无码在线播放| 国产激情一区二区三区| 欧美特级视频| 亚洲中文幕| 黄视频在线观看免费| 亚洲最大黄色视频| 久久久久久性爱| 波多野成人无码精品视频| 残忍另类BBWBBWBBW| 亚洲成人性爱网| 日韩一区二区三区在线| 免费无码成人片在线观看在线| 亚洲无码视频免费观看| 人人草人人摸| 狠狠撸天天日| 韩国午夜福利视频| 久久久久亚洲AV成人片乱码| 无码中文字| 欧美18成人| 午夜免费网站| 不卡a12| 天天爱综合| 五月涩| 亚洲中文字幕码mv| 偷拍综合| 91天天综合| 欧美性爱超碰| 中文在线视频| 熟女人妻人蜜桃视频| 中文字幕无码AV| 欧美视频一区| 成人社区视频| 亚洲性图第一页| 99视频+国产日韩欧美| 久久综合色色| 亚洲一区二区成人| 天天高清无码| 秋霞中文字幕| 国产免费麻豆| 操逼网站视频| 在线观看av网站中文字幕| 91色视频在线观看| 欧美三级欧美一级| 伊人成人片| 欧美婬乱片A片AAA毛片地址| 亚洲熟妇视频| 国产操操操| 中文字幕亚洲日韩| 国产AV影院| 欧美激情无码炮击| 99热在线中文字幕| 国产又爽又黄网站免费观看| 国产成人精品一区二区三区视频| 久久女人网| 久久国产片| 高清无码视频在线免费观看| 大香蕉伊人视频| 丝袜制服中文字幕无码专区| 3DAV一区二区三区动漫| 久久久久女人精品毛片九一| 狠狠操2019| 亚州高清无码视频| 日韩欧美精品在线观看| 久久久精品国产| 青青在线| 国产成人AA| 日韩中文字幕视频在线| 就要操逼| caopeng97| 日韩av免费在线观看| 超碰9| 免费无码A片在线观看全| 日韩AⅤ视频| 操逼视频一级| 欧美日韩亚洲中文字幕| 人妻人人操人人爽| 天天爽天天操| 国产欧美日韩综合| 色丁香五月| 影音先锋在线视频观看| 边吃边摸| 久久无码一区| 日日射人妻| 四库影库| 欧美女人日逼视频| 亚洲自拍网站| 热久久久久| 天天色播| 亚欧在线视频| av不卡在线观看| 天天免费视频| 国产黄色视频在线免费观看| 成人在线视频观看| 婷婷五月大香蕉| 欧美视频在线观看一区| 久操免费观看| 亚洲AV成人精品一区二区三区| 狠狠撸视频| 欧美激情DVD| 婷婷五月伊人| 制服无码| 色图欧美色图| 97一区二区| 中文A片| 成人午夜天堂| 亚洲毛片在线| 中韩无码| 777免费观看成人电影视频| 无码中文字| 久久精品999| 国产成人精| 北条麻妃无码在线观看| 国产精品无码一区二区三| 2024国产精品| 黄色综合网| 河南少妇搡BBBB搡BBBB| 国产P片内射天涯海角| 欧美va亚洲va| 67194国产| 色天堂网| 亚洲品久久久蜜| 97精品人妻一区二区三区香蕉农 | 国产顶级理伦| 中文字幕婷婷五月天| 无码av一区二区| 中文在线观看视频| 色哥网在线一区| 无码中文综合成熟精品AV电影 | 91精品久久久久久久久久久久 | 午夜做爱视频| eeuss一区| 东京热久久综合色五月老师| 久久久久久久久久久久成人| 国产视频一二三| 色婷婷亚洲综合| 巨い巨乳の少妇あジed2k| 欧美男女操逼视频| 日韩视频网址| 亚洲欧洲视频| 日韩无码高清免费视频| 伊人久久精品| 777无码| 影音先锋成人在线| 国产青青操| 艹逼在线观看| 亚洲欧美日韩国产| 国产欧美一区二区人妻喷水| 蜜桃AV在线观看| 日操夜操| 国产三级片视频| 国产福利美女网站| 色噜噜人妻丝袜无码影院| 成人乱无码AV在线观看| 午夜福利100| 成年女人毛片| 成人小视频18| av免费网站| 一区二区av在线| 江苏妇搡BBB搡BBBB| 婷婷五月天社区| 一区二区成人免费视频| 骚逼逼影院| 啊啊啊网站| S牛牛AV| 久久国产精品99久久人人澡| 亚洲中文娱乐| 亚洲黄色在线| 亚洲视频在线观看网站| 不卡视频一区二区| 超碰人人干| 国产精品7777| 婷婷三级片| 亚洲精品国产精品国自产观看| 中文无码毛片| 国产日韩一区二区| 日韩一区二区视频| 亚洲黄片在线| 北条麻妃在线视频聊天| 男人先锋| 午夜福利视频无码| 日韩欧美第一页| 91日韩| 97av视频| WWW久久| 日韩性视频| 亚洲Av秘无码一区二区| 狠狠无码| 看国产AA免费| 婷婷五月天丁香在线| 91精品国产偷窥一区二区| 久久亚洲福利视频| 欧美A级成人婬片免费看| 蜜桃91精品秘成人取精库| 久久久久久97电影院电影院无码| 亚洲婷婷综合网| 九色PORNY9l原创自拍| 久久丁香五月天| 西西人体视频| 无码视频免费看| 国产福利美女网站| 中国黄色学生妹一级片| 中文字幕在线字幕中文乱码区别| 蜜桃免费网站| 伊人狠狠蜜桃亚洲综合| 一欧美日韩免费/看| 亚洲天堂成人在线| 亚洲精品97久久中文字幕| 九九九九精品视频| 黄色a级片| 婷婷五月天中文字幕| 无码69|