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

一篇學會NioEventLoopGroup源碼解析

網絡 通信技術
這里我們會創建一個線程執行器 ThreadPerTaskExecutor,使用默認的線程工廠DefaultThreadFactory,線程執行器會將一個任務包裝為一個 FastThreadLocalThread對象,然后調用start方法開啟一個新的線程執行任務!

[[408806]]

本文轉載自微信公眾號「源碼學徒」,作者皇甫嗷嗷叫 。轉載本文請聯系源碼學徒公眾號。

NioEventLoopGroup的初始化源碼

一、尋找源碼的過程

我們前面說到過,NioEventLoopGroup我們可以近乎把它看作是一個線程池,該線程池會執行一個一個的任務,我們常用的NioEventLoopGroup大概有兩種,NioEventLoopGroup(int nThreads),NioEventLoopGroup(),即一個是指定線程數量的,一個是默認指定線程數量的!這里我們以無參構造為入口進行分析!

  1. EventLoopGroup work = new NioEventLoopGroup(); 
  1. public NioEventLoopGroup() { 
  2.     this(0); 

當我們使用默認的數量的時候,他會傳遞一個0,我們繼續往下跟!

  1. public NioEventLoopGroup(int nThreads) { 
  2.     this(nThreads, (Executor) null); 

注意這里傳遞的參數是:0,null

  1. public NioEventLoopGroup(int nThreads, Executor executor) { 
  2.     //每個 group維護一個 SelectorProvider 主要用它獲取selector選擇器 
  3.     this(nThreads, executor, SelectorProvider.provider()); 

這里面多傳遞了一個 SelectorProvider.provider(),該方法是JDK NIO提供的API主要可以獲取NIO選擇器或者Channel,如下圖:

我們回歸主線繼續跟:

  1. public NioEventLoopGroup( 
  2.             int nThreads, Executor executor, final SelectorProvider selectorProvider) { 
  3.     this(nThreads, executor, selectorProvider, DefaultSelectStrategyFactory.INSTANCE); 

這里多傳遞了一個 DefaultSelectStrategy選擇策略,這在后面講解NioEventLoop會具體講解,不做闡述!

  1. public NioEventLoopGroup(int nThreads, Executor executor, final SelectorProvider selectorProvider, 
  2.                              final SelectStrategyFactory selectStrategyFactory) { 
  3.     super(nThreads, executor, selectorProvider, selectStrategyFactory, RejectedExecutionHandlers.reject()); 

我們會發現這里還會默認傳遞一個拒絕策略RejectedExecutionHandlers.reject(),這個拒絕策略是干嘛的呢?

  1. @Override 
  2. public void rejected(Runnable task, SingleThreadEventExecutor executor) { 
  3.     throw new RejectedExecutionException(); 

我們得到一個結論,當某些條件觸發這個拒絕策略,那么他會拋出一個RejectedExecutionException異常,具體什么時候觸發,后續也會詳細說明,這里只需要記住就OK了!

我們繼續回到主線, 這里我們開始調用父類,還記得上一節課我們分析的NioEventLoopGroup的父類是誰嗎?沒錯是:MultithreadEventLoopGroup, 我們會進入到MultithreadEventLoopGroup里面:

  1. protected MultithreadEventLoopGroup(int nThreads, Executor executor, Object... args) { 
  2.     //線程數量為0時  使用默認的cpu * 2 
  3.     super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, args); 

nThreads還記得是幾嗎?是0對不對,這里有個判斷,當你的線程數量為0的時候,會使用DEFAULT_EVENT_LOOP_THREADS當作線程池的數量,DEFAULT_EVENT_LOOP_THREADS是多少呢?

  1. DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2)); 

默認是CPU的兩倍,所以我們現在得到一個結論,當我們使用默認的NioEventLoopGroup的時候,系統會默認使用系統CPU核數*2當作線程池的數量!

我們上一步傳遞過來的selectorProvider、拒絕策略、selectStrategyFactory被封裝為數組,并放在args[0],args[1], args[2]的位置!

我們繼續回到主線,這里又再次調用到父類,MultithreadEventExecutorGroup:

  1. protected MultithreadEventExecutorGroup(int nThreads, Executor executor, Object... args) { 
  2.     this(nThreads, executor, DefaultEventExecutorChooserFactory.INSTANCE, args); 

注意,這里又再次多傳遞了一個參數:DefaultEventExecutorChooserFactory一個選擇器工廠,這里會返回一個選擇器,他是DefaultEventExecutorChooserFactory類型的,具體分析后面會分析!我們繼續回到主線:

  1. protected MultithreadEventExecutorGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, Object... args) { 
  2.     ..........后續源碼補充.......... 

到這里我們終于看到了一大段代碼,這里是EventLoopGroup的主要邏輯,我們逐行分析:

二、構建線程執行器

1. 源碼解析

  1. //newDefaultThreadFactory  構建線程工廠 
  2. if (executor == null) { 
  3.     //創建并保存線程執行器  執行器  執行任務的  默認是  DefaultThreadFactory 線程池 
  4.     executor = new ThreadPerTaskExecutor(newDefaultThreadFactory()); 

這里會判斷我們傳入的執行器是否為空,否則就新建一個,我們還記得executor是什么值嗎?是null,對不對,所以它會進入到這里的邏輯我們進入到newDefaultThreadFactory源碼里面看一下:

newDefaultThreadFactory()主要邏輯

  1. protected ThreadFactory newDefaultThreadFactory() { 
  2.     return new DefaultThreadFactory(getClass()); 

可以看到,這里向執行器里面傳入了一個 DefaultThreadFactory一個默認的線程工廠!

ThreadPerTaskExecutor主要邏輯:

  1. /** 
  2.  * io.netty.util.concurrent.DefaultThreadFactory#newThread(java.lang.Runnable) 
  3.  * 
  4.  * 執行任務  每次執行任務都會創建一個線程實體對象 
  5.  * @param command 線程 
  6.  */ 
  7. @Override 
  8. public void execute(Runnable command) { 
  9.     //執行任務 
  10.     threadFactory.newThread(command).start(); 

我們發現,這里調用了一個我們傳入的線程工廠,創建了一個新的線程并調用start方法啟動了起來,那么他是如何創建的呢? 我們進入到newThread源碼里面查看,由于我們默認使用的線程工廠是 DefaultThreadFactory, 所以,我們會進入到 DefaultThreadFactory#newThread

  1. @Override 
  2. public Thread newThread(Runnable r) { 
  3.     //創建一個線程 每次執行任務的時候都會創建一個線程實體 
  4.     Thread t = newThread(FastThreadLocalRunnable.wrap(r), prefix + nextId.incrementAndGet()); 
  5.     try { 
  6.         if (t.isDaemon() != daemon) { 
  7.             t.setDaemon(daemon); 
  8.         } 
  9.  
  10.         if (t.getPriority() != priority) { 
  11.             t.setPriority(priority); 
  12.         } 
  13.     } catch (Exception ignored) { 
  14.         // Doesn't matter even if failed to set
  15.     } 
  16.     return t; 

這里沒有太多的操作,只是會將一個 Runnable封裝為一個 Thread進行返回,我們重點關注一下這個Thread,它和我們傳統使用的Thread是一樣的嗎? 我們跟進到 newThread方法看一下:

  1. protected Thread newThread(Runnable r, String name) { 
  2.     //Netty自己封裝的線程 
  3.     return new FastThreadLocalThread(threadGroup, r, name); 

邏輯很簡單,就是將一個Thread包裝為Netty自定義的 FastThreadLocalThread,至于為什么,我們暫時不往下多做解釋,后續章節會很詳細的解釋它!

2. 線程執行器總結

這里我們會創建一個線程執行器 ThreadPerTaskExecutor,使用默認的線程工廠DefaultThreadFactory,線程執行器會將一個任務包裝為一個 FastThreadLocalThread對象,然后調用start方法開啟一個新的線程執行任務!

三、創建對應數量的執行器

  1. //創建執行器數組  數量和預設線程數量一致 
  2. children = new EventExecutor[nThreads]; 
  3.  
  4. for (int i = 0; i < nThreads; i ++) { 
  5.     boolean success = false
  6.     try { 
  7.         //創建執行器  開始創建執行器   這里的執行機估計就會EventLoop  是NioEventLoop 
  8.         children[i] = newChild(executor, args); 
  9.         success = true
  10.     } catch (Exception e) { 
  11.         .....省略不必要代碼 
  12.     } finally { 
  13.         .....省略不必要代碼 
  14.     } 

1. 源碼解析

  1. children = new EventExecutor[nThreads]; 

首先他會創建一個空的EventExecutor執行器數組,然后遍歷填充!

還記得 nThreads是幾嗎? 默認是CPU*2的大小,所以這里會創建 CPU * 2數量的執行器! 我們發現,for循環中填充的主要邏輯是newChild,所以,我們進入到 newChild方法, 這里提示一點,我們創建的Group對象是一個什么對象? 是NioEventLoopGroup對象對不對,所以我們這里會進入到 NioEventLoopGroup#newChild方法:

  1. @Override 
  2. protected EventLoop newChild(Executor executor, Object... args) throws Exception { 
  3.     EventLoopTaskQueueFactory queueFactory = args.length == 4 ? (EventLoopTaskQueueFactory) args[3] : null
  4.     return new NioEventLoop(this, executor, (SelectorProvider) args[0], 
  5.                             ((SelectStrategyFactory) args[1]).newSelectStrategy(), (RejectedExecutionHandler) args[2], queueFactory); 

我們傳遞過來 的args長度為3,前面做過解析 :

args[0]為 selectorProvider、args[1]為拒絕策略、args[2]為selectStrategyFactory

所以 queueFactory為null, 然后我們再重點關注 NioEventLoop對象,可以看出,newChild方法返回的是 NioEventLoop,那么我們初步就可以確定,EventExecutor數組里面存在的是NioEventLoop對象!至此,我們就不深究了,NioEventLoop的初始化源碼分析我會放到下一節課分析,這里我們可以確定一件事, EventExecutor數組里面存在的是NioEventLoop對象!我們繼續回到主線:

2. 執行器數組總結

for循環完畢之后,此時的EventExecutor[nThreads];數組就被填充滿了,里面的每一個元素都是NioEventLoop對象,每一個NioEventLoop對象都包含一個 ThreadPerTaskExecutor線程執行器對象!

四、創建一個執行器選擇器

1. 源碼解析

  1. chooser = chooserFactory.newChooser(children); 

還記得 chooserFactory是什么類型的嗎? 是DefaultEventExecutorChooserFactory類型的,忘了的可以往上翻一下尋找源碼的過程中的代碼或者調試一下!

我們進入到 DefaultEventExecutorChooserFactory#newChooser 源碼邏輯中,并傳入剛剛我們循環填充好的數組:

  1. @Override 
  2. public EventExecutorChooser newChooser(EventExecutor[] executors) { 
  3.     //判斷2的冪 isPowerOfTwo 
  4.     if (isPowerOfTwo(executors.length)) { 
  5.         return new PowerOfTwoEventExecutorChooser(executors); 
  6.     } else { 
  7.         //簡單的 
  8.         return new GenericEventExecutorChooser(executors); 
  9.     } 

可以看到,這里似乎有兩種情況,返回的是不同的策略對象,當你的數組長度是2的冪等次方的時候,返回的是 PowerOfTwoEventExecutorChooser對象,否則返回 GenericEventExecutorChooser對象,我們就兩種情況全部分析一下:

I、PowerOfTwoEventExecutorChooser

  1. PowerOfTwoEventExecutorChooser(EventExecutor[] executors) { 
  2.     this.executors = executors; 
  3.  
  4. @Override 
  5. public EventExecutor next() { 
  6.     //2的冪等性  實現這個  也能實現循環取數的 
  7.     //executors   就是NioEventLoop數組  按照2次冪求本次獲取的EventLoop是個啥 
  8.     return executors[idx.getAndIncrement() & executors.length - 1]; 

這段代碼的主要邏輯是,取一個自增的CAS類,與數組長度做&運算,最終會出現循環取數的結果:

從上面的圖片可以基本看出來, 該功能可以實現一個循環取數的功能,每次達到數組的尾部部都會重新回到頭部重新獲取!

代碼案例:

  1. public static void main(String[] args) { 
  2.     String[] strings = {"第一個""第二個""第三個""第四個"}; 
  3.     AtomicInteger idx = new AtomicInteger(); 
  4.     for (int i = 0; i < 9; i++) { 
  5.         System.out.println(strings[idx.getAndIncrement() & strings.length -1]); 
  6.     } 
  7.  

結果集

  1. 第一個 
  2. 第二個 
  3. 第三個 
  4. 第四個 
  5. 第一個 
  6. 第二個 
  7. 第三個 
  8. 第四個 
  9. 第一個 

II、GenericEventExecutorChooser

當你的線程數量不是2的冪次方的時候,會走一個通用的選擇器,具體實現源碼如下:

  1. GenericEventExecutorChooser(EventExecutor[] executors) { 
  2.     this.executors = executors; 
  3.  
  4. @Override 
  5. public EventExecutor next() { 
  6.     //自增  取模   以達到循環的目的 
  7.     //假設executors 長度為5  那么 不斷的循環就會不斷的得到 0 1 2 3 4  0 1 2 3 4。。。 
  8.     return executors[Math.abs(idx.getAndIncrement() % executors.length)]; 

這個代碼就不用了我做演示了吧,他的功能和上面那個功能是一樣的能 能夠達到一個循環取數的功能

思考

為什么Netty要分為兩個策略類來實現呢,直接用第二種不行嗎?

Netty官方對性能的要求達到了極致,大家要知道位運算速度要高于直接取模運算的,所以Netty官方即使是這一點也做了一個優化!

2. 執行器選擇器總結

我們通過上述可以了解到,這里會通過一個選擇器工廠創建一個選擇器,并保存在NioEvenetLoopGroup中,調用該選擇器的next方法會返回一個NioEventLoop對象,其中的獲取方式是不斷的循環,依次獲取NioEventLoop對象,這也是一個NioEventLoop對SocketChannel為一對多的基礎!這都是后話!

NioEventLoopGroup源碼總結

 

  1. 創建一個線程執行器,當調用該線程執行器的execute方法的時候,會講一個Runable對象包裝為Thread對象,再將Thread對象包裝為FastThreadLocalThread對象,然后啟動起來! 簡單來說,每調用一次execute方法,都去創建并啟動一條新線程執行任務!
  2. 創建一個執行器數組,數組長度與我們傳遞的數量有關,默認為CPU*2個數量,然后再循環填充這個空數組,數組里面的元素是一個NioEventLoop對象,每一個NioEventLoop對會持有一個線程執行器的引用!
  3. 創建一個執行器選擇器,調用該執行器選擇器的next方法可以返回一個NioEventLoop對象,內部是進行循環取數的,每一個NioEventLoop都可能會被多次獲取!

 

責任編輯:武曉燕 來源: 源碼學徒
相關推薦

2022-06-09 08:41:17

Go網絡庫Gnet

2021-07-12 22:50:29

Caffeine數據結構

2022-01-02 08:43:46

Python

2022-02-07 11:01:23

ZooKeeper

2021-07-06 08:59:18

抽象工廠模式

2023-11-28 08:29:31

Rust內存布局

2023-01-03 08:31:54

Spring讀取器配置

2021-07-02 09:45:29

MySQL InnoDB數據

2022-08-23 08:00:59

磁盤性能網絡

2021-07-05 22:11:38

MySQL體系架構

2022-08-26 09:29:01

Kubernetes策略Master

2021-05-11 08:54:59

建造者模式設計

2022-04-12 08:30:52

回調函數代碼調試

2021-07-16 22:43:10

Go并發Golang

2021-10-14 10:22:19

逃逸JVM性能

2021-04-29 10:18:18

循環依賴數組

2022-10-20 07:39:26

2023-11-01 09:07:01

Spring裝配源碼

2022-03-11 10:21:30

IO系統日志

2021-10-27 09:59:35

存儲
點贊
收藏

51CTO技術棧公眾號

国产精品中文字幕制服诱惑| 蜜桃视频污在线观看| 日本a一级在线免费播放| 中文一区一区三区免费在线观看| 日韩欧美三级在线| 男人的天堂狠狠干| 日韩欧美亚洲系列| 日韩成人dvd| 中文字幕亚洲欧美日韩在线不卡 | av亚洲在线| 韩国视频一区二区| 亚洲自拍偷拍欧美| 天天影视涩香欲综合网| 肥熟一91porny丨九色丨| 久久精品国产亚洲AV无码男同 | 日韩一区二区三区四区视频| 国产剧情一区二区在线观看| 洋洋av久久久久久久一区| 久久久久一区二区| 国产精品久久久久久免费| 亚洲无线视频| 亚洲另类xxxx| 国产黄色一区二区三区 | 久久6免费高清热精品| 波多野结衣视频播放| 国产中文在线观看| 久久国产精品99久久人人澡| 欧美激情国产日韩精品一区18| 好吊日免费视频| 电影91久久久| 在线观看亚洲精品视频| 91国在线高清视频| 天堂av在线资源| 国产一区二区美女| 国产精品黄色av| 久久精品久久精品久久| 色综合天天综合网中文字幕| 亚洲国产免费av| 久久久久久久久久久久久久久国产| 黄色软件视频在线观看| 1024精品合集| 日韩一区不卡| 天天影院图片亚洲| 不卡大黄网站免费看| 91精品视频免费观看| 九九热在线免费观看| 欧美激情亚洲| 日韩最新av在线| 一区二区三区少妇| 日韩精品视频在线看| 欧美亚洲动漫另类| 欧美激情成人网| a在线视频v视频| 亚洲免费视频中文字幕| 亚洲三区在线| 国产系列电影在线播放网址| 99久久精品免费| 高清国产一区| 亚洲欧美高清视频| 风流少妇一区二区| 久久夜色精品国产欧美乱| 欧美美女性视频| 国产精欧美一区二区三区蓝颜男同| 一卡二卡欧美日韩| 欧洲金发美女大战黑人| 老司机精品影院| 国产精品乱人伦中文| 日韩aⅴ视频一区二区三区| 欧美zozo| 国产清纯白嫩初高生在线观看91 | 国产亚洲一区字幕| 国产区二精品视| 欧美一区二区三区成人片在线| 国产高清无密码一区二区三区| 国产精品稀缺呦系列在线| 中文字幕二区三区| 另类调教123区| 91精品视频大全| 国产同性人妖ts口直男| 国产成人一区二区精品非洲| 成人精品水蜜桃| 国产精品suv一区二区| 中文字幕日韩欧美精品高清在线| 日韩一区二区三区在线播放| 国产日韩精品中文字无码| 色综合五月天| 欧美日韩999| 日本在线视频免费| 免费欧美日韩| 国产精国产精品| 一二三四区在线| 日韩激情综合| 精品一区二区三区免费视频| 国产美女直播视频一区| 91在线精品入口| 国产成人综合亚洲网站| 精品在线观看一区二区| 国产区视频在线| 中日韩免费视频中文字幕| 中文字幕中文字幕在线中心一区| 在线观看毛片视频| 国产va免费精品观看精品| 国产成人在线视频网站| 色综合久久精品亚洲国产| 欧洲第一无人区观看| 欧美日韩少妇| 蜜臀av性久久久久蜜臀av| 九色porny丨首页在线| 亚洲午夜免费视频| 成人在线观看a| 粉嫩91精品久久久久久久99蜜桃| 3atv一区二区三区| 亚洲精品第二页| 成人羞羞动漫| 精品国产av色一区二区深夜久久| 看亚洲a级一级毛片| 91精品国产自产在线观看永久| 熟妇高潮精品一区二区三区| 美女久久久久| 久久九九国产精品怡红院| 久久久久久蜜桃| 玖玖视频精品| a级国产乱理论片在线观看99| 亚洲三区在线播放| 国产日产一区| 亚洲欧美日韩成人| 杨钰莹一级淫片aaaaaa播放| 欧美亚洲一区| 成人午夜电影免费在线观看| 二人午夜免费观看在线视频| 亚洲中国最大av网站| 国产又大又黄又粗的视频| 亚洲电影一区| 精品国产一区二区三区久久狼5月| 亚洲一区欧美在线| 国产一区二区91| 日韩中文字幕一区| 涩涩视频在线播放| 日韩精品中午字幕| 一本一本久久a久久| 丝袜美腿成人在线| 亚洲aaa激情| 2019中文字幕在线视频| 欧美性生交大片免网| 国产乱国产乱老熟300部视频| 精品一区免费| 97热在线精品视频在线观看| 人体私拍套图hdxxxx| 99精品网站| 日韩免费在线播放| 视频午夜在线| 国内自拍第二页| 精品视频在线观看免费观看| 一个色综合导航| 波多野结衣黄色网址| 91麻豆国产自产在线观看| 国产欧美日韩网站| 里番精品3d一二三区| 国内精品400部情侣激情| 亚洲成人黄色片| 亚洲国产毛片aaaaa无费看| 亚洲精品鲁一鲁一区二区三区| 91精品观看| 91精品国产99久久久久久红楼| а√天堂官网中文在线| 欧美大片在线观看| 日韩欧美a级片| 97国产精品videossex| 妺妺窝人体色www在线小说| 天天做夜夜做人人爱精品 | 国产情侣自拍av| 欧美在线影院| 国产精品久久一区二区三区| 99爱在线观看| 亚洲日本成人女熟在线观看| 亚洲综合成人av| 最新国产成人在线观看| 国产又粗又猛又爽又黄| 亚洲精品偷拍| 日本一区二区免费看| 欧美伊人亚洲伊人色综合动图| 伦理中文字幕亚洲| 污污网站免费在线观看| 欧美自拍偷拍一区| 国产又黄又爽又无遮挡| 91蜜桃视频在线| 午夜宅男在线视频| 欧美搞黄网站| 欧美日韩电影一区二区| 四虎精品在线观看| 2023亚洲男人天堂| 在线看免费av| 精品国产sm最大网站| 国产99免费视频| 亚洲欧美电影院| 日韩国产网站| 色吊一区二区三区| 青青操在线视频观看| 成人动漫一区二区在线| 久久精品香蕉视频| 欧美激情视频一区二区三区在线播放| 精品一卡二卡三卡四卡日本乱码| 主播大秀视频在线观看一区二区| 久久夜色精品国产亚洲aⅴ| 视频一区二区三区国产| 日韩一区二区三区精品视频| 欧美一区免费看| 亚洲制服丝袜av| 综合 欧美 亚洲日本| 91在线高清观看| 两女双腿交缠激烈磨豆腐| 久久一区亚洲| 尤物av无码色av无码| 亚洲91视频| 日本一区二区久久精品| 欧美精品密入口播放| 91日本在线观看| 日本中文字幕一区二区| 性色av一区二区咪爱| 成年视频在线观看| 这里只有精品视频| 欧美伦理影视网| 亚洲国产精品热久久| 99国产在线播放| 欧美影片第一页| www.伊人久久| 亚洲h在线观看| 老湿机69福利| 亚洲国产精品成人综合色在线婷婷 | 77导航福利在线| 亚洲男人天堂久| 午夜在线视频免费| 亚洲国产精品va在线看黑人动漫| av中文字幕播放| 在线成人高清不卡| 亚洲怡红院av| 欧美精品高清视频| 亚洲视频一区二区三区四区| 在线观看不卡一区| 精品一区二区国产| 国产精品xxx| 国产成人一区二区三区电影| 2019中文字幕在线电影免费| 欧美国产日韩视频| av网站网址在线观看| 不卡伊人av在线播放| 国产原创精品视频| 日韩在线观看精品| 国产区精品在线| 国产网站一区二区| 欧美性xxxx图片| 91在线丨porny丨国产| 催眠调教后宫乱淫校园| 成人免费看黄yyy456| 日本久久久久久久久久| 成人一区二区三区视频| 国产免费a级片| 成人av手机在线观看| 国产精品美女视频网站| abab456成人免费网址| 国产精品久久婷婷六月丁香| av久久网站| 国产精品视频资源| 亚洲伊人伊成久久人综合网| 91免费精品国偷自产在线| 国产一区二区三区免费观看在线| 91社区国产高清| 88久久精品| 久久精品magnetxturnbtih| 亚洲三级网址| 午夜精品亚洲一区二区三区嫩草 | 欧美日韩综合网| a级片在线观看视频| 国产中文字幕一区| 中文字幕在线观看91| 久久综合久色欧美综合狠狠| 91激情视频在线观看| 亚洲天堂福利av| 精品午夜福利在线观看| 大桥未久av一区二区三区| 波多野结衣视频免费观看| 9191精品国产综合久久久久久| 国产1区在线观看| 亚洲欧美在线x视频| 黄色网页网址在线免费| 久久久久免费视频| 日本韩国欧美| 亚洲va码欧洲m码| 日韩a级大片| 亚洲制服欧美久久| 国产精品www994| 国内自拍视频一区| 国产在线精品视频| 中国美女乱淫免费看视频| 中文字幕亚洲视频| 色播视频在线播放| 欧美片网站yy| 桃花色综合影院| 麻豆成人在线看| 电影亚洲一区| 国产三区二区一区久久| 日本a级不卡| 欧美 丝袜 自拍 制服 另类| 狠狠色丁香婷婷综合| 国产麻豆天美果冻无码视频 | 中文字幕中文字幕在线中一区高清 | 青青在线视频免费| 成人午夜视频网站| 日本伦理一区二区三区| 色婷婷狠狠综合| 亚洲AV无码精品色毛片浪潮| 揄拍成人国产精品视频| 超碰激情在线| 99国产超薄丝袜足j在线观看| 国产日产精品_国产精品毛片| 日韩av中文字幕第一页| 国产中文一区二区三区| 丁香六月激情综合| 色天使久久综合网天天| 深夜福利视频网站| 欧美刺激性大交免费视频| 成人毛片免费| 欧洲精品久久| 国产精品三上| 亚洲国产精品自拍视频| 一区二区激情小说| av av片在线看| 久久久av一区| 日本成人在线网站| 五月天婷亚洲天综合网鲁鲁鲁| 亚洲免费网址| 五十路六十路七十路熟婆| 亚洲国产视频在线| 国产浮力第一页| 美日韩精品免费观看视频| 曰本一区二区| 中文字幕免费在线不卡| 久久国产精品第一页| 日日操免费视频| 欧美日韩国产在线播放网站| 成人在线观看免费| 国产精品老牛影院在线观看| 欧美色爱综合| 亚洲欧美久久久久| 中文字幕的久久| 91精品国产乱码久久| zzjj国产精品一区二区| www久久久| 欧美 国产 精品| 国产v日产∨综合v精品视频| 久草网视频在线观看| 精品国产第一区二区三区观看体验 | 国产成人毛毛毛片| 久久久久久国产免费| 国产欧美一区二区三区米奇| 国自产拍偷拍精品啪啪一区二区| 91色婷婷久久久久合中文| 男人天堂av在线播放| 在线观看欧美日韩国产| 999色成人| 又大又硬又爽免费视频| 97se亚洲国产综合自在线| 波多野结衣黄色网址| 久久色精品视频| 国产suv精品一区| 国产精品欧美激情在线观看 | 久久午夜鲁丝片午夜精品| 亚洲第一级黄色片| 成人在线爆射| 欧洲美女和动交zoz0z| 成人免费福利片| 天天爱天天做天天爽| 日韩视频一区在线| 成人av综合网| 久久久国产欧美| 亚洲人妖av一区二区| 欧美一级淫片免费视频魅影视频| 奇米四色中文综合久久| 97精品中文字幕| 荫蒂被男人添免费视频| 在线免费观看日本欧美| 超碰在线观看免费| 久久久免费看| 国产一区在线观看麻豆| 欧美一区二区激情视频| 日韩中文在线视频| 久久亚洲黄色| www.色就是色.com| 日韩欧美亚洲国产一区| 黄视频在线观看网站| 精品一区国产| 国产一区激情在线| 色老头在线视频| 欧美另类极品videosbestfree| 偷拍视屏一区| 亚洲成人av免费观看| 国内自拍亚洲| 亚洲国产日韩欧美| 成人av在线电影| 91在线你懂的|