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

Java高進進階之FastThreadLocal源碼詳解(修復ThreadLocal的缺陷)

開發(fā) 前端
在Netty中,要使用 FastThreadLocal 實現(xiàn)線程本地變量需要將線程包裝成 FastThreadLocalThread ,如果不是 FastThreadLocalThread ,會使用 slowThreadLocalMap的 ThreadLocal 來存儲變量副本。

[[423590]]

前言

ThreadLocal被ThreadLocalMap中的entry的key弱引用,如果出現(xiàn)GC的情況時,

沒有被其他對象引用,會被回收,但是ThreadLocal對應的value卻不會回收,容易造成內存泄漏,這也間接導致了內存溢出以及數(shù)據(jù)假丟失;

那么問題來了,有沒有更高效的ThreadLocal有;

今天我們就來分析一波FastThreadLocalThread

一、FastThreadLocalThread源碼分析

Netty為了在某些場景下提高性能,改進了jdk ThreadLocal,Netty實現(xiàn)的FastThreadLocal 優(yōu)化了Java 原生 ThreadLocal 的訪問速度,存儲速度。避免了檢測弱引用帶來的 value 回收難問題,和數(shù)組位置沖突帶來的線性查找問題,解決這些問題并不是沒有代價;

Netty實現(xiàn)的 FastThreadLocal 底層也是通過數(shù)組存儲 value 對象,與Java原生ThreadLocal使用自身作為Entry的key不同,F(xiàn)astThreadLocal通過保存數(shù)組的全局唯一下標,實現(xiàn)了對value的快速訪問。同時FastThreadLocal 也實現(xiàn)了清理對象的方法;

1、FastThreadLocalThread

