3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java集合篇:ConcurrentHashMap详解(JDK1.6)

發布時間:2024/9/30 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java集合篇:ConcurrentHashMap详解(JDK1.6) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(本文有關ConcurrentHashMap的源碼都是基于JDK1.6的)

(基于JDK1.8的版本可以參考這篇文章:https://blog.csdn.net/a745233700/article/details/83123359)

摘要:

  ConcurrentHashMap是J.U.C(java.util.concurrent包)的重要成員,它是HashMap的一個線程安全的、支持高效并發的版本。在默認理想狀態下,ConcurrentHashMap可以支持16個線程執行并發寫操作及任意數量線程的讀操作。本文將結合Java內存模型,分析JDK源代碼,探索ConcurrentHashMap高并發的具體實現機制,包括其在JDK中的定義和結構、并發存取、重哈希和跨段操作,并著重剖析了ConcurrentHashMap讀操作不需要加鎖和分段鎖機制的內在奧秘和原理。


一. ConcurrentHashMap 概述:

  HashMap 是 Java Collection Framework 的重要成員,也是Map族(如下圖所示)中我們最為常用的一種。不過遺憾的是,HashMap不是線程安全的。也就是說,在多線程環境下,操作HashMap會導致各種各樣的線程安全問題,比如在HashMap擴容重哈希時出現的死循環問題,臟讀問題等。HashMap的這一缺點往往會造成諸多不便,雖然在并發場景下HashTable和由同步包裝器包裝的HashMap(Collections.synchronizedMap(Map<K,V> m) )可以代替HashMap,但是它們都是通過使用一個全局的鎖來同步不同線程間的并發訪問,因此會帶來不可忽視的性能問題。慶幸的是,JDK為我們解決了這個問題,它為HashMap提供了一個線程安全的高效版本 —— ConcurrentHashMap。在ConcurrentHashMap中,無論是讀操作還是寫操作都能保證很高的性能:在進行讀操作時(幾乎)不需要加鎖,而在寫操作時通過鎖分段技術只對所操作的段加鎖而不影響客戶端對其它段的訪問。特別地,在理想狀態下,ConcurrentHashMap 可以支持 16 個線程執行并發寫操作(如果并發級別設為16),及任意數量線程的讀操作。

如下圖所示,ConcurrentHashMap本質上是一個Segment數組,而一個Segment實例又包含若干個桶,每個桶都包含一條由若干個HashEntry對象鏈接起來的鏈表。ConcurrentHashMap的高效并發機制是通過以下三方面來保證的(具體細節見后文闡述):

  • 通過鎖分段技術保證并發環境下的寫操作;
  • 通過HashEntry的不變形、volatile變量的內存可見性和加鎖重讀機制 保證高效、安全的讀操作;
  • 通過不加鎖和加鎖 兩種方案控制跨段操作的安全性。


二. HashMap 線程不安全的典型表現:

我們先回顧一下HashMap。HashMap是一個數組鏈表,當一個key/Value對被加入時,首先會通過Hash算法定位出這個鍵值對要被放入的桶,然后就把它插到相應桶中。如果這個桶中已經有元素了,那么發生了碰撞,這樣會在這個桶中形成一個鏈表。一般來說,當有數據要插入HashMap時,都會檢查容量有沒有超過設定的thredhold,如果超過,需要增大HashMap的尺寸,但是這樣一來,就需要對整個HashMap里的節點進行重哈希操作。在重哈希的過程中,就會出現HashMap線程不安全的典型表現 —— 死循環。

HashMap重哈希的關鍵源碼如下:

/*** Transfers all entries from current table to newTable.*/void transfer(Entry[] newTable) {// 將原數組 table 賦給數組 srcEntry[] src = table;int newCapacity = newTable.length;// 將數組 src 中的每條鏈重新添加到 newTable 中for (int j = 0; j < src.length; j++) {Entry<K,V> e = src[j];if (e != null) {src[j] = null; // src 回收// 將每條鏈的每個元素依次添加到 newTable 中相應的桶中do {Entry<K,V> next = e.next;// e.hash指的是 hash(key.hashCode())的返回值;// 計算在newTable中的位置,注意原來在同一條子鏈上的元素可能被分配到不同的桶中int i = indexFor(e.hash, newCapacity); e.next = newTable[i];newTable[i] = e;e = next;} while (e != null);}}}

1、單線程環境下的重哈希過程演示:

單線程情況下,rehash 不會出現任何問題,如上圖所示。假設hash算法就是最簡單的 key mod table.length(也就是桶的個數)。最上面的是old hash表,其中的Hash表桶的個數為2, 所以對于 key = 3、7、5 的鍵值對在 mod 2以后都沖突在table[1]這里了。接下來的三個步驟是,Hash表resize成4,然后對所有的鍵值對重哈希的過程。


2、多線程環境下的重哈希過程演示:

假設我們有兩個線程,我用紅色和淺藍色標注了一下,被這兩個線程共享的資源正是要被重哈希的原來1號桶中的Entry鏈。我們再回頭看一下我們的transfer代碼中的這個細節:

do {Entry<K,V> next = e.next; // <--假設線程一執行到這里就被調度掛起了int i = indexFor(e.hash, newCapacity);e.next = newTable[i];newTable[i] = e;e = next; } while (e != null);

而我們的線程二執行完成了,于是我們有下面的這個樣子:

注意,在Thread2重哈希后,Thread1的指針e和指針next分別指向了Thread2重組后的鏈表(e指向了key(3),而next指向了key(7))。此時,Thread1被調度回來執行:Thread1先是執行 newTalbe[i] = e;然后是e = next,導致了e指向了key(7),而下一次循環的next = e.next導致了next指向了key(3),如下圖所示:

這時,一切安好。Thread1有條不紊的工作著:把key(7)摘下來,放到newTable[i]的第一個,然后把e和next往下移,如下圖所示:

在此時,特別需要注意的是,當執行e.next = newTable[i]后,會導致 key(3).next 指向了 key(7),而此時的key(7).next 已經指向了key(3),環形鏈表就這樣出現了,如下圖所示。于是,當我們的Thread1調用HashMap.get(11)時,悲劇就出現了 —— Infinite Loop。

這是HashMap在并發環境下使用中最為典型的一個問題,就是在HashMap進行擴容重哈希時導致Entry鏈形成環。一旦Entry鏈中有環,勢必會導致在同一個桶中進行插入、查詢、刪除等操作時陷入死循環。


三. ConcurrentHashMap 在 JDK 中的定義:

為了更好的理解 ConcurrentHashMap 高并發的具體實現,我們先來了解它在JDK中的定義。ConcurrentHashMap類中包含兩個靜態內部類 HashEntry 和 Segment,其中 HashEntry 用來封裝具體的K/V對,是個典型的四元組;Segment 用來充當鎖的角色,每個 Segment 對象守護整個ConcurrentHashMap的若干個桶 (可以把Segment看作是一個小型的哈希表),其中每個桶是由若干個 HashEntry 對象鏈接起來的鏈表。總的來說,一個ConcurrentHashMap實例中包含由若干個Segment實例組成的數組,而一個Segment實例又包含由若干個桶,每個桶中都包含一條由若干個 HashEntry 對象鏈接起來的鏈表。特別地,ConcurrentHashMap 在默認并發級別下會創建16個Segment對象的數組,如果鍵能均勻散列,每個 Segment 大約守護整個散列表中桶總數的 1/16。


1、類結構定義:

ConcurrentHashMap 繼承了AbstractMap并實現了ConcurrentMap接口,其在JDK中的定義為:

public class ConcurrentHashMap<K, V> extends AbstractMap<K, V>implements ConcurrentMap<K, V>, Serializable {... }

2、成員變量定義:

HashMap相比,ConcurrentHashMap 增加了兩個屬性用于定位段,分別是 segmentMask 和 segmentShift。此外,不同于HashMap的是,ConcurrentHashMap底層結構是一個Segment數組,而不是Object數組,具體源碼如下:

/*** Mask value for indexing into segments. The upper bits of a* key's hash code are used to choose the segment.*/final int segmentMask; // 用于定位段,大小等于segments數組的大小減 1,是不可變的/*** Shift value for indexing within segments.*/final int segmentShift; // 用于定位段,大小等于32(hash值的位數)減去對segments的大小取以2為底的對數值,是不可變的/*** The segments, each of which is a specialized hash table*/final Segment<K,V>[] segments; // ConcurrentHashMap的底層結構是一個Segment數組

3、段的定義:Segment:

Segment 類繼承于 ReentrantLock 類,從而使得 Segment 對象能充當鎖的角色。每個 Segment 對象用來守護它的成員對象 table 中包含的若干個桶。table 是一個由 HashEntry 對象組成的鏈表數組,table 數組的每一個數組成員就是一個桶。

在Segment類中,count 變量是一個計數器,它表示每個 Segment 對象管理的 table 數組包含的 HashEntry 對象的個數,也就是 Segment 中包含的 HashEntry 對象的總數。特別需要注意的是,之所以在每個 Segment 對象中包含一個計數器,而不是在 ConcurrentHashMap 中使用全局的計數器,是對 ConcurrentHashMap 并發性的考慮:因為這樣當需要更新計數器時,不用鎖定整個ConcurrentHashMap。事實上,每次對段進行結構上的改變,如在段中進行增加/刪除節點(修改節點的值不算結構上的改變),都要更新count的值,此外,在JDK的實現中每次讀取操作開始都要先讀取count的值。特別需要注意的是,count是volatile的,這使得對count的任何更新對其它線程都是立即可見的。modCount用于統計段結構改變的次數,主要是為了檢測對多個段進行遍歷過程中某個段是否發生改變,這一點具體在談到跨段操作時會詳述。threashold用來表示段需要進行重哈希的閾值。loadFactor表示段的負載因子,其值等同于ConcurrentHashMap的負載因子的值。table是一個典型的鏈表數組,而且也是volatile的,這使得對table的任何更新對其它線程也都是立即可見的。段(Segment)的定義如下:

/*** Segments are specialized versions of hash tables. This* subclasses from ReentrantLock opportunistically, just to* simplify some locking and avoid separate construction.*/static final class Segment<K,V> extends ReentrantLock implements Serializable {/*** The number of elements in this segment's region.*/transient volatile int count; // Segment中元素的數量,可見的/*** Number of updates that alter the size of the table. This is* used during bulk-read methods to make sure they see a* consistent snapshot: If modCounts change during a traversal* of segments computing size or checking containsValue, then* we might have an inconsistent view of state so (usually)* must retry.*/transient int modCount; //對count的大小造成影響的操作的次數(比如put或者remove操作)/*** The table is rehashed when its size exceeds this threshold.* (The value of this field is always <tt>(int)(capacity ** loadFactor)</tt>.)*/transient int threshold; // 閾值,段中元素的數量超過這個值就會對Segment進行擴容/*** The per-segment table.*/transient volatile HashEntry<K,V>[] table; // 鏈表數組/*** The load factor for the hash table. Even though this value* is same for all segments, it is replicated to avoid needing* links to outer object.* @serial*/final float loadFactor; // 段的負載因子,其值等同于ConcurrentHashMap的負載因子...}

我們知道,ConcurrentHashMap允許多個修改(寫)操作并發進行,其關鍵在于使用了鎖分段技術,它使用了不同的鎖來控制對哈希表的不同部分進行的修改(寫),而 ConcurrentHashMap 內部使用段(Segment)來表示這些不同的部分。實際上,每個段實質上就是一個小的哈希表,每個段都有自己的鎖(Segment 類繼承了 ReentrantLock 類)。這樣,只要多個修改(寫)操作發生在不同的段上,它們就可以并發進行。下圖是依次插入 ABC 三個 HashEntry 節點后,Segment 的結構示意圖:


4、基本元素:HashEntry:

HashEntry用來封裝具體的鍵值對,是個典型的四元組。與HashMap中的Entry類似,HashEntry也包括同樣的四個域,分別是key、hash、value和next。不同的是,在HashEntry類中,key,hash和next域都被聲明為final的,value域被volatile所修飾,因此HashEntry對象幾乎是不可變的,這是ConcurrentHashmap讀操作并不需要加鎖的一個重要原因。next域被聲明為final本身就意味著我們不能從hash鏈的中間或尾部添加或刪除節點,因為這需要修改next引用值,因此所有的節點的修改只能從頭部開始。對于put操作,可以一律添加到Hash鏈的頭部。但是對于remove操作,可能需要從中間刪除一個節點,這就需要將要刪除節點的前面所有節點整個復制(重新new)一遍,最后一個節點指向要刪除結點的下一個結點(這在談到ConcurrentHashMap的刪除操作時還會詳述)。特別地,由于value域被volatile修飾,所以其可以確保被讀線程讀到最新的值,這是ConcurrentHashmap讀操作并不需要加鎖的另一個重要原因。實際上,ConcurrentHashMap完全允許多個讀操作并發進行,讀操作并不需要加鎖。HashEntry代表hash鏈中的一個節點,其結構如下所示:

/*** ConcurrentHashMap 中的 HashEntry 類* * ConcurrentHashMap list entry. Note that this is never exported* out as a user-visible Map.Entry.** Because the value field is volatile, not final, it is legal wrt* the Java Memory Model for an unsynchronized reader to see null* instead of initial value when read via a data race. Although a* reordering leading to this is not likely to ever actually* occur, the Segment.readValueUnderLock method is used as a* backup in case a null (pre-initialized) value is ever seen in* an unsynchronized access method.*/static final class HashEntry<K,V> {final K key; // 聲明 key 為 final 的final int hash; // 聲明 hash 值為 final 的volatile V value; // 聲明 value 被volatile所修飾final HashEntry<K,V> next; // 聲明 next 為 final 的HashEntry(K key, int hash, HashEntry<K,V> next, V value) {this.key = key;this.hash = hash;this.next = next;this.value = value;}@SuppressWarnings("unchecked")static final <K,V> HashEntry<K,V>[] newArray(int i) {return new HashEntry[i];}}

與HashMap類似,在ConcurrentHashMap中,如果在散列時發生碰撞,也會將碰撞的 HashEntry 對象鏈成一個鏈表。由于HashEntry的next域是final的,所以新節點只能在鏈表的表頭處插入。下圖是在一個空桶中依次插入 A,B,C 三個 HashEntry 對象后的結構圖(由于只能在表頭插入,所以鏈表中節點的順序和插入的順序相反):

與HashEntry不同的是,HashMap 中的 Entry 類結構如下所示:

/*** HashMap 中的 Entry 類*/static class Entry<K,V> implements Map.Entry<K,V> {final K key;V value;Entry<K,V> next;final int hash;/*** Creates new entry.*/Entry(int h, K k, V v, Entry<K,V> n) {value = v;next = n;key = k;hash = h;}...}

四. ConcurrentHashMap 的構造函數:

ConcurrentHashMap 一共提供了五個構造函數,其中默認無參的構造函數和參數為Map的構造函數 為 Java Collection Framework 規范的推薦實現,其余三個構造函數則是 ConcurrentHashMap 專門提供的。


1、ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel):

該構造函數意在構造一個具有指定容量、指定負載因子和指定段數目/并發級別(若不是2的冪次方,則會調整為2的冪次方)的空ConcurrentHashMap,其相關源碼如下:

/*** Creates a new, empty map with the specified initial* capacity, load factor and concurrency level.** @param initialCapacity the initial capacity. The implementation* performs internal sizing to accommodate this many elements.* @param loadFactor the load factor threshold, used to control resizing.* Resizing may be performed when the average number of elements per* bin exceeds this threshold.* @param concurrencyLevel the estimated number of concurrently* updating threads. The implementation performs internal sizing* to try to accommodate this many threads.* @throws IllegalArgumentException if the initial capacity is* negative or the load factor or concurrencyLevel are* nonpositive.*/public ConcurrentHashMap(int initialCapacity,float loadFactor, int concurrencyLevel) {if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)throw new IllegalArgumentException();if (concurrencyLevel > MAX_SEGMENTS) concurrencyLevel = MAX_SEGMENTS;// Find power-of-two sizes best matching argumentsint sshift = 0; // 大小為 lg(ssize) int ssize = 1; // 段的數目,segments數組的大小(2的冪次方)while (ssize < concurrencyLevel) {++sshift;ssize <<= 1;}segmentShift = 32 - sshift; // 用于定位段segmentMask = ssize - 1; // 用于定位段this.segments = Segment.newArray(ssize); // 創建segments數組if (initialCapacity > MAXIMUM_CAPACITY)initialCapacity = MAXIMUM_CAPACITY;int c = initialCapacity / ssize; // 總的桶數/總的段數if (c * ssize < initialCapacity)++c;int cap = 1; // 每個段所擁有的桶的數目(2的冪次方)while (cap < c)cap <<= 1;for (int i = 0; i < this.segments.length; ++i) // 初始化segments數組this.segments[i] = new Segment<K,V>(cap, loadFactor);}

2、ConcurrentHashMap(int initialCapacity, float loadFactor):

該構造函數意在構造一個具有指定容量、指定負載因子和默認并發級別(16)的空ConcurrentHashMap,其相關源碼如下:

/*** Creates a new, empty map with the specified initial capacity* and load factor and with the default concurrencyLevel (16).** @param initialCapacity The implementation performs internal* sizing to accommodate this many elements.* @param loadFactor the load factor threshold, used to control resizing.* Resizing may be performed when the average number of elements per* bin exceeds this threshold.* @throws IllegalArgumentException if the initial capacity of* elements is negative or the load factor is nonpositive** @since 1.6*/public ConcurrentHashMap(int initialCapacity, float loadFactor) {this(initialCapacity, loadFactor, DEFAULT_CONCURRENCY_LEVEL); // 默認并發級別為16}

3、ConcurrentHashMap(int initialCapacity):

該構造函數意在構造一個具有指定容量、默認負載因子(0.75)和默認并發級別(16)的空ConcurrentHashMap,其相關源碼如下:

/*** Creates a new, empty map with the specified initial capacity,* and with default load factor (0.75) and concurrencyLevel (16).** @param initialCapacity the initial capacity. The implementation* performs internal sizing to accommodate this many elements.* @throws IllegalArgumentException if the initial capacity of* elements is negative.*/public ConcurrentHashMap(int initialCapacity) {this(initialCapacity, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);}

4、ConcurrentHashMap():

該構造函數意在構造一個具有默認初始容量(16)、默認負載因子(0.75)和默認并發級別(16)的空ConcurrentHashMap,其相關源碼如下:

/*** Creates a new, empty map with a default initial capacity (16),* load factor (0.75) and concurrencyLevel (16).*/public ConcurrentHashMap() {this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);}

5、ConcurrentHashMap(Map<? extends K, ? extends V> m):

該構造函數意在構造一個與指定 Map 具有相同映射的 ConcurrentHashMap,其初始容量不小于 16 (具體依賴于指定Map的大小),負載因子是 0.75,并發級別是 16, 是 Java Collection Framework 規范推薦提供的,其源碼如下:

/*** Creates a new map with the same mappings as the given map.* The map is created with a capacity of 1.5 times the number* of mappings in the given map or 16 (whichever is greater),* and a default load factor (0.75) and concurrencyLevel (16).** @param m the map*/public ConcurrentHashMap(Map<? extends K, ? extends V> m) {this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1,DEFAULT_INITIAL_CAPACITY),DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);putAll(m);}

在這里,我們提到了三個非常重要的參數:初始容量、負載因子 和 并發級別,這三個參數是影響ConcurrentHashMap性能的重要參數。從上述源碼我們可以看出,ConcurrentHashMap 也正是通過initialCapacity、loadFactor和concurrencyLevel這三個參數進行構造并初始化segments數組、段偏移量segmentShift、段掩碼segmentMask和每個segment的。


五. ConcurrentHashMap 的數據結構:

本質上,ConcurrentHashMap就是一個Segment數組,而一個Segment實例則是一個小的哈希表。由于Segment類繼承于ReentrantLock類,從而使得Segment對象能充當鎖的角色,這樣,每個 Segment對象就可以守護整個ConcurrentHashMap的若干個桶,其中每個桶是由若干個HashEntry 對象鏈接起來的鏈表。通過使用段(Segment)將ConcurrentHashMap劃分為不同的部分,ConcurrentHashMap就可以使用不同的鎖來控制對哈希表的不同部分的修改,從而允許多個修改操作并發進行, 這正是ConcurrentHashMap鎖分段技術的核心內涵。進一步地,如果把整個ConcurrentHashMap看作是一個父哈希表的話,那么每個Segment就可以看作是一個子哈希表,如下圖所示:

注意,假設ConcurrentHashMap一共分為2^n個段,每個段中有2^m個桶,那么段的定位方式是將key的hash值的高n位與(2^n-1)相與。在定位到某個段后,再將key的hash值的低m位與(2^m-1)相與,定位到具體的桶位。


六. ConcurrentHashMap 的并發存取:

在ConcurrentHashMap中,線程對映射表做讀操作時,一般情況下不需要加鎖就可以完成,對容器做結構性修改的操作(比如,put操作、remove操作等)才需要加鎖。


1、用分段鎖機制實現多個線程間的并發寫操作: put(key, vlaue):

在ConcurrentHashMap中,典型結構性修改操作包括put、remove和clear,下面我們首先以put操作為例說明對ConcurrentHashMap做結構性修改的過程。ConcurrentHashMap的put操作對應的源碼如下:

/*** Maps the specified key to the specified value in this table.* Neither the key nor the value can be null.** <p> The value can be retrieved by calling the <tt>get</tt> method* with a key that is equal to the original key.** @param key key with which the specified value is to be associated* @param value value to be associated with the specified key* @return the previous value associated with <tt>key</tt>, or* <tt>null</tt> if there was no mapping for <tt>key</tt>* @throws NullPointerException if the specified key or value is null*/public V put(K key, V value) {if (value == null)throw new NullPointerException();int hash = hash(key.hashCode());return segmentFor(hash).put(key, hash, value, false);}

從上面的源碼我們看到,ConcurrentHashMap不同于HashMap,它既不允許key值為null,也不允許value值為null。此外,我們還可以看到,實際上我們對ConcurrentHashMap的put操作被ConcurrentHashMap委托給特定的段來實現。也就是說,當我們向ConcurrentHashMap中put一個Key/Value對時,首先會獲得Key的哈希值并對其再次哈希,然后根據最終的hash值定位到這條記錄所應該插入的段,定位段的segmentFor()方法源碼如下:

/*** Returns the segment that should be used for key with given hash* @param hash the hash code for the key* @return the segment*/final Segment<K,V> segmentFor(int hash) {return segments[(hash >>> segmentShift) & segmentMask];}

segmentFor()方法根據傳入的hash值向右無符號右移segmentShift位,然后和segmentMask進行與操作就可以定位到特定的段。在這里,假設Segment的數量(segments數組的長度)是2的n次方(Segment的數量總是2的倍數,具體見構造函數的實現),那么segmentShift的值就是32-n(hash值的位數是32),而segmentMask的值就是2^n-1(寫成二進制的形式就是n個1)。進一步地,我們就可以得出以下結論:根據key的hash值的高n位就可以確定元素到底在哪一個Segment中。緊接著,調用這個段的put()方法來將目標Key/Value對插到段中,段的put()方法的源碼如下所示:
?

V put(K key, int hash, V value, boolean onlyIfAbsent) {lock(); // 上鎖try {int c = count;if (c++ > threshold) // ensure capacityrehash();HashEntry<K,V>[] tab = table; // table是Volatile的int index = hash & (tab.length - 1); // 定位到段中特定的桶HashEntry<K,V> first = tab[index]; // first指向桶中鏈表的表頭HashEntry<K,V> e = first;// 檢查該桶中是否存在相同key的結點while (e != null && (e.hash != hash || !key.equals(e.key))) e = e.next;V oldValue;if (e != null) { // 該桶中存在相同key的結點oldValue = e.value;if (!onlyIfAbsent)e.value = value; // 更新value值}else { // 該桶中不存在相同key的結點oldValue = null;++modCount; // 結構性修改,modCount加1tab[index] = new HashEntry<K,V>(key, hash, first, value); // 創建HashEntry并將其鏈到表頭count = c; //write-volatile,count值的更新一定要放在最后一步(volatile變量)}return oldValue; // 返回舊值(該桶中不存在相同key的結點,則返回null)} finally {unlock(); // 在finally子句中解鎖}}

從源碼中首先可以知道,ConcurrentHashMap對Segment的put操作是加鎖完成的。在第二節我們已經知道,Segment是ReentrantLock的子類,因此Segment本身就是一種可重入的Lock,所以我們可以直接調用其繼承而來的lock()方法和unlock()方法對代碼進行上鎖/解鎖。需要注意的是,這里的加鎖操作是針對某個具體的Segment,鎖定的也是該Segment而不是整個ConcurrentHashMap。因為插入鍵/值對操作只是在這個Segment包含的某個桶中完成,不需要鎖定整個ConcurrentHashMap。因此,其他寫線程對另外15個Segment的加鎖并不會因為當前線程對這個Segment的加鎖而阻塞。故而 相比較于 HashTable 和由同步包裝器包裝的HashMap每次只能有一個線程執行讀或寫操作,ConcurrentHashMap 在并發訪問性能上有了質的提高。在理想狀態下,ConcurrentHashMap 可以支持 16 個線程執行并發寫操作(如果并發級別設置為 16),及任意數量線程的讀操作。

在將Key/Value對插入到Segment之前,首先會檢查本次插入會不會導致Segment中元素的數量超過閾值threshold,如果會,那么就先對Segment進行擴容和重哈希操作,然后再進行插入。重哈希操作暫且不表,稍后詳述。第8和第9行的操作就是定位到段中特定的桶并確定鏈表頭部的位置。第12行的while循環用于檢查該桶中是否存在相同key的結點,如果存在,就直接更新value值;如果沒有找到,則進入21行生成一個新的HashEntry并且把它鏈到該桶中鏈表的表頭,然后再更新count的值(由于count是volatile變量,所以count值的更新一定要放在最后一步)。

 到此為止,除了重哈希操作,ConcurrentHashMap的put操作已經介紹完了。此外,在ConcurrentHashMap中,修改操作還包括putAll()和replace()。其中,putAll()操作就是多次調用put方法,而replace()操作實現要比put()操作簡單得多,此不贅述。


2、ConcurrentHashMap 的重哈希操作 : rehash():

上面敘述到,在ConcurrentHashMap中使用put操作插入Key/Value對之前,首先會檢查本次插入會不會導致Segment中節點數量超過閾值threshold,如果會,那么就先對Segment進行擴容和重哈希操作。特別需要注意的是,ConcurrentHashMap的重哈希實際上是對ConcurrentHashMap的某個段的重哈希,因此ConcurrentHashMap的每個段所包含的桶位自然也就不盡相同。針對段進行rehash()操作的源碼如下:

void rehash() {HashEntry<K,V>[] oldTable = table; // 擴容前的tableint oldCapacity = oldTable.length;if (oldCapacity >= MAXIMUM_CAPACITY) // 已經擴到最大容量,直接返回return;/** Reclassify nodes in each list to new Map. Because we are* using power-of-two expansion, the elements from each bin* must either stay at same index, or move with a power of two* offset. We eliminate unnecessary node creation by catching* cases where old nodes can be reused because their next* fields won't change. Statistically, at the default* threshold, only about one-sixth of them need cloning when* a table doubles. The nodes they replace will be garbage* collectable as soon as they are no longer referenced by any* reader thread that may be in the midst of traversing table* right now.*/// 新創建一個table,其容量是原來的2倍HashEntry<K,V>[] newTable = HashEntry.newArray(oldCapacity<<1); threshold = (int)(newTable.length * loadFactor); // 新的閾值int sizeMask = newTable.length - 1; // 用于定位桶for (int i = 0; i < oldCapacity ; i++) {// We need to guarantee that any existing reads of old Map can// proceed. So we cannot yet null out each bin.HashEntry<K,V> e = oldTable[i]; // 依次指向舊table中的每個桶的鏈表表頭if (e != null) { // 舊table的該桶中鏈表不為空HashEntry<K,V> next = e.next;int idx = e.hash & sizeMask; // 重哈希已定位到新桶if (next == null) // 舊table的該桶中只有一個節點newTable[idx] = e;else { // Reuse trailing consecutive sequence at same slotHashEntry<K,V> lastRun = e;int lastIdx = idx;for (HashEntry<K,V> last = next;last != null;last = last.next) {int k = last.hash & sizeMask;// 尋找k值相同的子鏈,該子鏈尾節點與父鏈的尾節點必須是同一個if (k != lastIdx) {lastIdx = k;lastRun = last;}}// JDK直接將子鏈lastRun放到newTable[lastIdx]桶中newTable[lastIdx] = lastRun;// 對該子鏈之前的結點,JDK會挨個遍歷并把它們復制到新桶中for (HashEntry<K,V> p = e; p != lastRun; p = p.next) {int k = p.hash & sizeMask;HashEntry<K,V> n = newTable[k];newTable[k] = new HashEntry<K,V>(p.key, p.hash,n, p.value);}}}}table = newTable; // 擴容完成}

其實JDK官方的注釋已經解釋的很清楚了。由于擴容是按照2的冪次方進行的,所以擴展前在同一個桶中的元素,現在要么還是在原來的序號的桶里,或者就是原來的序號再加上一個2的冪次方,就這兩種選擇。根據本文前面對HashEntry的介紹,我們知道鏈接指針next是final的,因此看起來我們好像只能把該桶的HashEntry鏈中的每個節點復制到新的桶中(這意味著我們要重新創建每個節點),但事實上JDK對其做了一定的優化。因為在理論上原桶里的HashEntry鏈可能存在一條子鏈,這條子鏈上的節點都會被重哈希到同一個新的桶中,這樣我們只要拿到該子鏈的頭結點就可以直接把該子鏈放到新的桶中,從而避免了一些節點不必要的創建,提升了一定的效率。因此,JDK為了提高效率,它會首先去查找這樣的一個子鏈,而且這個子鏈的尾節點必須與原hash鏈的尾節點是同一個,那么就只需要把這個子鏈的頭結點放到新的桶中,其后面跟的一串子節點自然也就連接上了。對于這個子鏈頭結點之前的結點,JDK會挨個遍歷并把它們復制到新桶的鏈頭(只能在表頭插入元素)中。特別地,我們注意這段代碼:

for (HashEntry<K,V> last = next;last != null;last = last.next) {int k = last.hash & sizeMask;if (k != lastIdx) {lastIdx = k;lastRun = last;} } newTable[lastIdx] = lastRun;

在該代碼段中,JDK直接將子鏈lastRun放到newTable[lastIdx]桶中,難道這個操作不會覆蓋掉newTable[lastIdx]桶中原有的元素么?事實上,這種情形時不可能出現的,因為桶newTable[lastIdx]在子鏈添加進去之前壓根就不會有節點存在,這還是因為table的大小是按照2的冪次方的方式去擴展的。假設原來table的大小是2^k大小,那么現在新table的大小是2^(k+1)大小,而定位桶的方式是:

// sizeMask = newTable.length - 1,即 sizeMask = 11...1,共k+1個1。 int idx = e.hash & sizeMask;

因此這樣得到的idx實際上就是key的hash值的低k+1位的值,而原table的sizeMask也全是1的二進制,不過總共是k位,那么原table的idx就是key的hash值的低k位的值。所以,如果元素的hashcode的第k+1位是0,那么元素在新桶的序號就是和原桶的序號是相等的;如果第k+1位的值是1,那么元素在新桶的序號就是原桶的序號加上2^k。因此,JDK直接將子鏈lastRun放到newTable[lastIdx]桶中就沒問題了,因為newTable中新序號處此時肯定是空的。


3、ConcurrentHashMap 的讀取實現 :get(Object key):

與put操作類似,當我們從ConcurrentHashMap中查詢一個指定Key的鍵值對時,首先會定位其應該存在的段,然后查詢請求委托給這個段進行處理,源碼如下:

/*** Returns the value to which the specified key is mapped,* or {@code null} if this map contains no mapping for the key.** <p>More formally, if this map contains a mapping from a key* {@code k} to a value {@code v} such that {@code key.equals(k)},* then this method returns {@code v}; otherwise it returns* {@code null}. (There can be at most one such mapping.)** @throws NullPointerException if the specified key is null*/public V get(Object key) {int hash = hash(key.hashCode());return segmentFor(hash).get(key, hash);}

我們緊接著研讀Segment中get操作的源碼:

V get(Object key, int hash) {if (count != 0) { // read-volatile,首先讀 count 變量HashEntry<K,V> e = getFirst(hash); // 獲取桶中鏈表頭結點while (e != null) {if (e.hash == hash && key.equals(e.key)) { // 查找鏈中是否存在指定Key的鍵值對V v = e.value;if (v != null) // 如果讀到value域不為 null,直接返回return v; // 如果讀到value域為null,說明發生了重排序,加鎖后重新讀取return readValueUnderLock(e); // recheck}e = e.next;}}return null; // 如果不存在,直接返回null}

了解了ConcurrentHashMap的put操作后,上述源碼就很好理解了。但是有一個情況需要特別注意,就是鏈中存在指定Key的鍵值對并且其對應的Value值為null的情況。在剖析ConcurrentHashMap的put操作時,我們就知道ConcurrentHashMap不同于HashMap,它既不允許key值為null,也不允許value值為null。但是,此處怎么會存在鍵值對存在且的Value值為null的情形呢?JDK官方給出的解釋是,這種情形發生的場景是:初始化HashEntry時發生的指令重排序導致的,也就是在HashEntry初始化完成之前便返回了它的引用。這時,JDK給出的解決之道就是加鎖重讀,源碼如下:

/*** Reads value field of an entry under lock. Called if value* field ever appears to be null. This is possible only if a* compiler happens to reorder a HashEntry initialization with* its table assignment, which is legal under memory model* but is not known to ever occur.*/V readValueUnderLock(HashEntry<K,V> e) {lock();try {return e.value;} finally {unlock();}}

4、ConcurrentHashMap 存取小結:

在ConcurrentHashMap進行存取時,首先會定位到具體的段,然后通過對具體段的存取來完成對整個ConcurrentHashMap的存取。特別地,無論是ConcurrentHashMap的讀操作還是寫操作都具有很高的性能:在進行讀操作時不需要加鎖,而在寫操作時通過鎖分段技術只對所操作的段加鎖而不影響客戶端對其它段的訪問。


七. ConcurrentHashMap 讀操作不需要加鎖的奧秘:

在本文第二節,我們介紹到HashEntry對象幾乎是不可變的(只能改變Value的值),因為HashEntry中的key、hash和next指針都是final的。這意味著,我們不能把節點添加到鏈表的中間和尾部,也不能在鏈表的中間和尾部刪除節點。這個特性可以保證:在訪問某個節點時,這個節點之后的鏈接不會被改變,這個特性可以大大降低處理鏈表時的復雜性。與此同時,由于HashEntry類的value字段被聲明是Volatile的,因此Java的內存模型就可以保證:某個寫線程對value字段的寫入馬上就可以被后續的某個讀線程看到。此外,由于在ConcurrentHashMap中不允許用null作為鍵和值,所以當讀線程讀到某個HashEntry的value為null時,便知道產生了沖突 —— 發生了重排序現象,此時便會加鎖重新讀入這個value值。這些特性互相配合,使得讀線程即使在不加鎖狀態下,也能正確訪問 ConcurrentHashMap。總的來說,ConcurrentHashMap讀操作不需要加鎖的奧秘在于以下三點:

  • 用HashEntery對象的不變性來降低讀操作對加鎖的需求;

  • 用Volatile變量協調讀寫線程間的內存可見性;

  • 若讀時發生指令重排序現象,則加鎖重讀;


由于我們在介紹ConcurrentHashMap的get操作時,已經介紹到了第三點,此不贅述。下面我們結合前兩點分別從線程寫入的兩種角度 —— 對散列表做非結構性修改的操作和對散列表做結構性修改的操作來分析ConcurrentHashMap是如何保證高效讀操作的。


1、用HashEntery對象的不變性來降低讀操作對加鎖的需求:

結構性修改操作只是更改某個HashEntry的value字段的值。由于對Volatile變量的寫入操作將與隨后對這個變量的讀操作進行同步,所以當一個寫線程修改了某個HashEntry的value字段后,Java內存模型能夠保證讀線程一定能讀取到這個字段更新后的值。所以,寫線程對鏈表的非結構性修改能夠被后續不加鎖的讀線程看到。

對ConcurrentHashMap做結構性修改時,實質上是對某個桶指向的鏈表做結構性修改。如果能夠確保在讀線程遍歷一個鏈表期間,寫線程對這個鏈表所做的結構性修改不影響讀線程繼續正常遍歷這個鏈表,那么讀/寫線程之間就可以安全并發訪問這個ConcurrentHashMap。在ConcurrentHashMap中,結構性修改操作包括put操作、remove操作和clear操作,下面我們分別分析這三個操作:

  • clear操作只是把ConcurrentHashMap中所有的桶置空,每個桶之前引用的鏈表依然存在,只是桶不再引用這些鏈表而已,而鏈表本身的結構并沒有發生任何修改。因此,正在遍歷某個鏈表的讀線程依然可以正常執行對該鏈表的遍歷。
  • 關于put操作的細節我們在上文已經單獨介紹過,我們知道put操作如果需要插入一個新節點到鏈表中時會在鏈表頭部插入這個新節點,此時鏈表中的原有節點的鏈接并沒有被修改。也就是說,插入新的健/值對到鏈表中的操作不會影響讀線程正常遍歷這個鏈表。

下面來分析 remove 操作,先讓我們來看看 remove 操作的源代碼實現:

/*** Removes the key (and its corresponding value) from this map.* This method does nothing if the key is not in the map.** @param key the key that needs to be removed* @return the previous value associated with <tt>key</tt>, or* <tt>null</tt> if there was no mapping for <tt>key</tt>* @throws NullPointerException if the specified key is null*/public V remove(Object key) {int hash = hash(key.hashCode());return segmentFor(hash).remove(key, hash, null);}

同樣地,在ConcurrentHashMap中刪除一個鍵值對時,首先需要定位到特定的段并將刪除操作委派給該段。Segment的remove操作如下所示:

/*** Remove; match on key only if value null, else match both.*/V remove(Object key, int hash, Object value) {lock(); // 加鎖try {int c = count - 1; HashEntry<K,V>[] tab = table;int index = hash & (tab.length - 1); // 定位桶HashEntry<K,V> first = tab[index];HashEntry<K,V> e = first;while (e != null && (e.hash != hash || !key.equals(e.key))) // 查找待刪除的鍵值對e = e.next;V oldValue = null;if (e != null) { // 找到V v = e.value;if (value == null || value.equals(v)) {oldValue = v;// All entries following removed node can stay// in list, but all preceding ones need to be// cloned.++modCount;// 所有處于待刪除節點之后的節點原樣保留在鏈表中HashEntry<K,V> newFirst = e.next;// 所有處于待刪除節點之前的節點被克隆到新鏈表中for (HashEntry<K,V> p = first; p != e; p = p.next)newFirst = new HashEntry<K,V>(p.key, p.hash,newFirst, p.value); tab[index] = newFirst; // 將刪除指定節點并重組后的鏈重新放到桶中count = c; // write-volatile,更新Volatile變量count}}return oldValue;} finally {unlock(); // finally子句解鎖}}

我們可以看出,刪除節點C之后的所有節點原樣保留到新鏈表中;刪除節點C之前的每個節點被克隆到新鏈表中(它們在新鏈表中的鏈接順序被反轉了)。因此,在執行remove操作時,原始鏈表并沒有被修改,也就是說,讀線程不會受同時執行 remove 操作的并發寫線程的干擾。

綜合上面的分析我們可以知道,無論寫線程對某個鏈表進行結構性修改還是非結構性修改,都不會影響其他的并發讀線程對這個鏈表的訪問。


2、用 Volatile 變量協調讀寫線程間的內存可見性:

一般地,由于內存可見性問題,在未正確同步的情況下,對于寫線程寫入的值讀線程可能并不能及時讀到。下面以寫線程M和讀線程N來說明ConcurrentHashMap如何協調讀/寫線程間的內存可見性問題,如下圖所示:

假設線程M在寫入了volatile變量count后,線程N讀取了這個volatile變量。根據 happens-before 關系法則中的程序次序法則,A appens-before 于 B,C happens-before D。根據 Volatile法則,B happens-before C。結合傳遞性,則可得到:A appens-before 于 B; B appens-before C;C happens-before D。也就是說,寫線程M對鏈表做的結構性修改對讀線程N是可見的。雖然線程N是在未加鎖的情況下訪問鏈表,但Java的內存模型可以保證:只要之前對鏈表做結構性修改操作的寫線程M在退出寫方法前寫volatile變量count,讀線程N就能讀取到這個volatile變量count的最新值。

事實上,ConcurrentHashMap就是一個Segment數組,而每個Segment都有一個volatile變量count去統計Segment中的HashEntry的個數。并且,在ConcurrentHashMap中,所有不加鎖讀方法在進入讀方法時,首先都會去讀這個count變量。比如我們在上一節提到的get方法:

V get(Object key, int hash) {if (count != 0) { // read-volatile,首先讀 count 變量HashEntry<K,V> e = getFirst(hash); // 獲取桶中鏈表頭結點while (e != null) {if (e.hash == hash && key.equals(e.key)) { // 查找鏈中是否存在指定Key的鍵值對V v = e.value;if (v != null) // 如果讀到value域不為 null,直接返回return v; // 如果讀到value域為null,說明發生了重排序,加鎖后重新讀取return readValueUnderLock(e); // recheck}e = e.next;}}return null; // 如果不存在,直接返回null}

3、小結:

在ConcurrentHashMap中,所有執行寫操作的方法(put、remove和clear)在對鏈表做結構性修改之后,在退出寫方法前都會去寫這個count變量;所有未加鎖的讀操作(get、contains和containsKey)在讀方法中,都會首先去讀取這個count變量。根據 Java 內存模型,對同一個 volatile 變量的寫/讀操作可以確保:寫線程寫入的值,能夠被之后未加鎖的讀線程“看到”。這個特性和前面介紹的HashEntry對象的不變性相結合,使得在ConcurrentHashMap中讀線程進行讀取操作時基本不需要加鎖就能成功獲得需要的值。這兩個特性以及加鎖重讀機制的互相配合,不僅減少了請求同一個鎖的頻率(讀操作一般不需要加鎖就能夠成功獲得值),也減少了持有同一個鎖的時間(只有讀到 value 域的值為 null 時 , 讀線程才需要加鎖后重讀)。


八. ConcurrentHashMap 的跨段操作:

在ConcurrentHashMap中,有些操作需要涉及到多個段,比如說size操作、containsValaue操作等。以size操作為例,如果我們要統計整個ConcurrentHashMap里元素的大小,那么就必須統計所有Segment里元素的大小后求和。我們知道,Segment里的全局變量count是一個volatile變量,那么在多線程場景下,我們是不是直接把所有Segment的count相加就可以得到整個ConcurrentHashMap大小了呢?顯然不能,雖然相加時可以獲取每個Segment的count的最新值,但是拿到之后可能累加前使用的count發生了變化,那么統計結果就不準了。所以最安全的做法,是在統計size的時候把所有Segment的put,remove和clean方法全部鎖住,但是這種做法顯然非常低效。那么,我們還是看一下JDK是如何實現size()方法的吧:
?

/*** Returns the number of key-value mappings in this map. If the* map contains more than <tt>Integer.MAX_VALUE</tt> elements, returns* <tt>Integer.MAX_VALUE</tt>.** @return the number of key-value mappings in this map*/public int size() {final Segment<K,V>[] segments = this.segments;long sum = 0;long check = 0;int[] mc = new int[segments.length];// Try a few times to get accurate count. On failure due to// continuous async changes in table, resort to locking.for (int k = 0; k < RETRIES_BEFORE_LOCK; ++k) {check = 0;sum = 0;int mcsum = 0;for (int i = 0; i < segments.length; ++i) {sum += segments[i].count; mcsum += mc[i] = segments[i].modCount; // 在統計size時記錄modCount}if (mcsum != 0) {for (int i = 0; i < segments.length; ++i) {check += segments[i].count;if (mc[i] != segments[i].modCount) { // 統計size后比較各段的modCount是否發生變化check = -1; // force retrybreak;}}}if (check == sum)// 如果統計size前后各段的modCount沒變,且兩次得到的總數一致,直接返回break;}if (check != sum) { // Resort to locking all segments // 加鎖統計sum = 0;for (int i = 0; i < segments.length; ++i)segments[i].lock();for (int i = 0; i < segments.length; ++i)sum += segments[i].count;for (int i = 0; i < segments.length; ++i)segments[i].unlock();}if (sum > Integer.MAX_VALUE)return Integer.MAX_VALUE;elsereturn (int)sum;}

size方法主要思路是先在沒有鎖的情況下對所有段大小求和,這種求和策略最多執行RETRIES_BEFORE_LOCK次(默認是兩次):在沒有達到RETRIES_BEFORE_LOCK之前,求和操作會不斷嘗試執行(這是因為遍歷過程中可能有其它線程正在對已經遍歷過的段進行結構性更新);在超過RETRIES_BEFORE_LOCK之后,如果還不成功就在持有所有段鎖的情況下再對所有段大小求和。事實上,在累加count操作過程中,之前累加過的count發生變化的幾率非常小,所以ConcurrentHashMap的做法是先嘗試RETRIES_BEFORE_LOCK次通過不鎖住Segment的方式來統計各個Segment大小,如果統計的過程中,容器的count發生了變化,則再采用加鎖的方式來統計所有Segment的大小。

那么,ConcurrentHashMap是如何判斷在統計的時候容器的段發生了結構性更新了呢?我們在前文中已經知道,Segment包含一個modCount成員變量,在會引起段發生結構性改變的所有操作(put操作、 remove操作和clean操作)里,都會將變量modCount進行加1,因此,JDK只需要在統計size前后比較modCount是否發生變化就可以得知容器的大小是否發生變化。

至于ConcurrentHashMap的跨其他跨段操作,比如contains操作、containsValaue操作等,其與size操作的實現原理相類似,此不贅述。

總結

以上是生活随笔為你收集整理的Java集合篇:ConcurrentHashMap详解(JDK1.6)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

人人妻人人澡人人爽欧美一区九九 | 欧美午夜特黄aaaaaa片 | 国产成人人人97超碰超爽8 | 久久久www成人免费毛片 | 国产精品成人av在线观看 | 久久久久久久久蜜桃 | 精品无码av一区二区三区 | 色一情一乱一伦 | 国内少妇偷人精品视频免费 | 色婷婷综合中文久久一本 | 中文字幕人妻丝袜二区 | 无遮挡啪啪摇乳动态图 | 玩弄少妇高潮ⅹxxxyw | 久久精品中文闷骚内射 | 色妞www精品免费视频 | 国产超级va在线观看视频 | aⅴ亚洲 日韩 色 图网站 播放 | 国产成人无码av一区二区 | 性欧美疯狂xxxxbbbb | 久久久国产一区二区三区 | 乱码av麻豆丝袜熟女系列 | 国产精品高潮呻吟av久久4虎 | 成熟人妻av无码专区 | 久久久久久a亚洲欧洲av冫 | 亚洲国产精品无码久久久久高潮 | 女人和拘做爰正片视频 | 欧美日本精品一区二区三区 | 成人av无码一区二区三区 | 国产超级va在线观看视频 | 丰满少妇人妻久久久久久 | 成在人线av无码免观看麻豆 | 欧美人妻一区二区三区 | 欧美精品免费观看二区 | 国产精品办公室沙发 | 精品久久久久久人妻无码中文字幕 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲国产精品美女久久久久 | 性欧美牲交在线视频 | 久热国产vs视频在线观看 | 国产午夜精品一区二区三区嫩草 | 图片小说视频一区二区 | 国内精品久久毛片一区二区 | 色婷婷久久一区二区三区麻豆 | 国产精品人人妻人人爽 | 国产午夜福利亚洲第一 | 女人色极品影院 | 日产精品99久久久久久 | 日韩av无码中文无码电影 | 少妇厨房愉情理9仑片视频 | 男女爱爱好爽视频免费看 | 国产精品国产三级国产专播 | 欧美国产日产一区二区 | 午夜精品一区二区三区的区别 | 国产成人综合美国十次 | 久久aⅴ免费观看 | 波多野结衣av在线观看 | 波多野结衣高清一区二区三区 | 亚洲另类伦春色综合小说 | 精品国产麻豆免费人成网站 | 欧美三级a做爰在线观看 | 国产绳艺sm调教室论坛 | 日韩在线不卡免费视频一区 | 娇妻被黑人粗大高潮白浆 | 色一情一乱一伦一区二区三欧美 | 欧美人妻一区二区三区 | 人妻少妇被猛烈进入中文字幕 | 在线观看欧美一区二区三区 | 欧美 丝袜 自拍 制服 另类 | 亚洲日韩精品欧美一区二区 | 亚洲一区二区三区在线观看网站 | 精品无码成人片一区二区98 | 男人和女人高潮免费网站 | 国产精品国产自线拍免费软件 | 国产黑色丝袜在线播放 | 欧美freesex黑人又粗又大 | 国产成人午夜福利在线播放 | 中文字幕+乱码+中文字幕一区 | 国产乱人伦偷精品视频 | 国产精品久久精品三级 | 国产精品久久精品三级 | 国产极品视觉盛宴 | 精品国产一区二区三区四区 | 久久久久久久久888 | 国产精品无码久久av | 999久久久国产精品消防器材 | 国产成人无码区免费内射一片色欲 | 国产人妻精品午夜福利免费 | 国产亚洲精品久久久久久 | 亚洲 激情 小说 另类 欧美 | 少妇邻居内射在线 | 帮老师解开蕾丝奶罩吸乳网站 | 精品无人区无码乱码毛片国产 | 国内精品久久毛片一区二区 | 又大又紧又粉嫩18p少妇 | 少妇性俱乐部纵欲狂欢电影 | 日本丰满熟妇videos | 日本一卡二卡不卡视频查询 | 欧美 亚洲 国产 另类 | 香蕉久久久久久av成人 | 国产午夜亚洲精品不卡 | 国产又爽又黄又刺激的视频 | 女人高潮内射99精品 | 亚洲第一网站男人都懂 | 四十如虎的丰满熟妇啪啪 | 99久久久无码国产aaa精品 | 亚洲 a v无 码免 费 成 人 a v | 三级4级全黄60分钟 | 久久综合激激的五月天 | 精品国产精品久久一区免费式 | 午夜性刺激在线视频免费 | 极品尤物被啪到呻吟喷水 | 国产猛烈高潮尖叫视频免费 | 粉嫩少妇内射浓精videos | 日本护士毛茸茸高潮 | 亚洲精品国偷拍自产在线麻豆 | 欧美大屁股xxxxhd黑色 | 300部国产真实乱 | 无遮无挡爽爽免费视频 | 久久久精品成人免费观看 | 欧美丰满少妇xxxx性 | 亚洲色欲色欲欲www在线 | 人人超人人超碰超国产 | 久久久精品456亚洲影院 | 粗大的内捧猛烈进出视频 | 亚洲一区二区三区四区 | 国产深夜福利视频在线 | 欧美日本免费一区二区三区 | 熟妇女人妻丰满少妇中文字幕 | 未满小14洗澡无码视频网站 | 老头边吃奶边弄进去呻吟 | 永久黄网站色视频免费直播 | 国模大胆一区二区三区 | 国产香蕉97碰碰久久人人 | 亚洲va欧美va天堂v国产综合 | 精品aⅴ一区二区三区 | 国产亚洲精品久久久闺蜜 | 国产人妻人伦精品1国产丝袜 | 帮老师解开蕾丝奶罩吸乳网站 | 丰满护士巨好爽好大乳 | 2019午夜福利不卡片在线 | 小sao货水好多真紧h无码视频 | 亚洲娇小与黑人巨大交 | 亚洲一区二区观看播放 | 一本加勒比波多野结衣 | 亚洲国产av精品一区二区蜜芽 | 国产明星裸体无码xxxx视频 | 娇妻被黑人粗大高潮白浆 | 国语自产偷拍精品视频偷 | 中文字幕av日韩精品一区二区 | 亚洲最大成人网站 | 亚洲乱码中文字幕在线 | 国产精品久久久久久久9999 | 久久精品人妻少妇一区二区三区 | 无遮挡啪啪摇乳动态图 | 伊人久久大香线蕉av一区二区 | 无码人妻av免费一区二区三区 | 免费无码一区二区三区蜜桃大 | 国内精品人妻无码久久久影院蜜桃 | 亚洲爆乳无码专区 | 波多野结衣av一区二区全免费观看 | 人人妻在人人 | 偷窥村妇洗澡毛毛多 | 免费无码肉片在线观看 | 欧美真人作爱免费视频 | 色一情一乱一伦一区二区三欧美 | 欧美老妇与禽交 | 欧美黑人性暴力猛交喷水 | 亚洲欧美国产精品久久 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 性生交大片免费看l | 亚洲精品午夜国产va久久成人 | 色综合天天综合狠狠爱 | 18精品久久久无码午夜福利 | 亚洲日本va中文字幕 | 国产av久久久久精东av | 欧美真人作爱免费视频 | 一个人免费观看的www视频 | 又黄又爽又色的视频 | 亚洲成a人片在线观看无码 | 福利一区二区三区视频在线观看 | 少妇人妻av毛片在线看 | 成人无码影片精品久久久 | 国产va免费精品观看 | 国产无遮挡吃胸膜奶免费看 | 人人妻人人澡人人爽欧美一区 | 四虎影视成人永久免费观看视频 | 中文字幕无线码免费人妻 | 狂野欧美性猛xxxx乱大交 | 国产无套内射久久久国产 | 国产精品.xx视频.xxtv | 日日麻批免费40分钟无码 | 亚洲熟妇色xxxxx欧美老妇y | 99久久婷婷国产综合精品青草免费 | 真人与拘做受免费视频一 | 国产另类ts人妖一区二区 | 色婷婷久久一区二区三区麻豆 | 综合激情五月综合激情五月激情1 | 亚洲日韩中文字幕在线播放 | 88国产精品欧美一区二区三区 | 色狠狠av一区二区三区 | 日本在线高清不卡免费播放 | 天堂无码人妻精品一区二区三区 | 99在线 | 亚洲 | 国产成人无码区免费内射一片色欲 | 精品久久久中文字幕人妻 | 久久伊人色av天堂九九小黄鸭 | 乱码午夜-极国产极内射 | 色欲综合久久中文字幕网 | 在线观看欧美一区二区三区 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲欧美日韩综合久久久 | 国产精品-区区久久久狼 | 国产一区二区三区四区五区加勒比 | 亚洲男女内射在线播放 | 天天拍夜夜添久久精品大 | 国产精品久久久久9999小说 | 99久久人妻精品免费一区 | 嫩b人妻精品一区二区三区 | 少妇被黑人到高潮喷出白浆 | 又紧又大又爽精品一区二区 | 亚洲码国产精品高潮在线 | 国产精品久久久久久亚洲影视内衣 | 精品人妻人人做人人爽夜夜爽 | 亚洲综合另类小说色区 | 又大又硬又爽免费视频 | √天堂中文官网8在线 | 国产在线精品一区二区三区直播 | 高潮毛片无遮挡高清免费 | 精品欧洲av无码一区二区三区 | 狠狠色欧美亚洲狠狠色www | 国产无遮挡又黄又爽又色 | 1000部啪啪未满十八勿入下载 | 巨爆乳无码视频在线观看 | 亚洲色偷偷偷综合网 | 国产麻豆精品精东影业av网站 | 久久人人爽人人爽人人片ⅴ | 国产成人无码午夜视频在线观看 | 日日碰狠狠丁香久燥 | 亚洲国产av精品一区二区蜜芽 | 扒开双腿吃奶呻吟做受视频 | 国产亚洲人成a在线v网站 | а√资源新版在线天堂 | 最新国产麻豆aⅴ精品无码 | 高潮毛片无遮挡高清免费视频 | 午夜福利一区二区三区在线观看 | 国产小呦泬泬99精品 | 亚洲国产欧美在线成人 | 真人与拘做受免费视频一 | 亚洲一区二区三区 | 日韩在线不卡免费视频一区 | 国产精品久久久久久久9999 | 少妇久久久久久人妻无码 | 1000部夫妻午夜免费 | 乌克兰少妇性做爰 | 国产乱人伦偷精品视频 | 中文字幕+乱码+中文字幕一区 | 欧美freesex黑人又粗又大 | 牲欲强的熟妇农村老妇女 | 日本乱人伦片中文三区 | 熟妇激情内射com | 鲁大师影院在线观看 | 国产人妻大战黑人第1集 | 国产成人综合色在线观看网站 | 人妻少妇被猛烈进入中文字幕 | 99久久久无码国产aaa精品 | 亚洲精品成a人在线观看 | 亚洲色www成人永久网址 | 1000部啪啪未满十八勿入下载 | 中文字幕乱码中文乱码51精品 | 亚洲一区二区三区偷拍女厕 | 人人爽人人澡人人人妻 | 特级做a爰片毛片免费69 | 熟女少妇在线视频播放 | 人妻少妇精品视频专区 | 人妻有码中文字幕在线 | 国产深夜福利视频在线 | 国产精品久久久久久无码 | 女人高潮内射99精品 | 国产一区二区三区四区五区加勒比 | 久久精品99久久香蕉国产色戒 | 婷婷色婷婷开心五月四房播播 | 任你躁在线精品免费 | 久久久久成人片免费观看蜜芽 | 人人妻人人澡人人爽欧美一区九九 | 国产精品无码一区二区桃花视频 | 久久久久成人精品免费播放动漫 | 久久亚洲国产成人精品性色 | 日韩成人一区二区三区在线观看 | 久久亚洲中文字幕无码 | 狠狠色噜噜狠狠狠狠7777米奇 | 国精产品一区二区三区 | 国产精品亚洲lv粉色 | 性色欲网站人妻丰满中文久久不卡 | 久久亚洲国产成人精品性色 | 中文字幕乱妇无码av在线 | 欧美猛少妇色xxxxx | 国产精品内射视频免费 | 无码av中文字幕免费放 | 欧美成人高清在线播放 | 一区二区传媒有限公司 | 18无码粉嫩小泬无套在线观看 | 中文久久乱码一区二区 | 日本精品高清一区二区 | 国产精品丝袜黑色高跟鞋 | 国产亲子乱弄免费视频 | 奇米影视7777久久精品人人爽 | 奇米影视7777久久精品人人爽 | 久久午夜无码鲁丝片秋霞 | 国产真人无遮挡作爱免费视频 | 国产熟妇另类久久久久 | 欧美黑人乱大交 | 成人影院yy111111在线观看 | а天堂中文在线官网 | 国产午夜手机精彩视频 | 欧美人与物videos另类 | 亚洲色成人中文字幕网站 | 欧洲熟妇色 欧美 | 欧美日韩在线亚洲综合国产人 | 亚洲爆乳精品无码一区二区三区 | 欧美变态另类xxxx | 亚洲一区二区三区含羞草 | 中文字幕无码av波多野吉衣 | 色情久久久av熟女人妻网站 | 任你躁国产自任一区二区三区 | 夜夜躁日日躁狠狠久久av | 久久亚洲精品中文字幕无男同 | 水蜜桃亚洲一二三四在线 | yw尤物av无码国产在线观看 | 亚洲区小说区激情区图片区 | 精品国产青草久久久久福利 | 无码一区二区三区在线观看 | 色情久久久av熟女人妻网站 | 人人澡人人妻人人爽人人蜜桃 | 国产精品igao视频网 | 国产精品亚洲综合色区韩国 | 无码帝国www无码专区色综合 | а√天堂www在线天堂小说 | 成人无码精品一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 中文字幕人妻无码一区二区三区 | 日韩精品无码一区二区中文字幕 | 99久久久无码国产aaa精品 | 久久久久亚洲精品男人的天堂 | а√天堂www在线天堂小说 | 装睡被陌生人摸出水好爽 | 亚洲色www成人永久网址 | 精品乱码久久久久久久 | 熟女体下毛毛黑森林 | 无遮无挡爽爽免费视频 | 无码国产色欲xxxxx视频 | 国产精品99久久精品爆乳 | 色窝窝无码一区二区三区色欲 | 图片小说视频一区二区 | 久热国产vs视频在线观看 | 国产亚洲人成a在线v网站 | 鲁鲁鲁爽爽爽在线视频观看 | 色一情一乱一伦一视频免费看 | 色综合天天综合狠狠爱 | 成人无码精品1区2区3区免费看 | 在线播放免费人成毛片乱码 | 亚洲一区二区三区含羞草 | 无码任你躁久久久久久久 | 久久久中文久久久无码 | 精品无码一区二区三区爱欲 | 四虎4hu永久免费 | 国产片av国语在线观看 | 波多野结衣高清一区二区三区 | 久久国产精品精品国产色婷婷 | 国产人妻人伦精品1国产丝袜 | 日韩欧美中文字幕在线三区 | 国产亚洲欧美在线专区 | 激情内射亚州一区二区三区爱妻 | 国产精品久久久久影院嫩草 | 亚洲乱码日产精品bd | 图片区 小说区 区 亚洲五月 | 东京无码熟妇人妻av在线网址 | 国产免费观看黄av片 | 人妻少妇精品无码专区动漫 | 国产激情无码一区二区app | 国产后入清纯学生妹 | 国产超碰人人爽人人做人人添 | a片在线免费观看 | 最新国产乱人伦偷精品免费网站 | 中国女人内谢69xxxx | 亲嘴扒胸摸屁股激烈网站 | 熟女体下毛毛黑森林 | 中文字幕人成乱码熟女app | 麻豆国产97在线 | 欧洲 | 丝袜人妻一区二区三区 | 中文字幕人妻无码一区二区三区 | 国产精品第一区揄拍无码 | 麻豆果冻传媒2021精品传媒一区下载 | 国产精品嫩草久久久久 | 无码一区二区三区在线 | 中文亚洲成a人片在线观看 | 久久97精品久久久久久久不卡 | 给我免费的视频在线观看 | 大肉大捧一进一出视频出来呀 | 国产在线精品一区二区高清不卡 | 波多野结衣高清一区二区三区 | 欧美 日韩 亚洲 在线 | 免费观看的无遮挡av | 亚洲精品欧美二区三区中文字幕 | 国产亚洲美女精品久久久2020 | 亚洲日韩中文字幕在线播放 | 在线a亚洲视频播放在线观看 | 一本久久a久久精品亚洲 | 久久久久国色av免费观看性色 | 亚洲日韩中文字幕在线播放 | 欧美freesex黑人又粗又大 | 扒开双腿吃奶呻吟做受视频 | 人妻插b视频一区二区三区 | 300部国产真实乱 | 在线欧美精品一区二区三区 | 又黄又爽又色的视频 | 亚洲色欲色欲天天天www | 装睡被陌生人摸出水好爽 | 成人无码精品1区2区3区免费看 | 中文字幕+乱码+中文字幕一区 | 少妇的肉体aa片免费 | 国产特级毛片aaaaaaa高清 | 日本又色又爽又黄的a片18禁 | 国产精品va在线观看无码 | 国产成人无码午夜视频在线观看 | 国产又爽又黄又刺激的视频 | 精品国产aⅴ无码一区二区 | 国产精品久久福利网站 | 色诱久久久久综合网ywww | 亚洲自偷精品视频自拍 | 亚洲欧美精品伊人久久 | 无码人妻精品一区二区三区下载 | 亚洲人成影院在线无码按摩店 | 国产香蕉尹人综合在线观看 | 波多野42部无码喷潮在线 | 欧美乱妇无乱码大黄a片 | 亚洲色www成人永久网址 | 午夜免费福利小电影 | 国产麻豆精品一区二区三区v视界 | 亚洲 a v无 码免 费 成 人 a v | 中文字幕人成乱码熟女app | 日韩av无码一区二区三区 | 性开放的女人aaa片 | 一个人免费观看的www视频 | 国产亚洲视频中文字幕97精品 | 中文字幕日韩精品一区二区三区 | 久久午夜无码鲁丝片午夜精品 | 日本乱偷人妻中文字幕 | 伊人久久大香线蕉av一区二区 | 图片区 小说区 区 亚洲五月 | 婷婷丁香六月激情综合啪 | 国产av无码专区亚洲awww | 3d动漫精品啪啪一区二区中 | 亚洲经典千人经典日产 | 97无码免费人妻超级碰碰夜夜 | aⅴ亚洲 日韩 色 图网站 播放 | 在线观看免费人成视频 | 国产亚洲精品久久久久久久久动漫 | 欧美 日韩 亚洲 在线 | 成年美女黄网站色大免费全看 | 草草网站影院白丝内射 | 国产精品对白交换视频 | 亚洲色大成网站www国产 | 99久久99久久免费精品蜜桃 | 亚洲一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 亚洲aⅴ无码成人网站国产app | 久青草影院在线观看国产 | 18禁止看的免费污网站 | 天天拍夜夜添久久精品大 | 内射后入在线观看一区 | 国产一区二区不卡老阿姨 | 久久综合激激的五月天 | 中文字幕精品av一区二区五区 | 亚洲欧洲日本无在线码 | 成人免费视频视频在线观看 免费 | 中文字幕乱码人妻二区三区 | 亚洲の无码国产の无码步美 | 国产乱人无码伦av在线a | 成人女人看片免费视频放人 | 国产三级久久久精品麻豆三级 | 国产手机在线αⅴ片无码观看 | 麻豆人妻少妇精品无码专区 | 国产精品国产三级国产专播 | 日本精品人妻无码免费大全 | 窝窝午夜理论片影院 | 国产高清不卡无码视频 | 国产色视频一区二区三区 | 天堂无码人妻精品一区二区三区 | 国产性生大片免费观看性 | 午夜时刻免费入口 | 大肉大捧一进一出好爽视频 | 午夜成人1000部免费视频 | 久精品国产欧美亚洲色aⅴ大片 | 国产精品美女久久久久av爽李琼 | 偷窥村妇洗澡毛毛多 | 中文字幕乱码亚洲无线三区 | 日本va欧美va欧美va精品 | 狂野欧美性猛xxxx乱大交 | 奇米影视7777久久精品人人爽 | 成人毛片一区二区 | 国语自产偷拍精品视频偷 | 亚洲の无码国产の无码影院 | 国产精品二区一区二区aⅴ污介绍 | 国产成人无码a区在线观看视频app | 图片小说视频一区二区 | 成人免费视频在线观看 | 亚洲精品一区二区三区在线观看 | 欧美老熟妇乱xxxxx | 两性色午夜免费视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产精品办公室沙发 | 色综合久久88色综合天天 | 无码av免费一区二区三区试看 | aa片在线观看视频在线播放 | 国产内射老熟女aaaa | 1000部夫妻午夜免费 | 中文字幕人妻无码一夲道 | 亚洲の无码国产の无码影院 | 成人无码视频在线观看网站 | 97se亚洲精品一区 | 精品少妇爆乳无码av无码专区 | 日日躁夜夜躁狠狠躁 | 久久精品国产一区二区三区 | 午夜精品一区二区三区在线观看 | 日韩人妻无码一区二区三区久久99 | 女高中生第一次破苞av | 欧美35页视频在线观看 | 嫩b人妻精品一区二区三区 | 国产超级va在线观看视频 | 国产精品怡红院永久免费 | 国产精品毛多多水多 | 国产人成高清在线视频99最全资源 | 欧美xxxx黑人又粗又长 | 蜜桃无码一区二区三区 | 99在线 | 亚洲 | 精品国产一区二区三区四区在线看 | 免费无码肉片在线观看 | 亚洲熟悉妇女xxx妇女av | 亚洲一区二区三区在线观看网站 | 欧美日韩一区二区综合 | 亚洲男人av香蕉爽爽爽爽 | 丰满少妇女裸体bbw | 亚洲中文字幕在线观看 | 精品国产一区二区三区av 性色 | 波多野结衣乳巨码无在线观看 | 午夜男女很黄的视频 | 性欧美牲交xxxxx视频 | 成在人线av无码免费 | 亚洲精品久久久久中文第一幕 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 乌克兰少妇xxxx做受 | 熟妇女人妻丰满少妇中文字幕 | 大肉大捧一进一出视频出来呀 | 国产成人一区二区三区在线观看 | 久久人人爽人人爽人人片av高清 | 日本又色又爽又黄的a片18禁 | 国产精品手机免费 | 亚洲色无码一区二区三区 | 日本熟妇人妻xxxxx人hd | 精品成在人线av无码免费看 | 少妇的肉体aa片免费 | 无码人妻少妇伦在线电影 | 亚洲va中文字幕无码久久不卡 | 1000部夫妻午夜免费 | 俄罗斯老熟妇色xxxx | 日本丰满护士爆乳xxxx | 国模大胆一区二区三区 | 麻豆av传媒蜜桃天美传媒 | 日韩视频 中文字幕 视频一区 | 中文无码精品a∨在线观看不卡 | 欧美freesex黑人又粗又大 | 日韩精品一区二区av在线 | 人人妻人人澡人人爽欧美精品 | 亚洲精品中文字幕久久久久 | 成人亚洲精品久久久久 | 中文字幕日产无线码一区 | 精品欧洲av无码一区二区三区 | 免费国产成人高清在线观看网站 | 亚洲色偷偷偷综合网 | 亚洲爆乳无码专区 | 中文无码伦av中文字幕 | 亚洲午夜福利在线观看 | 欧美成人午夜精品久久久 | 亚洲 日韩 欧美 成人 在线观看 | 中文字幕日产无线码一区 | 麻豆精品国产精华精华液好用吗 | 欧美zoozzooz性欧美 | 红桃av一区二区三区在线无码av | 国内丰满熟女出轨videos | 久激情内射婷内射蜜桃人妖 | 免费看男女做好爽好硬视频 | 波多野结衣一区二区三区av免费 | 乱人伦中文视频在线观看 | 国产精品高潮呻吟av久久4虎 | 国产综合色产在线精品 | 欧美国产日产一区二区 | 精品偷自拍另类在线观看 | 久久午夜夜伦鲁鲁片无码免费 | 欧美丰满熟妇xxxx性ppx人交 | 风流少妇按摩来高潮 | 性欧美大战久久久久久久 | 老司机亚洲精品影院 | 天堂а√在线中文在线 | 国产亚洲精品久久久久久久久动漫 | 成人欧美一区二区三区黑人免费 | 亚洲s码欧洲m码国产av | 久久久久久九九精品久 | 日韩精品一区二区av在线 | 国产av人人夜夜澡人人爽麻豆 | 亚洲综合色区中文字幕 | 国产精品手机免费 | 欧美一区二区三区视频在线观看 | 伊人久久大香线蕉午夜 | 最近中文2019字幕第二页 | 美女黄网站人色视频免费国产 | 中文字幕av伊人av无码av | 波多野结衣一区二区三区av免费 | 超碰97人人射妻 | 欧美日韩一区二区免费视频 | 国产一区二区三区四区五区加勒比 | 野外少妇愉情中文字幕 | 久久久www成人免费毛片 | 精品久久久久久人妻无码中文字幕 | 精品久久久久久人妻无码中文字幕 | 日日摸天天摸爽爽狠狠97 | 成人无码精品1区2区3区免费看 | 中文字幕精品av一区二区五区 | 老司机亚洲精品影院无码 | a片在线免费观看 | 免费男性肉肉影院 | 日日鲁鲁鲁夜夜爽爽狠狠 | 午夜时刻免费入口 | 性生交大片免费看女人按摩摩 | 大胆欧美熟妇xx | 国产激情艳情在线看视频 | 国产欧美精品一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 精品国产乱码久久久久乱码 | 日韩成人一区二区三区在线观看 | 久久99精品久久久久久 | 中文字幕无码人妻少妇免费 | 人人妻人人澡人人爽欧美一区 | 宝宝好涨水快流出来免费视频 | 中文字幕无码热在线视频 | 欧美人与牲动交xxxx | 精品久久综合1区2区3区激情 | 亚洲中文字幕无码中文字在线 | 久热国产vs视频在线观看 | 欧美日韩人成综合在线播放 | 少妇厨房愉情理9仑片视频 | 国产av无码专区亚洲a∨毛片 | 人妻人人添人妻人人爱 | 国产午夜福利亚洲第一 | 老熟妇仑乱视频一区二区 | 少妇被粗大的猛进出69影院 | 国产在热线精品视频 | 日韩欧美中文字幕在线三区 | 亚洲一区二区三区国产精华液 | 免费男性肉肉影院 | 人人妻在人人 | 性欧美videos高清精品 | √天堂中文官网8在线 | 国产精品美女久久久久av爽李琼 | 亚洲成在人网站无码天堂 | 亚洲の无码国产の无码影院 | 日产精品99久久久久久 | 人妻少妇精品无码专区动漫 | 亚洲欧美精品aaaaaa片 | 亚洲の无码国产の无码步美 | 九九在线中文字幕无码 | 永久免费观看国产裸体美女 | 麻豆国产人妻欲求不满谁演的 | 国内综合精品午夜久久资源 | 在线 国产 欧美 亚洲 天堂 | 东京无码熟妇人妻av在线网址 | 男女下面进入的视频免费午夜 | 色欲久久久天天天综合网精品 | 婷婷综合久久中文字幕蜜桃三电影 | 午夜精品久久久久久久久 | 国产精品久久久久9999小说 | 少妇激情av一区二区 | 亚洲色欲色欲欲www在线 | 任你躁国产自任一区二区三区 | 国产在线aaa片一区二区99 | 日韩人妻系列无码专区 | 国产一区二区三区四区五区加勒比 | 亚洲欧洲中文日韩av乱码 | 人人妻人人澡人人爽人人精品浪潮 | 动漫av一区二区在线观看 | 久久99精品国产麻豆蜜芽 | 亚洲s色大片在线观看 | 嫩b人妻精品一区二区三区 | 色欲av亚洲一区无码少妇 | 亚洲精品国产品国语在线观看 | 日本一卡2卡3卡四卡精品网站 | 免费中文字幕日韩欧美 | 国产精品久久久一区二区三区 | 日本精品人妻无码77777 天堂一区人妻无码 | 人妻少妇精品无码专区二区 | 精品乱码久久久久久久 | 久久综合色之久久综合 | 人妻尝试又大又粗久久 | 丰满岳乱妇在线观看中字无码 | 三上悠亚人妻中文字幕在线 | 久久久久成人精品免费播放动漫 | 久久久久se色偷偷亚洲精品av | 久久精品国产99精品亚洲 | 亚洲国产午夜精品理论片 | 国产亚洲人成a在线v网站 | 亚洲娇小与黑人巨大交 | 国产精品亚洲lv粉色 | 欧美性黑人极品hd | 67194成是人免费无码 | 人妻少妇精品无码专区二区 | 水蜜桃亚洲一二三四在线 | 爱做久久久久久 | 国产尤物精品视频 | 国产精品第一区揄拍无码 | 欧美亚洲日韩国产人成在线播放 | 成人亚洲精品久久久久 | 无遮挡国产高潮视频免费观看 | 99久久婷婷国产综合精品青草免费 | 麻豆av传媒蜜桃天美传媒 | 欧美三级a做爰在线观看 | 欧美亚洲国产一区二区三区 | 永久免费观看国产裸体美女 | 大屁股大乳丰满人妻 | 国产精品亚洲综合色区韩国 | 日韩无套无码精品 | 成年美女黄网站色大免费全看 | 少妇性l交大片欧洲热妇乱xxx | 又大又硬又黄的免费视频 | 国产熟妇高潮叫床视频播放 | 国产成人精品优优av | 日本欧美一区二区三区乱码 | 又色又爽又黄的美女裸体网站 | 国产精品国产自线拍免费软件 | 西西人体www44rt大胆高清 | 国产人成高清在线视频99最全资源 | 国产偷国产偷精品高清尤物 | 国产亚洲精品久久久久久大师 | 亚洲成av人片在线观看无码不卡 | 免费国产成人高清在线观看网站 | 女人被男人躁得好爽免费视频 | 青草视频在线播放 | 一二三四在线观看免费视频 | 在线播放无码字幕亚洲 | 国色天香社区在线视频 | 国产精华av午夜在线观看 | 国产婷婷色一区二区三区在线 | 亚洲中文字幕av在天堂 | 久久久久亚洲精品男人的天堂 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲日韩av一区二区三区中文 | 中文精品久久久久人妻不卡 | 国产69精品久久久久app下载 | 精品国产一区二区三区av 性色 | 国产成人一区二区三区别 | 纯爱无遮挡h肉动漫在线播放 | 少妇无套内谢久久久久 | 欧美人与牲动交xxxx | 国产区女主播在线观看 | 双乳奶水饱满少妇呻吟 | 美女黄网站人色视频免费国产 | 波多野结衣av在线观看 | 色五月五月丁香亚洲综合网 | 波多野42部无码喷潮在线 | 色 综合 欧美 亚洲 国产 | 99精品久久毛片a片 | 国产后入清纯学生妹 | 日本饥渴人妻欲求不满 | 精品无码av一区二区三区 | 国产黄在线观看免费观看不卡 | 色欲综合久久中文字幕网 | 澳门永久av免费网站 | 国产精品久久久久久久影院 | 精品成人av一区二区三区 | 亚洲欧洲日本综合aⅴ在线 | 国产在线精品一区二区高清不卡 | 久久99国产综合精品 | 久久午夜无码鲁丝片 | 亚洲日韩一区二区 | 波多野结衣av在线观看 | 思思久久99热只有频精品66 | 在线a亚洲视频播放在线观看 | 国产猛烈高潮尖叫视频免费 | 一区二区传媒有限公司 | 亚洲综合另类小说色区 | 国内精品久久毛片一区二区 | 大乳丰满人妻中文字幕日本 | 草草网站影院白丝内射 | 久久久精品成人免费观看 | 麻豆国产人妻欲求不满谁演的 | 乱码午夜-极国产极内射 | 人人妻人人澡人人爽欧美一区九九 | 东京热无码av男人的天堂 | 激情五月综合色婷婷一区二区 | 99久久无码一区人妻 | 色综合久久久久综合一本到桃花网 | 日本乱人伦片中文三区 | 成人免费无码大片a毛片 | 天海翼激烈高潮到腰振不止 | 亚洲成av人片在线观看无码不卡 | 久久精品女人天堂av免费观看 | 伊人久久大香线蕉亚洲 | 色 综合 欧美 亚洲 国产 | 国产农村妇女高潮大叫 | 国产成人一区二区三区在线观看 | 欧美黑人性暴力猛交喷水 | 扒开双腿疯狂进出爽爽爽视频 | 国产av久久久久精东av | 理论片87福利理论电影 | 欧美国产日产一区二区 | а√资源新版在线天堂 | 狠狠噜狠狠狠狠丁香五月 | 天天躁日日躁狠狠躁免费麻豆 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产熟妇另类久久久久 | 国产农村乱对白刺激视频 | 少妇性荡欲午夜性开放视频剧场 | 久久久婷婷五月亚洲97号色 | 久久久婷婷五月亚洲97号色 | 中文字幕无码日韩专区 | 人人妻人人澡人人爽精品欧美 | 夜夜夜高潮夜夜爽夜夜爰爰 | 精品人人妻人人澡人人爽人人 | 永久免费观看美女裸体的网站 | 黑人大群体交免费视频 | 免费国产成人高清在线观看网站 | 好男人www社区 | 国色天香社区在线视频 | 国产亚洲欧美日韩亚洲中文色 | 亚洲成熟女人毛毛耸耸多 | 狠狠色噜噜狠狠狠7777奇米 | 国产黄在线观看免费观看不卡 | 对白脏话肉麻粗话av | 亚洲国产欧美在线成人 | 亚拍精品一区二区三区探花 | 国产97色在线 | 免 | 国产香蕉97碰碰久久人人 | 午夜理论片yy44880影院 | 免费无码午夜福利片69 | 中文字幕日韩精品一区二区三区 | 国产人妻人伦精品1国产丝袜 | 国产精品香蕉在线观看 | 国产口爆吞精在线视频 | 永久免费观看国产裸体美女 | 成年美女黄网站色大免费全看 | 人妻夜夜爽天天爽三区 | 在线观看国产午夜福利片 | 1000部夫妻午夜免费 | 日本xxxx色视频在线观看免费 | 色五月丁香五月综合五月 | 成人欧美一区二区三区黑人免费 | 精品厕所偷拍各类美女tp嘘嘘 | 国产精品二区一区二区aⅴ污介绍 | 亚洲精品欧美二区三区中文字幕 | 色婷婷综合激情综在线播放 | 欧美日韩久久久精品a片 | 无码人妻黑人中文字幕 | 日韩精品久久久肉伦网站 | 欧美日韩一区二区免费视频 | 中文毛片无遮挡高清免费 | 男人和女人高潮免费网站 | 九九久久精品国产免费看小说 | 亚洲s色大片在线观看 | 午夜福利不卡在线视频 | 亚洲第一无码av无码专区 | 日日鲁鲁鲁夜夜爽爽狠狠 | 亚洲精品美女久久久久久久 | 亚洲国产成人av在线观看 | 高潮毛片无遮挡高清免费 | 国产亚洲精品精品国产亚洲综合 | 午夜无码区在线观看 | 亚洲色偷偷偷综合网 | 亚洲熟妇色xxxxx欧美老妇y | 精品无人国产偷自产在线 | 免费无码av一区二区 | 中文字幕无码av波多野吉衣 | av人摸人人人澡人人超碰下载 | 熟妇女人妻丰满少妇中文字幕 | 亚洲精品无码国产 | 国产av无码专区亚洲awww | 国产内射爽爽大片视频社区在线 | 丰满少妇熟乱xxxxx视频 | 国产色在线 | 国产 | 亚洲日韩av一区二区三区四区 | 色综合久久久无码中文字幕 | 久久久精品欧美一区二区免费 | 国产婷婷色一区二区三区在线 | 欧美肥老太牲交大战 | 免费国产成人高清在线观看网站 | 国产成人无码av在线影院 | 日欧一片内射va在线影院 | 香港三级日本三级妇三级 | 夜夜影院未满十八勿进 | 国产精品久久福利网站 | 色情久久久av熟女人妻网站 | 性欧美牲交xxxxx视频 | 国产精品理论片在线观看 | 鲁一鲁av2019在线 | 中文字幕色婷婷在线视频 | 日本一卡2卡3卡四卡精品网站 | 婷婷色婷婷开心五月四房播播 | 国产真实伦对白全集 | 永久黄网站色视频免费直播 | a在线观看免费网站大全 | 国产精品99久久精品爆乳 | 中文字幕人成乱码熟女app | 在线播放亚洲第一字幕 | 在线精品国产一区二区三区 | 无码av中文字幕免费放 | 久久精品国产99精品亚洲 | 精品乱码久久久久久久 | 国产另类ts人妖一区二区 | 亚洲成a人片在线观看无码 | 欧洲熟妇精品视频 | 图片小说视频一区二区 | 精品人妻人人做人人爽夜夜爽 | 精品久久综合1区2区3区激情 | 日本护士毛茸茸高潮 | 久久国产精品二国产精品 | 无码av最新清无码专区吞精 | 国产香蕉97碰碰久久人人 | 成人精品视频一区二区三区尤物 | 性开放的女人aaa片 | 久精品国产欧美亚洲色aⅴ大片 | 丰满妇女强制高潮18xxxx | 国产suv精品一区二区五 | 亚洲国产精品成人久久蜜臀 | 2020最新国产自产精品 | 精品亚洲韩国一区二区三区 | 一本久久伊人热热精品中文字幕 | 欧洲欧美人成视频在线 | 波多野结衣高清一区二区三区 | 日韩少妇内射免费播放 | 中文无码伦av中文字幕 | 精品偷拍一区二区三区在线看 | 国产精品美女久久久久av爽李琼 | 97人妻精品一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 大肉大捧一进一出好爽视频 | 亚洲小说图区综合在线 | 丰满少妇高潮惨叫视频 | 伦伦影院午夜理论片 | 美女黄网站人色视频免费国产 | 人妻无码αv中文字幕久久琪琪布 | 国产精华av午夜在线观看 | 人妻夜夜爽天天爽三区 | 国产sm调教视频在线观看 | 99精品无人区乱码1区2区3区 | 麻豆国产97在线 | 欧洲 | 国产精品无套呻吟在线 | 在线看片无码永久免费视频 | 日韩 欧美 动漫 国产 制服 | 精品成在人线av无码免费看 | 精品乱子伦一区二区三区 | 无码午夜成人1000部免费视频 | 狠狠躁日日躁夜夜躁2020 | 久久久国产精品无码免费专区 | 久久亚洲中文字幕精品一区 | 久久久久久久女国产乱让韩 | 男女性色大片免费网站 | 无码国产色欲xxxxx视频 | 日本免费一区二区三区最新 | 色婷婷综合中文久久一本 | 天堂亚洲2017在线观看 | 免费国产成人高清在线观看网站 | 国产亚洲精品久久久久久国模美 | 一二三四在线观看免费视频 | 亚洲国产日韩a在线播放 | 久久久亚洲欧洲日产国码αv | aⅴ在线视频男人的天堂 | 久久久亚洲欧洲日产国码αv | 色婷婷香蕉在线一区二区 | 一本久道久久综合婷婷五月 | 激情内射亚州一区二区三区爱妻 | 欧美精品国产综合久久 | 久久99精品久久久久久动态图 | 色 综合 欧美 亚洲 国产 | 俄罗斯老熟妇色xxxx | 国产内射爽爽大片视频社区在线 | 久久国语露脸国产精品电影 | 东京热无码av男人的天堂 | 久久精品国产大片免费观看 | 蜜桃视频韩日免费播放 | 日韩精品无码一本二本三本色 | 亚洲色在线无码国产精品不卡 | 精品偷拍一区二区三区在线看 | 国产亚洲精品久久久久久久久动漫 | 久青草影院在线观看国产 | 日本精品久久久久中文字幕 | 俺去俺来也www色官网 | 国产精品99久久精品爆乳 | 国产成人无码区免费内射一片色欲 | 亚洲精品国偷拍自产在线麻豆 | 久久久中文字幕日本无吗 | 成人综合网亚洲伊人 | 亚洲一区二区观看播放 | 在线观看国产一区二区三区 | 熟女少妇在线视频播放 | 日本大乳高潮视频在线观看 | 美女毛片一区二区三区四区 | 国产又爽又猛又粗的视频a片 | 精品成在人线av无码免费看 | 亚洲综合色区中文字幕 | 国产精品亚洲а∨无码播放麻豆 | 亚洲国产精品无码久久久久高潮 | 色婷婷久久一区二区三区麻豆 | 欧美丰满熟妇xxxx性ppx人交 | 强开小婷嫩苞又嫩又紧视频 | 国产精品理论片在线观看 | 欧美xxxxx精品 | 日韩亚洲欧美精品综合 | 露脸叫床粗话东北少妇 | 人人妻人人澡人人爽人人精品 | 在线天堂新版最新版在线8 | 两性色午夜视频免费播放 | 色五月五月丁香亚洲综合网 | 麻豆人妻少妇精品无码专区 | 麻豆成人精品国产免费 | 亚洲色www成人永久网址 | 国产熟妇高潮叫床视频播放 | 国语精品一区二区三区 | 亚洲呦女专区 | 久久久精品456亚洲影院 | 国产精品沙发午睡系列 | 午夜理论片yy44880影院 | 日日摸天天摸爽爽狠狠97 | 欧美 日韩 人妻 高清 中文 | 精品国产乱码久久久久乱码 | 色综合久久久久综合一本到桃花网 | 四虎国产精品一区二区 | 午夜福利一区二区三区在线观看 | 日本肉体xxxx裸交 | 特大黑人娇小亚洲女 | 激情国产av做激情国产爱 | 亚洲精品一区二区三区在线观看 | 日本一区二区三区免费高清 | 亚洲综合在线一区二区三区 | 东北女人啪啪对白 | 精品 日韩 国产 欧美 视频 | 99精品无人区乱码1区2区3区 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 欧美性猛交内射兽交老熟妇 | 1000部啪啪未满十八勿入下载 | 在教室伦流澡到高潮hnp视频 | 精品人人妻人人澡人人爽人人 | 中文字幕av伊人av无码av | 亚洲成在人网站无码天堂 | 又粗又大又硬又长又爽 | 麻豆成人精品国产免费 | aa片在线观看视频在线播放 | 亚洲精品中文字幕久久久久 | 性色欲网站人妻丰满中文久久不卡 | 成熟女人特级毛片www免费 | 18无码粉嫩小泬无套在线观看 | 亚洲一区av无码专区在线观看 | 欧美自拍另类欧美综合图片区 | 色综合久久88色综合天天 | 日韩精品成人一区二区三区 | 国产成人人人97超碰超爽8 | 99久久精品国产一区二区蜜芽 | 亚洲欧美日韩综合久久久 | 免费无码午夜福利片69 | 六月丁香婷婷色狠狠久久 | 欧美日韩在线亚洲综合国产人 | 亚洲精品一区二区三区婷婷月 | 奇米影视888欧美在线观看 | 成人免费视频一区二区 | 曰韩少妇内射免费播放 | 色欲综合久久中文字幕网 | 亚洲区欧美区综合区自拍区 | 国产国产精品人在线视 | 久久久国产一区二区三区 | 亚洲精品综合一区二区三区在线 | 国产在热线精品视频 | 久久国语露脸国产精品电影 | 日本爽爽爽爽爽爽在线观看免 | 黑人巨大精品欧美黑寡妇 | 成 人影片 免费观看 | 高清不卡一区二区三区 | 中文字幕 亚洲精品 第1页 | 无码福利日韩神码福利片 | 曰本女人与公拘交酡免费视频 | 人人爽人人澡人人高潮 | 日韩亚洲欧美中文高清在线 | 熟女体下毛毛黑森林 | 天干天干啦夜天干天2017 | 国产肉丝袜在线观看 | 久久综合九色综合欧美狠狠 | 亚洲色成人中文字幕网站 | 久久精品女人天堂av免费观看 | 无套内谢老熟女 | 在线 国产 欧美 亚洲 天堂 | 久久精品视频在线看15 | 99re在线播放 | 内射老妇bbwx0c0ck | 中文字幕无码热在线视频 | 4hu四虎永久在线观看 | 国语精品一区二区三区 | 日韩精品无码一区二区中文字幕 | 无码av中文字幕免费放 | 欧美三级不卡在线观看 | 欧美日韩在线亚洲综合国产人 | 久久国产精品萌白酱免费 | 日产精品高潮呻吟av久久 | 久久亚洲精品成人无码 | 在线播放免费人成毛片乱码 | 日韩 欧美 动漫 国产 制服 | aⅴ在线视频男人的天堂 | 夜夜夜高潮夜夜爽夜夜爰爰 | 人人妻在人人 | 国内精品九九久久久精品 | 亚洲成av人片在线观看无码不卡 | 亚洲国产成人a精品不卡在线 | 国产精品高潮呻吟av久久 | 国产在线精品一区二区三区直播 | 国产偷国产偷精品高清尤物 | 女人被男人爽到呻吟的视频 | 97色伦图片97综合影院 | 在线播放亚洲第一字幕 | 日韩人妻系列无码专区 | av无码久久久久不卡免费网站 | 色综合久久久久综合一本到桃花网 | www国产亚洲精品久久网站 | 亚洲日本va午夜在线电影 | 国产特级毛片aaaaaa高潮流水 | 国产又粗又硬又大爽黄老大爷视 | 国产三级久久久精品麻豆三级 | 精品国产aⅴ无码一区二区 | 一个人看的视频www在线 | 国产亚洲精品久久久久久久 | 福利一区二区三区视频在线观看 | 精品亚洲韩国一区二区三区 | 中文字幕中文有码在线 | 高清无码午夜福利视频 | 无码人妻丰满熟妇区毛片18 | 亚洲成在人网站无码天堂 | 久久成人a毛片免费观看网站 | 精品久久综合1区2区3区激情 | 国产熟女一区二区三区四区五区 | 人妻无码αv中文字幕久久琪琪布 | 欧美第一黄网免费网站 | 亚洲成av人片天堂网无码】 | 四虎影视成人永久免费观看视频 | 无码吃奶揉捏奶头高潮视频 | 国产舌乚八伦偷品w中 | 国产精品a成v人在线播放 | 精品一区二区三区波多野结衣 | 欧美三级不卡在线观看 | 亚洲精品一区二区三区四区五区 | 久久久久免费看成人影片 | 色五月丁香五月综合五月 | 美女黄网站人色视频免费国产 | 无码av最新清无码专区吞精 | 国产成人亚洲综合无码 | 亚洲国产精品毛片av不卡在线 | 亚洲爆乳精品无码一区二区三区 | 天天爽夜夜爽夜夜爽 | 我要看www免费看插插视频 | 亚洲 a v无 码免 费 成 人 a v | 人妻体内射精一区二区三四 | 大地资源中文第3页 | 精品人妻人人做人人爽夜夜爽 | 中文字幕 亚洲精品 第1页 | 18黄暴禁片在线观看 | 99精品视频在线观看免费 | 国产精品成人av在线观看 | 大地资源中文第3页 | 青青草原综合久久大伊人精品 | 人人妻人人澡人人爽欧美一区 | 天堂а√在线中文在线 | 免费看少妇作爱视频 | а√天堂www在线天堂小说 | 成熟女人特级毛片www免费 | 一本色道久久综合亚洲精品不卡 | 国内精品一区二区三区不卡 | 99精品国产综合久久久久五月天 | 扒开双腿疯狂进出爽爽爽视频 | 欧美xxxxx精品 | 国产精品va在线观看无码 | 国内丰满熟女出轨videos | 成人欧美一区二区三区黑人免费 | 天天躁夜夜躁狠狠是什么心态 | 撕开奶罩揉吮奶头视频 | 荫蒂添的好舒服视频囗交 | 国产尤物精品视频 | 日产精品高潮呻吟av久久 | 国产人妻久久精品二区三区老狼 | 午夜丰满少妇性开放视频 | 最近免费中文字幕中文高清百度 | 亚洲 日韩 欧美 成人 在线观看 | 日本精品久久久久中文字幕 | 亚洲自偷精品视频自拍 | 国产乱子伦视频在线播放 | 国内揄拍国内精品少妇国语 | 亚洲精品无码国产 | 人妻中文无码久热丝袜 | 色欲人妻aaaaaaa无码 | 成熟女人特级毛片www免费 | av香港经典三级级 在线 | 老太婆性杂交欧美肥老太 | 久久久中文久久久无码 | 男人的天堂2018无码 | 蜜桃臀无码内射一区二区三区 | 国产精品久久久久久久9999 | av小次郎收藏 | 国产精品久久久av久久久 | 亚洲综合在线一区二区三区 | 久久亚洲日韩精品一区二区三区 | 成人三级无码视频在线观看 | 亚洲欧美日韩成人高清在线一区 | 18黄暴禁片在线观看 | 久久zyz资源站无码中文动漫 | 无码国内精品人妻少妇 | 欧美性猛交xxxx富婆 | 人妻有码中文字幕在线 | 亚洲国产高清在线观看视频 | 熟妇激情内射com | 四虎国产精品一区二区 | 成人性做爰aaa片免费看不忠 | 人妻插b视频一区二区三区 | 国产激情综合五月久久 | 精品成人av一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 国产麻豆精品精东影业av网站 | 人人妻人人澡人人爽人人精品 | 中文字幕无线码免费人妻 | 国产成人无码av一区二区 | 亚洲 激情 小说 另类 欧美 | 精品国产国产综合精品 | 麻豆蜜桃av蜜臀av色欲av | 国产精品久久福利网站 | 成熟人妻av无码专区 | 人人妻人人澡人人爽欧美精品 | 美女毛片一区二区三区四区 | 亚洲娇小与黑人巨大交 | 国产成人无码午夜视频在线观看 | 国内揄拍国内精品少妇国语 | 亚洲国产av美女网站 | 欧美日本精品一区二区三区 | 国产疯狂伦交大片 | 亚洲熟妇色xxxxx亚洲 | 999久久久国产精品消防器材 | 国产肉丝袜在线观看 | 东北女人啪啪对白 | 无码av最新清无码专区吞精 | 中文字幕色婷婷在线视频 | 牲欲强的熟妇农村老妇女 | 色一情一乱一伦 | 亚洲综合另类小说色区 | 国产午夜福利亚洲第一 | 蜜桃视频插满18在线观看 | 国产在线一区二区三区四区五区 | 国产综合久久久久鬼色 | 国产无套粉嫩白浆在线 | 高潮毛片无遮挡高清免费视频 | 国产在线一区二区三区四区五区 | 美女极度色诱视频国产 | 国内丰满熟女出轨videos | 久久精品人妻少妇一区二区三区 | 欧美精品无码一区二区三区 | 国产乱人无码伦av在线a | 欧美老妇与禽交 | 国产sm调教视频在线观看 | 性欧美大战久久久久久久 | 国产婷婷色一区二区三区在线 | 国产人妻人伦精品1国产丝袜 | 精品国产青草久久久久福利 | 波多野结衣av一区二区全免费观看 | 亚洲中文无码av永久不收费 | 熟妇人妻中文av无码 | 久久精品人妻少妇一区二区三区 | 国产高潮视频在线观看 | √天堂中文官网8在线 | 无码av中文字幕免费放 | 一本无码人妻在中文字幕免费 | 亚洲国产综合无码一区 | 荫蒂被男人添的好舒服爽免费视频 | 久久精品女人的天堂av | 国产69精品久久久久app下载 | 性做久久久久久久久 | 国产精品人妻一区二区三区四 | 亚洲人亚洲人成电影网站色 | 欧美精品无码一区二区三区 | 国产精品沙发午睡系列 | 人人妻在人人 | 亚洲国产精品无码一区二区三区 | 色婷婷欧美在线播放内射 | 欧美肥老太牲交大战 | 国产精品无套呻吟在线 | 国内少妇偷人精品视频免费 | 国精品人妻无码一区二区三区蜜柚 | 亚洲精品午夜国产va久久成人 | 国产香蕉尹人综合在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 正在播放东北夫妻内射 | 丰满护士巨好爽好大乳 | a在线亚洲男人的天堂 | 亚洲精品鲁一鲁一区二区三区 | 亚洲爆乳大丰满无码专区 | 精品久久久久久亚洲精品 | 天下第一社区视频www日本 | 伊人久久大香线蕉av一区二区 | 波多野结衣一区二区三区av免费 | 国产农村妇女高潮大叫 | 久久99精品国产麻豆 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 免费无码肉片在线观看 | 日韩精品成人一区二区三区 | 国产97人人超碰caoprom | 天堂在线观看www | 亚洲成av人综合在线观看 | а天堂中文在线官网 | 综合人妻久久一区二区精品 | 最新版天堂资源中文官网 | 中文久久乱码一区二区 | 久久精品视频在线看15 | 色老头在线一区二区三区 | 中文字幕乱码人妻无码久久 | 亚洲人成人无码网www国产 | 精品久久久无码人妻字幂 | 国产精品对白交换视频 | 久久婷婷五月综合色国产香蕉 | 午夜精品久久久久久久久 | 久久久久久a亚洲欧洲av冫 | 网友自拍区视频精品 | 国产精品亚洲а∨无码播放麻豆 | 一本色道久久综合亚洲精品不卡 | 免费看男女做好爽好硬视频 | 高清国产亚洲精品自在久久 | 曰韩无码二三区中文字幕 | 乱码午夜-极国产极内射 | 欧美老人巨大xxxx做受 | 自拍偷自拍亚洲精品10p | 奇米影视888欧美在线观看 | 夜先锋av资源网站 | 日日碰狠狠躁久久躁蜜桃 | 狠狠综合久久久久综合网 | 亚洲人交乣女bbw | 女人和拘做爰正片视频 | 欧美熟妇另类久久久久久多毛 | 久久99热只有频精品8 | 色欲人妻aaaaaaa无码 | 天堂а√在线中文在线 | 99精品久久毛片a片 | 国产亚洲视频中文字幕97精品 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | a国产一区二区免费入口 | 国产卡一卡二卡三 | 大肉大捧一进一出视频出来呀 | 东京无码熟妇人妻av在线网址 | 亚洲欧美色中文字幕在线 | 狠狠躁日日躁夜夜躁2020 | 成人性做爰aaa片免费看 | 亚洲爆乳精品无码一区二区三区 | 大肉大捧一进一出视频出来呀 | 高清不卡一区二区三区 | 国产香蕉尹人视频在线 | 在线亚洲高清揄拍自拍一品区 | 成熟妇人a片免费看网站 | 88国产精品欧美一区二区三区 | 国产精品香蕉在线观看 | 国产三级精品三级男人的天堂 | 超碰97人人做人人爱少妇 | 人人妻人人澡人人爽欧美一区 | 少妇被黑人到高潮喷出白浆 | 麻豆果冻传媒2021精品传媒一区下载 | 性色欲网站人妻丰满中文久久不卡 | 无码人妻精品一区二区三区下载 | 亲嘴扒胸摸屁股激烈网站 | 国产精品高潮呻吟av久久4虎 | aa片在线观看视频在线播放 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 成 人 网 站国产免费观看 | 妺妺窝人体色www在线小说 | 欧美国产亚洲日韩在线二区 | 国产精品理论片在线观看 | 久久zyz资源站无码中文动漫 | 亚洲の无码国产の无码步美 | 欧美 丝袜 自拍 制服 另类 | 久久久久av无码免费网 | 夜夜躁日日躁狠狠久久av | 人人澡人人妻人人爽人人蜜桃 | 东京一本一道一二三区 | 欧美日本免费一区二区三区 | 欧美日韩一区二区免费视频 | 国产激情一区二区三区 | 欧美老妇交乱视频在线观看 | 欧美日韩一区二区免费视频 | 无码人妻出轨黑人中文字幕 | 粉嫩少妇内射浓精videos | 国产一区二区三区影院 | 沈阳熟女露脸对白视频 | 人妻少妇被猛烈进入中文字幕 | 国产69精品久久久久app下载 | 国产精品高潮呻吟av久久4虎 | 久久久久成人片免费观看蜜芽 | 久久精品99久久香蕉国产色戒 | 中文字幕日产无线码一区 | 亚洲男人av天堂午夜在 | 亚洲成av人在线观看网址 | 久久综合激激的五月天 | 伊在人天堂亚洲香蕉精品区 | 少妇性l交大片 | 性欧美熟妇videofreesex | 中文字幕无码日韩欧毛 | 精品aⅴ一区二区三区 | 久久国产精品偷任你爽任你 | 美女扒开屁股让男人桶 | 激情人妻另类人妻伦 | ass日本丰满熟妇pics | 国产精品人人爽人人做我的可爱 | 18禁止看的免费污网站 | 丝袜 中出 制服 人妻 美腿 | 免费观看又污又黄的网站 | 中文字幕乱码亚洲无线三区 | 国精产品一品二品国精品69xx | 99国产欧美久久久精品 | 欧美人与禽猛交狂配 | 欧美变态另类xxxx | 亚洲国产欧美国产综合一区 | 无码人妻丰满熟妇区五十路百度 | 久久久久99精品成人片 | 精品乱子伦一区二区三区 | 亚洲色欲久久久综合网东京热 | 强奷人妻日本中文字幕 | 亚洲无人区午夜福利码高清完整版 | 成人影院yy111111在线观看 | 中文亚洲成a人片在线观看 | 波多野结衣aⅴ在线 | 日日摸日日碰夜夜爽av | 久久久无码中文字幕久... | 综合网日日天干夜夜久久 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产凸凹视频一区二区 | 国产性生交xxxxx无码 | 国精产品一品二品国精品69xx | 久久99精品久久久久久 | √天堂资源地址中文在线 | 精品无人国产偷自产在线 | 亚洲一区二区三区 | 少妇被黑人到高潮喷出白浆 | 欧美午夜特黄aaaaaa片 | 四虎4hu永久免费 | 欧美黑人性暴力猛交喷水 | 久久精品女人的天堂av | 色一情一乱一伦一视频免费看 | 樱花草在线社区www | 中文字幕无线码 | 亚洲高清偷拍一区二区三区 | 狂野欧美性猛xxxx乱大交 | 亚洲乱码中文字幕在线 | 国产一区二区三区四区五区加勒比 | 久久亚洲中文字幕精品一区 | 99久久精品国产一区二区蜜芽 | 免费无码肉片在线观看 | 国精品人妻无码一区二区三区蜜柚 | 欧美丰满熟妇xxxx | 免费中文字幕日韩欧美 | 牲欲强的熟妇农村老妇女视频 | 国产亚洲视频中文字幕97精品 | 男人扒开女人内裤强吻桶进去 | 午夜福利不卡在线视频 | 熟妇人妻无码xxx视频 | 欧美日韩视频无码一区二区三 | 中文字幕 人妻熟女 | 精品 日韩 国产 欧美 视频 | 沈阳熟女露脸对白视频 | 熟女体下毛毛黑森林 | 久久久久av无码免费网 | 欧美性生交xxxxx久久久 | 国产农村乱对白刺激视频 | 国内丰满熟女出轨videos | 精品夜夜澡人妻无码av蜜桃 | 欧美激情综合亚洲一二区 | 在线精品国产一区二区三区 | 成人精品天堂一区二区三区 | 狂野欧美性猛交免费视频 | 中文字幕人妻无码一夲道 | 亚洲娇小与黑人巨大交 | 久久综合给合久久狠狠狠97色 | 国产三级久久久精品麻豆三级 | 丰满妇女强制高潮18xxxx | www国产亚洲精品久久网站 | 国产乱子伦视频在线播放 | 亚洲区小说区激情区图片区 | 国产香蕉尹人视频在线 | 国产午夜手机精彩视频 | 午夜精品久久久内射近拍高清 | 无码国内精品人妻少妇 | 精品无人区无码乱码毛片国产 | 精品国产一区二区三区四区 | 六月丁香婷婷色狠狠久久 | 日本一本二本三区免费 | 九九久久精品国产免费看小说 | 日本欧美一区二区三区乱码 | 麻豆国产97在线 | 欧洲 | 国产精品国产三级国产专播 | 久久久精品人妻久久影视 | 中文无码成人免费视频在线观看 | 国产高清av在线播放 | 亚洲爆乳大丰满无码专区 | 日韩 欧美 动漫 国产 制服 | 午夜精品一区二区三区在线观看 | 欧洲精品码一区二区三区免费看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 97精品国产97久久久久久免费 | 成人综合网亚洲伊人 | 无码人妻少妇伦在线电影 | 中文无码成人免费视频在线观看 | 在线а√天堂中文官网 | 中文字幕av日韩精品一区二区 | 国产网红无码精品视频 | 亚洲色欲色欲欲www在线 | 久久国产自偷自偷免费一区调 | 久久久中文久久久无码 | 亚洲一区二区三区偷拍女厕 | 国产麻豆精品一区二区三区v视界 | 欧美猛少妇色xxxxx | 亚洲色无码一区二区三区 | 成在人线av无码免费 | 亚洲经典千人经典日产 | 亚洲a无码综合a国产av中文 | 一个人看的www免费视频在线观看 | 妺妺窝人体色www在线小说 | 在线天堂新版最新版在线8 | 无码吃奶揉捏奶头高潮视频 | 色五月丁香五月综合五月 | 蜜桃av抽搐高潮一区二区 | 97夜夜澡人人双人人人喊 | 性欧美牲交在线视频 | 久久亚洲中文字幕无码 | 精品一区二区三区波多野结衣 | 伊人久久婷婷五月综合97色 | v一区无码内射国产 | 日韩精品成人一区二区三区 | 亚洲日韩精品欧美一区二区 | 成人三级无码视频在线观看 | 亚洲成色在线综合网站 | 性欧美疯狂xxxxbbbb | 亚洲无人区午夜福利码高清完整版 | 男女性色大片免费网站 | 亚洲精品国产品国语在线观看 | 国产激情无码一区二区 | 国产绳艺sm调教室论坛 | 日韩欧美成人免费观看 | 国产精品无套呻吟在线 | 久久久久av无码免费网 | 国产麻豆精品精东影业av网站 | 亚洲人亚洲人成电影网站色 | 性色欲网站人妻丰满中文久久不卡 | 99精品视频在线观看免费 | 国产九九九九九九九a片 | 亚洲日韩av一区二区三区中文 | 性色av无码免费一区二区三区 | 国产激情无码一区二区 | 波多野结衣av一区二区全免费观看 | 国产99久久精品一区二区 | 欧美日韩亚洲国产精品 | 老熟妇乱子伦牲交视频 | 久激情内射婷内射蜜桃人妖 | 国产精品亚洲综合色区韩国 | 免费无码av一区二区 | 四虎国产精品免费久久 | 人妻无码αv中文字幕久久琪琪布 | 内射白嫩少妇超碰 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 欧美日韩视频无码一区二区三 | 婷婷综合久久中文字幕蜜桃三电影 | 一本大道久久东京热无码av | 人妻少妇被猛烈进入中文字幕 | 日日躁夜夜躁狠狠躁 | 久久久精品人妻久久影视 | yw尤物av无码国产在线观看 | 国产精品久久久一区二区三区 | 久久国产精品精品国产色婷婷 | 久久久精品欧美一区二区免费 | 欧洲美熟女乱又伦 | 俄罗斯老熟妇色xxxx | 天天做天天爱天天爽综合网 | 麻豆果冻传媒2021精品传媒一区下载 | 久久www免费人成人片 | 亚洲七七久久桃花影院 | 国产精品-区区久久久狼 | 成人性做爰aaa片免费看 | 少妇厨房愉情理9仑片视频 | 国精产品一区二区三区 | 日韩欧美中文字幕公布 | 偷窥日本少妇撒尿chinese | 午夜成人1000部免费视频 | 天天爽夜夜爽夜夜爽 | 国产69精品久久久久app下载 | 一个人免费观看的www视频 | 18禁止看的免费污网站 | 全黄性性激高免费视频 | 欧美丰满少妇xxxx性 | 又大又黄又粗又爽的免费视频 | 成熟人妻av无码专区 | 欧美怡红院免费全部视频 | 亚洲综合无码久久精品综合 | 超碰97人人做人人爱少妇 | 午夜男女很黄的视频 | 日本熟妇浓毛 | 亚洲精品国产a久久久久久 | 亚洲天堂2017无码中文 | 牲欲强的熟妇农村老妇女视频 | 日韩视频 中文字幕 视频一区 | 在线а√天堂中文官网 | 玩弄中年熟妇正在播放 | 小泽玛莉亚一区二区视频在线 | 女人被男人爽到呻吟的视频 | 一二三四在线观看免费视频 | 香港三级日本三级妇三级 | 久久久久久久久蜜桃 | 国产精品高潮呻吟av久久4虎 | 强伦人妻一区二区三区视频18 | 日韩精品无码一本二本三本色 | 天堂亚洲2017在线观看 | 撕开奶罩揉吮奶头视频 | 色噜噜亚洲男人的天堂 | 中文字幕无线码免费人妻 | 久久精品人人做人人综合 | 成人性做爰aaa片免费看不忠 | 无码人妻精品一区二区三区下载 | 亚洲gv猛男gv无码男同 | 国产人妖乱国产精品人妖 | 亚洲中文字幕在线观看 | 牲欲强的熟妇农村老妇女视频 | 男女下面进入的视频免费午夜 | 两性色午夜视频免费播放 | 一个人免费观看的www视频 | 中文字幕av无码一区二区三区电影 | 国产亚洲欧美日韩亚洲中文色 | 午夜福利不卡在线视频 | 欧美阿v高清资源不卡在线播放 | 亚洲乱亚洲乱妇50p | 国产色在线 | 国产 | 亚洲精品欧美二区三区中文字幕 | 久久国产自偷自偷免费一区调 | 国内揄拍国内精品人妻 | 国产精品美女久久久久av爽李琼 | 天天摸天天透天天添 | 国产精品va在线观看无码 | 东京热男人av天堂 | 国产在线精品一区二区高清不卡 | 欧美日韩一区二区综合 | 无码人妻精品一区二区三区不卡 | 麻豆国产人妻欲求不满 | 日本成熟视频免费视频 | 免费国产成人高清在线观看网站 | 大乳丰满人妻中文字幕日本 | 久久aⅴ免费观看 | 国产精品国产三级国产专播 | 男女爱爱好爽视频免费看 | 成熟妇人a片免费看网站 | 精品偷拍一区二区三区在线看 | 澳门永久av免费网站 | 国产精品久免费的黄网站 | 午夜精品久久久内射近拍高清 | 久久人人爽人人人人片 | 日日鲁鲁鲁夜夜爽爽狠狠 | 免费男性肉肉影院 | 亚洲gv猛男gv无码男同 | 一区二区三区高清视频一 | а√天堂www在线天堂小说 | 四虎影视成人永久免费观看视频 | 性色欲网站人妻丰满中文久久不卡 | 日日噜噜噜噜夜夜爽亚洲精品 | 四虎永久在线精品免费网址 | 美女扒开屁股让男人桶 | 日韩精品一区二区av在线 | 少妇高潮喷潮久久久影院 | 午夜丰满少妇性开放视频 | 日本一卡2卡3卡四卡精品网站 |