在Netty中,要使用 FastThreadLocal 實現(xiàn)線程本地變量需要將線程包裝成 FastThreadLocalThread ,如果不是 FastThreadLocalThread ,會使用 slowThreadLocalMap的 ThreadLocal 來存儲變量副本;

  1. io.netty.util.concurrent.DefaultThreadFactory 
  2. @Override 
  3. public Thread newThread(Runnable r) { 
  4.     Thread t = newThread(FastThreadLocalRunnable.wrap(r), prefix + nextId.incrementAndGet()); 
  5.     // 一般daemon為false,意思是不設置為守護線程 
  6.     if (t.isDaemon() != daemon) { 
  7.         t.setDaemon(daemon); 
  8.     } 
  9.     // 優(yōu)先級 默認為5 
  10.     if (t.getPriority() != priority) { 
  11.         t.setPriority(priority); 
  12.     } 
  13.     return t; 
  14. protected Thread newThread(Runnable r, String name) { 
  15.     return new FastThreadLocalThread(threadGroup, r, name); 

FastThreadLocalThread 繼承自Thread類,有如下成員變量:

  1. io.netty.util.concurrent.FastThreadLocalThread 
  2. // 任務執(zhí)行完,是否清除FastThreadLocal的標記 
  3. private final boolean cleanupFastThreadLocals; 
  4. // 類似于Thread類中ThreadLocalMap,為了實現(xiàn)FastThreadLocal 
  5. private InternalThreadLocalMap threadLocalMap; 

2、 InternalThreadLocalMap

FastThreadLocalThread.threadLocalMap 是 InternalThreadLocalMap 對象實例。在第一次獲取FTL數(shù)據(jù)時,會初始化FastThreadLocalThread.threadLocalMap,調用的構造函數(shù)如下:

  1. private InternalThreadLocalMap() { 
  2.             //為了簡便,InternalThreadLocalMap父類 
  3.             //UnpaddedInternalThreadLocalMap不展開介紹 
  4.             super(newIndexedVariableTable()); 
  5.         } 
  6.         //默認的數(shù)組大小為32,且使用UNSET對象填充數(shù)組 
  7.         //如果下標處數(shù)據(jù)為UNSET,則表示沒有數(shù)據(jù) 
  8.         private static Object[] newIndexedVariableTable() { 
  9.             Object[] array = new Object[32]; 
  10.             Arrays.fill(array, UNSET); 
  11.             return array; 
  12.         } 

為了避免寫時候影響同一cpu緩沖行的其他數(shù)據(jù)并發(fā)訪問,其使用了緩存行填充技術 (cpu 緩沖行填充),在類定義中聲明了如下long字段進行填充;

  1. //InternalThreadLocalMap 
  2. // Cache line padding (must be public)  
  3. // With CompressedOops enabled, an instance of this class should occupy at least 128 bytes.  
  4. public long rp1, rp2, rp3, rp4, rp5, rp6, rp7, rp8, rp9; 

FTL使用的數(shù)組下標是InternalThreadLocalMap中的靜態(tài)變量nextIndex統(tǒng)一遞增生成的:

  1. static final AtomicInteger nextIndex = new AtomicInteger(); 
  2. public static int nextVariableIndex() { 
  3.     //Netty中所有FTL數(shù)組下標都是通過遞增這個靜態(tài)變量實現(xiàn)的 
  4.     //采用靜態(tài)變量生成所有FTL元素在數(shù)組中的下標會造成一個問題, 
  5.     //會造成InternalThreadLocalMap中數(shù)組不必要的自動擴容 
  6.     int index = nextIndex.getAndIncrement(); 
  7.     if (index < 0) { 
  8.         nextIndex.decrementAndGet(); 
  9.         throw new IllegalStateException("too many thread-local indexed variables"); 
  10.     } 
  11.     return index

InternalThreadLocalMap.nextVariableIndex()方法獲取FTL在該FastThreadLocalThread.threadLocalMap數(shù)組下標,因為InternalThreadLocalMap.nextVariableIndex() 使用靜態(tài)域 nextIndex 遞增維護所有FTL的下標,會造成后面實例化的 FTL 下標過大,如果FTL下標大于其對應 FastThreadLocalThread.threadLocalMap 數(shù)組的長度,會進行數(shù)組的自動擴容,如下:

  1. private void expandIndexedVariableTableAndSet(int index, Object value) { 
  2.     Object[] oldArray = indexedVariables; 
  3.     final int oldCapacity = oldArray.length; 
  4.     //下面復雜的實現(xiàn)是為了將newCapacity規(guī)范為最接近的一個2的指數(shù),  
  5.     //這段代碼在早期的 jdk HashMap 中見過 
  6.     int newCapacity = index
  7.     newCapacity |= newCapacity >>>  1; 
  8.     newCapacity |= newCapacity >>>  2; 
  9.     newCapacity |= newCapacity >>>  4; 
  10.     newCapacity |= newCapacity >>>  8; 
  11.     newCapacity |= newCapacity >>> 16; 
  12.     newCapacity ++; 
  13.     Object[] newArray = Arrays.copyOf(oldArray, newCapacity); 
  14.     Arrays.fill(newArray, oldCapacity, newArray.length, UNSET); 
  15.     newArray[index] = value; 
  16.     indexedVariables = newArray; 

3、FastThreadLocal

構造函數(shù):

有兩個重要的下標域,F(xiàn)TL不僅在FastThreadLocalThread.threadLocalMap中保存了用戶實際使用的value(在數(shù)組中的下標為index),還在數(shù)組中保存為了實現(xiàn)清理記錄的相關數(shù)據(jù),也即下標variablesToRemoveIndex,一般情況 variablesToRemoveIndex = 0;因為variablesToRemoveIndex 是靜態(tài)變量,所以全局唯一;

  1. //如果在該FTL中放入了數(shù)據(jù),也就實際調用了其set或get函數(shù),會在 
  2.        //該FastThreadLocalThread.threadLocalMap數(shù)組的 
  3.        // variablesToRemoveIndex下標處放置一個IdentityHashMap, 
  4.        //并將該FTL放入IdentityHashMap中,在后續(xù)清理時會取出 
  5.        //variablesToRemoveIndex下標處的IdentityHashMap進行清理 
  6.         private static final int variablesToRemoveIndex = InternalThreadLocalMap.nextVariableIndex(); 
  7.        //在threadLocalMap數(shù)組中存放實際數(shù)據(jù)的下標 
  8.         private final int index
  9.         public FastThreadLocal() { 
  10.             index = InternalThreadLocalMap.nextVariableIndex(); 
  11.         } 

用戶可擴展的函數(shù):

  1. //初始化 value 函數(shù) 
  2. protected V initialValue() throws Exception { 
  3.     return null
  4. //讓使用者在該FTL被移除時可以有機會做些操作。 
  5. protected void onRemoval(@SuppressWarnings("UnusedParameters") V value) throws Exception { } 

FastThreadLocalThread

cleanupFastThreadLocals 字段在 4.1 的最新版本中已經沒有在用到了

  1. /** 
  2.  * true,表示FTL會在線程結束時被主動清理 見  FastThreadLocalRunnable 類 
  3.  * false,需要將FTL放入后臺清理線程的隊列中 
  4.  */ 
  5. // This will be set to true if we have a chance to wrap the Runnable. 
  6. //這個字段則用于標識該線程在結束時是否會主動清理FTL 
  7. private final boolean cleanupFastThreadLocals; 
  8. //次對象將在 第一次 FastThreadLocal.get 和 FastThreadLocal.set 時候創(chuàng)建 
  9. private InternalThreadLocalMap threadLocalMap; 
  10. public FastThreadLocalThread(Runnable target) { 
  11.     super(FastThreadLocalRunnable.wrap(target)); 
  12.     cleanupFastThreadLocals = true

4、 set 方法

  1. public final void set(V value) { 
  2.     //判斷設置的 value 值是否是缺省值 
  3.     if (value != InternalThreadLocalMap.UNSET) { 
  4.         //獲取當前線程的 InternalThreadLocalMap , 如果當前線程為FastThreadLocalThread,那么直接通過threadLocalMap引用獲取 
  5.         //否則通過 jdk 原生的 threadLocal 獲取 
  6.         InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.get(); 
  7.         //FastThreadLocal 對應的 index 下標的 value 替換成新的 value 
  8.         setKnownNotUnset(threadLocalMap, value); 
  9.     } else { 
  10.         //如果放置的對象為UNSET,則表示清理,會對該FTL進行清理,類似毒丸對象 
  11.         remove(); 
  12.     } 

這里擴容方會調用 InternalThreadLocalMap.expandIndexedVariableTableAndSet

  1. private void setKnownNotUnset(InternalThreadLocalMap threadLocalMap, V value) { 
  2.     //在數(shù)組下標index處放置實際對象,如果index大于數(shù)組length,會進行數(shù)組擴容. 
  3.     if (threadLocalMap.setIndexedVariable(index, value)) { 
  4.         //放置成功之后,將該FTL加入到 variablesToRemoveIndex 下標的 
  5.         //IdentityHashMap,等待后續(xù)清理 
  6.         addToVariablesToRemove(threadLocalMap, this); 
  7.     } 
  1. /** 
  2.  * 該FTL加入到variablesToRemoveIndex下標的IdentityHashMap 
  3.  * IdentityHashMap的特性可以保證同一個實例不會被多次加入到該位置 
  4.  */ 
  5. @SuppressWarnings("unchecked"
  6. private static void addToVariablesToRemove(InternalThreadLocalMap threadLocalMap, FastThreadLocal<?> variable) { 
  7.     //獲取 variablesToRemoveIndex下標處的 IdentityHashMap 
  8.     Object v = threadLocalMap.indexedVariable(variablesToRemoveIndex); 
  9.     Set<FastThreadLocal<?>> variablesToRemove; 
  10.     //如果是第一次獲取,則 variablesToRemoveIndex下標處的值為 UNSET 
  11.     if (v == InternalThreadLocalMap.UNSET || v == null) { 
  12.         //新建一個新的 IdentityHashMap 并 
  13.         variablesToRemove = Collections.newSetFromMap(new IdentityHashMap<FastThreadLocal<?>, Boolean>()); 
  14.         //放入到下標variablesToRemoveIndex處 
  15.         threadLocalMap.setIndexedVariable(variablesToRemoveIndex, variablesToRemove); 
  16.     } else { 
  17.         variablesToRemove = (Set<FastThreadLocal<?>>) v; 
  18.     } 
  19.     //將該FTL放入該IdentityHashMap中 
  20.     variablesToRemove.add(variable); 

下面看InternalThreadLocalMap.get()實現(xiàn):

  1. public static InternalThreadLocalMap get() { 
  2.     Thread thread = Thread.currentThread(); 
  3.     //首先看當前 thread 是否為FastThreadLocalThread實例 
  4.     //如果是的話,可以快速通過引用,獲取到其 threadLocalMap 
  5.     if (thread instanceof FastThreadLocalThread) { 
  6.         return fastGet((FastThreadLocalThread) thread); 
  7.     } else { 
  8.         //如果不是,則 jdk 原生慢速獲取到其 threadLocalMap 
  9.         return slowGet(); 
  10.     } 

5、 get 方法

get方法極為簡單,實現(xiàn)如下:

  1. ===========================FastThreadLocal========================== 
  2. public final V get() { 
  3.         InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.get(); 
  4.         Object v = threadLocalMap.indexedVariable(index); 
  5.         if (v != InternalThreadLocalMap.UNSET) { 
  6.             return (V) v; 
  7.         } 
  8.         return initialize(threadLocalMap); 
  9.     } 

首先獲取當前線程的map,然后根據(jù) FastThreadLocal的index 獲取value,然后返回,如果是空對象,則通過 initialize 返回,initialize 方法會將返回值設置到 map 的槽位中,并放進 Set 中;

  1. initialize 
  2. ============================FastThreadLocal========================== 
  3. private V initialize(InternalThreadLocalMap threadLocalMap) { 
  4.     V v = null
  5.     try { 
  6.         //1、獲取初始值 
  7.         v = initialValue(); 
  8.     } catch (Exception e) { 
  9.         throw new RuntimeException(e); 
  10.     } 
  11.     // 2、設置value到InternalThreadLocalMap中 
  12.     threadLocalMap.setIndexedVariables(index, v); 
  13.     // 3、添加當前的FastThreadLocal到InternalThreadLocalMap的Set<FastThreadLocal<?>>中 
  14.     addToVariablesToRemove(threadLocalMap, this); 
  15.     return v; 
  16. //初始化參數(shù):由子類復寫 
  17. protected V initialValue() throws Exception { 
  18.     return null
  • 獲取 ThreadLocalMap
  • 直接通過索引取出對象
  • 如果為空那么調用初始化方法初始化

6、ftl的資源回收機制

netty中ftl的兩種回收機制回收機制:

自動:使用ftlt執(zhí)行一個被FastThreadLocalRunnable wrap的Runnable任務,在任務執(zhí)行完畢后會自動進行ftl的清理;

手動:ftl和InternalThreadLocalMap都提供了remove方法,在合適的時候用戶可以(有的時候也是必須,例如普通線程的線程池使用ftl)手動進行調用,進行顯示刪除;

  1. FastThreadLocalRunnable 
  2. final class FastThreadLocalRunnable implements Runnable { 
  3.     private final Runnable runnable; 
  4.     @Override 
  5.     public void run() { 
  6.         try { 
  7.             runnable.run(); 
  8.         } finally { 
  9.             FastThreadLocal.removeAll(); 
  10.         } 
  11.     } 
  12.     static Runnable wrap(Runnable runnable) { 
  13.         return runnable instanceof FastThreadLocalRunnable  
  14.                 ? runnable : new FastThreadLocalRunnable(runnable); 
  15.     } 

如果將線程執(zhí)行的任務包裝成 FastThreadLocalRunnable,那么在任務執(zhí)行完后自動刪除ftl的資源。

  1. ===============================FastThreadLocal=========================== 
  2. public static void removeAll() { 
  3.     // 獲取到map 
  4.     InternalThreadLocalMap threadLocalMap = InternalThreadLocalMap.getIfSet(); 
  5.     if (threadLocalMap == null) { 
  6.         return
  7.     } 
  8.     try { 
  9.         // 獲取到Set<FastThreadLocal>集合 
  10.         Object v = threadLocalMap.indexedVariable(variablesToRemoveIndex); 
  11.         if (v != null && v != InternalThreadLocalMap.UNSET) { 
  12.             @SuppressWarnings("unchecked"
  13.             Set<FastThreadLocal<?>> variablesToRemove = (Set<FastThreadLocal<?>>) v; 
  14.             // 將Set轉換為數(shù)組 
  15.             FastThreadLocal<?>[] variablesToRemoveArray = 
  16.                     variablesToRemove.toArray(new FastThreadLocal[variablesToRemove.size()]); 
  17.             // 遍歷數(shù)組,刪除每一個FastThreadLocal對應的value 
  18.             for (FastThreadLocal<?> tlv: variablesToRemoveArray) { 
  19.                 tlv.remove(threadLocalMap); 
  20.             } 
  21.         } 
  22.     } finally { 
  23.         // 刪除當前線程的InternalThreadLocalMap 
  24.         InternalThreadLocalMap.remove(); 
  25.     } 
  26. public static void remove() { 
  27.     Thread thread = Thread.currentThread(); 
  28.     if (thread instanceof FastThreadLocalThread) { 
  29.          // 將FastThreadLocalThread 內部的map置位null 
  30.         ((FastThreadLocalThread) thread).setThreadLocalMap(null); 
  31.     } else { 
  32.         // 將 ThreadLocal內部ThreadLocalMap 中的value置位null 
  33.         slowThreadLocalMap.remove(); 
  34.     } 

remove方法:

  1. ===============================FastThreadLocal========================== 
  2. private void remove() { 
  3.     remove(InternalThreadLocalMap.getIfSet()); 
  4. private void remove(InternalThreadLocalMap threadLocalMap) { 
  5.     if (threadLocalMap == null) { 
  6.         return
  7.     } 
  8.     // 從 InternalThreadLocalMap 中刪除當前的FastThreadLocal對應的value并設UNSET 
  9.     Object v = threadLocalMap.removeIndexedVariable(index); 
  10.     // 從 InternalThreadLocalMap 中的Set<FastThreadLocal<?>>中刪除當前的FastThreadLocal對象 
  11.     removeFromVariablesToRemove(threadLocalMap, this); 
  12.     // 如果刪除的是有效值,則進行onRemove方法的回調 
  13.     if (v != InternalThreadLocalMap.UNSET) { 
  14.         try { 
  15.             // 回調子類復寫的onRemoved方法,默認為空實現(xiàn) 
  16.             onRemoved((V) v); 
  17.         } catch (Exception e) { 
  18.             throw new RuntimeException(e); 
  19.         } 
  20.     } 

總結

只有不斷的學習,不斷的找到自己的缺點才可以進步;

一起加油;

 

責任編輯:武曉燕 來源: Android開發(fā)編程
相關推薦

2020-11-04 13:01:38

FastThreadLocalJDK

2021-09-12 07:30:10

配置

2021-09-02 07:00:01

Glide流程Android

2021-09-07 06:40:25

AndroidLiveData原理

2021-09-01 06:48:16

AndroidGlide緩存

2021-08-10 20:41:33

AndroidApp流程

2015-09-09 08:45:49

JavaThreadLocal

2024-10-28 08:15:32

2021-08-17 13:41:11

AndroidView事件

2021-10-29 08:19:54

JMeterJava java sample

2021-09-03 07:27:38

AndroidGlide管理

2023-10-07 08:26:40

多線程數(shù)據(jù)傳遞數(shù)據(jù)共享

2021-08-05 20:39:34

AndroidKotlinStandard.kt

2021-09-05 07:35:58

lifecycleAndroid組件原理

2021-08-25 07:43:17

AndroidSurfaceViewTextureView

2012-01-13 16:11:44

2024-11-18 16:15:00

2021-09-09 06:55:43

AndroidViewDragHel原理

2021-09-11 07:32:15

Java線程線程池

2021-09-18 06:56:01

JavaCAS機制
點贊
收藏

51CTO技術棧公眾號

91福利社在线观看| www久久久久| 美日韩丰满少妇在线观看| 三上悠亚 电影| 秋霞伦理一区| 中文字幕在线观看一区| 国产乱码精品一区二区三区日韩精品 | 俺去啦;欧美日韩| 极品白嫩的小少妇| 992tv国产精品成人影院| 一区二区激情小说| 日韩中文一区二区三区| 丰满人妻一区二区三区四区53| 视频一区二区中文字幕| 色综合91久久精品中文字幕 | 视频国产一区| 日韩一区二区免费在线观看| 能看的毛片网站| 美女日批视频在线观看| 国产精品蜜臀在线观看| 久久婷婷国产综合尤物精品| av加勒比在线| 日本va欧美va精品发布| 97国产精品视频人人做人人爱| sm捆绑调教视频| 蜜桃国内精品久久久久软件9| 欧美成人性战久久| jizz18女人| 中文字幕在线直播| 亚欧色一区w666天堂| 伊人久久大香线蕉午夜av| 欧美日韩在线中文字幕| 懂色一区二区三区免费观看| 成人激情春色网| 激情网站在线观看| 日韩网站在线| 久久久久久久久综合| h色网站在线观看| 91一区二区| 色悠悠国产精品| 久久丫精品忘忧草西安产品| 亚洲盗摄视频| 亚洲欧美视频在线| 精品人妻无码一区二区三区| 日韩av网站在线免费观看| 亚洲成人在线网| 亚洲精品无码一区二区| xvideos.蜜桃一区二区| 日韩精品一区二区在线| 色黄视频免费看| 狂野欧美xxxx韩国少妇| 在线综合视频播放| 一区二区三区国产好的精华液| 色综合.com| 欧美精品成人一区二区三区四区| 中文字幕亚洲欧洲| 亚洲欧洲日韩精品在线| 欧美一区二区成人| 91超薄肉色丝袜交足高跟凉鞋| 国产成人av毛片| 亚洲第一色在线| 亚洲av无码一区二区三区网址 | 亚洲欧洲精品一区| 秋霞午夜理伦电影在线观看| 自拍偷自拍亚洲精品播放| 黄色网zhan| 日本无删减在线| 午夜精品影院在线观看| 久久久噜噜噜www成人网| 四虎4545www国产精品| 欧美日韩一二三区| 欧美69精品久久久久久不卡| 福利片在线一区二区| 亚洲欧美另类国产| 国产精品69久久久久孕妇欧美| 小处雏高清一区二区三区| 色综合天天狠天天透天天伊人| 日本三级片在线观看| 性色av一区二区怡红| 国产精品96久久久久久| 国产美女主播在线观看| 9久草视频在线视频精品| 日韩精品欧美一区二区三区| 黄在线免费看| 午夜精品视频一区| 色七七在线观看| 中文字幕亚洲在线观看| 亚洲色无码播放| 91九色丨porny丨极品女神| 亚洲区第一页| 国产欧美va欧美va香蕉在| 国产黄色av网站| 久久久www成人免费毛片麻豆| 正义之心1992免费观看全集完整版| 男人天堂亚洲天堂| 欧美日韩一级二级| 国产精品九九视频| 国产精品伦理久久久久久| 久久久久久欧美| 中文字幕一区二区人妻痴汉电车| 国产成人久久精品77777最新版本| 欧美精品一区二区三区四区五区| 大地资源网3页在线观看| 欧美视频中文字幕在线| 九九热视频免费| 少妇精品久久久一区二区三区| 伦伦影院午夜日韩欧美限制| 亚洲 欧美 中文字幕| 国产福利精品导航| 亚洲精品一品区二品区三品区| 免费在线国产视频| 欧美猛男超大videosgay| yy1111111| 欧美国产高清| 国产精品男女猛烈高潮激情| 亚洲 小说区 图片区 都市| 亚洲色图欧洲色图| www.夜夜爽| 国产欧美日韩影院| 欧美一区二区三区精品电影| 黄色小视频免费在线观看| 亚洲色图都市小说| 亚洲少妇第一页| 蜜桃视频欧美| 青青草国产精品一区二区| 亚洲国产精品久久久久爰性色 | 日本免费在线视频观看| 久久电影tv| 亚洲激情视频在线播放| 久久精品亚洲无码| 国产suv精品一区二区三区| 中文字幕在线亚洲精品| 国产成人午夜性a一级毛片| 亚洲男人7777| 日韩人妻精品中文字幕| 91视频免费看| 男人操女人免费软件| 精品av导航| 久久乐国产精品| 国精产品一品二品国精品69xx| 综合久久久久久久| 成人性生交视频免费观看| 欧美a级片视频| 国产欧美日韩视频| 老司机在线永久免费观看| 欧美日韩三级一区二区| 色www亚洲国产阿娇yao| 美女脱光内衣内裤视频久久网站 | 91九色视频导航| 免费**毛片在线| 欧美另类久久久品| 婷婷在线精品视频| 国产精品自拍在线| 欧美精品卡一卡二| 免费成人蒂法| 51久久精品夜色国产麻豆| 四虎影视在线播放| 色哟哟精品一区| 人成免费在线视频| 国产综合色精品一区二区三区| 欧美少妇一级片| 日韩精品视频中文字幕| 久久免费精品日本久久中文字幕| 手机看片一区二区| 色综合欧美在线| 992在线观看| 国产精品一二三区| 男人的天堂狠狠干| 久久99性xxx老妇胖精品| 国产精品久久久91| 9191在线播放| 亚洲精品久久在线| 国产精品无码粉嫩小泬| 1000部国产精品成人观看| 国产精品19p| 亚洲毛片播放| 五月天亚洲综合| 欧美另类中文字幕| 日本成人在线视频网址| 欧美成人三区| 亚洲激情视频在线| 91亚洲国产成人久久精品麻豆| 一区二区三区鲁丝不卡| caopor在线| 蜜桃视频免费观看一区| 国产精品一色哟哟| 日韩精品首页| 国内精品久久国产| 999久久久国产999久久久| 欧美激情奇米色| jzzjzzjzz亚洲成熟少妇| 欧美成人r级一区二区三区| 成人午夜视频在线播放| 国产精品国产a| 日本一卡二卡在线| 精品一区二区三区视频| 欧美色图色综合| 911精品美国片911久久久| 国产在线观看一区| 成人日韩视频| 国产精品jizz在线观看麻豆| h片在线观看| 久久韩剧网电视剧| 久久精品a一级国产免视看成人| 欧美一区二区三区影视| 姑娘第5集在线观看免费好剧| 亚洲国产精品自拍| 黄色录像一级片| 久久奇米777| 99免费观看视频| 精品一区二区日韩| 无遮挡又爽又刺激的视频| 国自产拍偷拍福利精品免费一| 亚洲国产精品视频一区| 图片婷婷一区| 国产精品免费一区二区三区四区| 色综合视频一区二区三区日韩| 秋霞av国产精品一区| 国产美女情趣调教h一区二区| 久久精品免费播放| a√在线中文网新版址在线| 日韩麻豆第一页| 色婷婷综合视频| 精品美女在线播放| 99热这里只有精品在线观看| 欧美日韩激情一区| 国产第一页在线观看| 欧美日韩综合视频网址| 日韩无码精品一区二区三区| 一区二区久久久久| 精品爆乳一区二区三区无码av| 亚洲色欲色欲www在线观看| 免费一级suv好看的国产网站| 国产欧美一区二区三区沐欲| 欧美老熟妇乱大交xxxxx| 99久久国产综合精品女不卡| 黑丝av在线播放| 99re8在线精品视频免费播放| 久久久午夜精品福利内容| 不卡的看片网站| 7788色淫网站小说| k8久久久一区二区三区| 国产精品入口麻豆| 波波电影院一区二区三区| 久久久久无码国产精品一区李宗瑞 | 日本一二三区在线| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲国产日韩欧美在线图片| 日韩一卡二卡在线| 亚洲黄色www| 免费福利在线视频| 一区二区三区黄色| 最新国产在线观看| 久久久精品免费视频| 午夜在线激情影院| 久久久久成人精品| 天天综合av| 国产精品成人免费电影| 国产成人77亚洲精品www| 91久久精品一区| 超碰97久久国产精品牛牛| 精品国产乱码一区二区三区四区| 一区二区三区视频免费观看| 视频在线一区二区三区| 亚洲女同中文字幕| 加勒比成人在线| 久久久久久自在自线| 欧美精品aaaa| 国产精品一区在线| 一区二区免费在线观看视频| 国产偷国产偷亚洲高清人白洁 | 欧美挠脚心网站| 最近的2019中文字幕免费一页| 成人高清免费在线| 91精品国产乱码久久久久久蜜臀| 一呦二呦三呦精品国产| 国产在线视频91| 丝袜久久网站| 大地资源第二页在线观看高清版| 亚洲一本视频| 天天爽人人爽夜夜爽| 国产精品一二三| av网在线播放| 亚洲激情中文1区| www.欧美色| 日韩精品一区二区三区在线| 日韩美女一级视频| 久久伊人91精品综合网站| 国内精彩免费自拍视频在线观看网址 | 动漫精品一区一码二码三码四码| 日韩欧美精品网址| 国产女18毛片多18精品| 亚洲欧美中文另类| 青春草在线免费视频| 国产精品劲爆视频| 国产精品45p| 一区二区三区久久网| 亚洲一区二区三区免费在线观看| 在线看免费毛片| 久久久午夜精品| 国产精品30p| 69久久99精品久久久久婷婷| 欧美在线一卡| 久久久噜噜噜久噜久久| 电影一区二区三区久久免费观看| 欧美不卡福利| 亚洲高清自拍| 99热这里只有精品2| 欧美激情一区二区| 亚洲AV无码成人精品区东京热 | 日色在线视频| 欧美成在线观看| 欧美成人免费全部网站| 久久精品一区二区三区不卡免费视频| 亚洲综合小说| 成人av毛片在线观看| 欧美国产成人在线| 天堂网中文字幕| 亚洲精品第一国产综合精品| 污污的视频在线观看| 亚洲一区二区三区视频| 日韩av久操| 九热视频在线观看| 久久久www免费人成精品| 中文字幕免费在线观看视频| 亚洲电影中文字幕| 羞羞电影在线观看www| 成人xvideos免费视频| 日韩欧美一区二区三区免费看| 成人免费无码av| 国产人伦精品一区二区| 日韩欧美一级视频| 日韩成人激情在线| 精精国产xxxx视频在线野外| 国产麻豆乱码精品一区二区三区| 欧美另类综合| 午夜性福利视频| 亚洲最新视频在线观看| 亚洲不卡免费视频| 欧美巨猛xxxx猛交黑人97人| 美国十次综合久久| 女人床在线观看| 国产河南妇女毛片精品久久久| 视频这里只有精品| 日韩欧美aaaaaa| 日皮视频在线观看| 国产一区二区三区奇米久涩| 在线欧美亚洲| 特级西西人体wwwww| 欧美日韩久久久久| 经典三级在线| 国产日韩av在线播放| 一本到12不卡视频在线dvd| 无套白嫩进入乌克兰美女| 亚洲精品美国一| 国产成人久久精品77777综合 | 国产在线一二区| 精品爽片免费看久久| 黑人巨大精品| 亚洲综合欧美日韩| 国产成人在线视频网站| 日韩av无码中文字幕| 亚洲人成网站色ww在线| 日本中文字幕视频一区| 福利在线一区二区| 91麻豆国产香蕉久久精品| 中文无码精品一区二区三区| 播播国产欧美激情| 97久久综合精品久久久综合| 国产免费黄视频| 国产精品毛片久久久久久| 亚洲av无码专区在线| 全亚洲最色的网站在线观看| 成人羞羞网站入口免费| 在线成人精品视频| 欧美视频免费在线| 色视频在线免费观看| 成人免费视频网站入口| 视频一区二区不卡| www.色小姐com| 亚洲欧洲在线免费| 精品国产乱码久久久久久樱花| 欧美日韩成人免费视频| 欧美国产欧美综合| 亚洲va天堂va欧美ⅴa在线| 欧美中文字幕在线播放| 婷婷久久一区| 中文字幕av网址| 日韩一区二区电影网| 在线中文字幕播放| 天堂av在线中文| 国产网红主播福利一区二区| www视频在线| 国产精品普通话| 国产日韩一区二区三区在线播放| 在线日韩国产网站| 亚洲欧洲免费视频| 亚洲综合网狠久久| 粉色视频免费看| 欧美黑人一级片|