精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久精品国产精品亚洲精品| 成人性生交大片免费看中文视频| 中文无字幕一区二区三区| 国产一区二区色| 国产亚洲精品av| 亚洲专区视频| 欧美一级在线视频| www.国产区| 宅男在线观看免费高清网站| 2017欧美狠狠色| 91在线看www| 免费无遮挡无码永久视频| 国产综合在线观看| 国产精品18久久久久久久网站| 欧美亚州一区二区三区| 男女全黄做爰文章| 亚洲va久久| 日韩欧美电影一二三| 999精品网站| 久久免费电影| 亚洲欧洲精品天堂一级 | 上原亚衣av一区二区三区| 国产成人av片| 激情久久免费视频| 欧美性受xxxx| 国产av天堂无码一区二区三区| 欧美日韩xx| 久久久久久久av麻豆果冻| 成人免费看片网址| 91久久久久国产一区二区| 久热综合在线亚洲精品| 久久久久久久国产| 欧美成人免费看| 久久亚洲成人| 亚洲人av在线影院| v天堂中文在线| 婷婷视频一区二区三区| 中文字幕一区二区三区不卡在线 | 999久久久亚洲| 亚洲少妇激情视频| 色综合久久五月| a看欧美黄色女同性恋| 制服丝袜av成人在线看| 日本激情视频在线播放| yw.尤物在线精品视频| 国产精品麻豆欧美日韩ww| 91精品久久久久久久久青青| 丁香社区五月天| 久久av一区| 欧美专区第一页| 国产一级做a爱片久久毛片a| 日韩午夜一区| 97婷婷大伊香蕉精品视频| 特级西西人体wwwww| 黄色欧美网站| 亚洲精品久久久久中文字幕欢迎你 | 性活交片大全免费看| 亚洲国产欧美国产第一区| 中文字幕一区在线观看视频| 午夜一区二区三区| 成年人视频在线免费观看| 日本一区二区在线不卡| 色一情一乱一伦一区二区三区| 韩国福利在线| 国产精品亲子乱子伦xxxx裸| 在线观看亚洲视频啊啊啊啊| 亚洲国产精品18久久久久久| 高清成人在线观看| 精品国产一区二区三区日日嗨| 人妻丰满熟妇av无码区hd| 99久久国产免费看| 欧美日韩视频在线一区二区观看视频| 男男激情在线| 国产精品久久久久久久午夜片| 爱爱爱视频网站| 牛牛精品在线| 色哟哟在线观看一区二区三区| 久久久久久三级| 一区二区三区日本视频| 亚洲精品一区在线观看| 国产三级国产精品国产专区50| www.欧美| 日韩av在线免费观看| 少妇无套高潮一二三区| 外国成人激情视频| 国产综合在线视频| 在线观看污污网站| 国产精品一区二区黑丝| 久久综合中文色婷婷| 欧美三级黄网| 粉嫩老牛aⅴ一区二区三区 | 国产精品字幕| 日韩精品专区在线影院观看| 欧美 日本 国产| 91精品久久久久久久久久不卡| 国产69精品久久久久99| 亚洲天堂网在线视频| 成人网页在线观看| 天堂资源在线亚洲资源| xxx性欧美| 亚洲黄色尤物视频| 午夜肉伦伦影院| 日韩脚交footjobhd| 亚洲一区日韩精品中文字幕| 茄子视频成人免费观看| 国产精品久久久久久久久久辛辛 | 精品人妻无码一区二区三区| 国产精品久久久久久| 2024亚洲男人天堂| 国产三级小视频| 久久99精品久久久久久动态图| www日韩av| 成年人在线视频免费观看| 亚洲一区二区中文在线| 超碰在线人人爱| 欧美日韩导航| 九九久久久久99精品| 亚洲 小说区 图片区| 不卡一卡二卡三乱码免费网站| 色呦呦网站入口| 欧美特黄aaaaaaaa大片| 亚洲成人动漫在线播放| 日本一级大毛片a一| 色爱综合网欧美| 久久精品最新地址| 一级黄色在线观看| 91色综合久久久久婷婷| 成人免费观看在线| 精品国产一区二区三区2021| 最近中文字幕日韩精品 | 国产精品suv一区二区88| 久久久久欧美精品| 狠狠色综合色区| 国产网红在线观看| 日韩女优av电影在线观看| 黄色录像一级片| 久久国产精品99久久人人澡| 日韩欧美激情一区二区| 美女100%一区| 337p亚洲精品色噜噜噜| 一级黄色性视频| 亚洲理伦在线| 久久99国产精品| 欧美日韩在线观看首页| 日韩国产欧美区| 天堂网一区二区三区| 9色porny自拍视频一区二区| 男人天堂a在线| 欧美电影免费网站| 91av在线免费观看| 日本私人网站在线观看| 欧美日韩在线视频首页| 男女黄床上色视频| 久久精品伊人| 日韩在线三区| 亚洲欧美专区| 欧美激情中文网| 内射后入在线观看一区| 午夜精品久久久久久久蜜桃app| 怡红院一区二区| 亚洲男女自偷自拍| 欧洲国产精品| 欧美黄页免费| 欧美人交a欧美精品| 四虎免费在线观看| 色狠狠桃花综合| 波多野结衣三级视频| 欧美精品综合| 久久av一区二区| 日本一区免费网站| 精品国偷自产在线视频99| 国产成人精品亚洲精品色欲| 亚洲成av人在线观看| 男生裸体视频网站| 蜜臀精品一区二区三区在线观看| 亚洲图片都市激情| 日韩欧美一级| 欧美性一区二区三区| 91官网在线| 色婷婷一区二区三区四区| 欧美激情 一区| 国产成人一区在线| 看av免费毛片手机播放| 日韩一区二区三区免费播放| 91在线在线观看| 台湾佬成人网| 欧美国产日韩精品| 高清av在线| 日韩欧美一区二区免费| 久久久免费高清视频| 亚洲人精品午夜| 亚洲国产果冻传媒av在线观看| 欧美成人精品| 欧美久久久久久一卡四| 大胆国模一区二区三区| 97在线视频精品| 免费观看在线午夜影视| 亚洲国产成人精品女人久久久 | 日本在线观看一区二区| 久久国际精品| 国产精品美女www| 538在线视频| 久久视频在线视频| 欧美日韩伦理片| 精品欧美乱码久久久久久| 国产精品第六页| 亚洲成av人片在线观看| 精品国产大片大片大片| 久久久精品国产免费观看同学| 超碰91在线播放| 日韩福利电影在线| 成 年 人 黄 色 大 片大 全| 午夜激情久久| 色综合666| 亚洲第一论坛sis| 国产精品一区二区三区在线| 日韩成人一区| 国产精品久久久久久中文字| 免费h视频在线观看| 欧美黄色片在线观看| 日本美女高清在线观看免费| 67194成人在线观看| 国产日产精品一区二区三区| 亚洲一区二区高清| 欧美交换国产一区内射| ...xxx性欧美| 美国黄色片视频| 国产精品免费av| 91视频免费在观看| 久久久精品tv| 中文字幕av网址| 97se亚洲国产综合自在线| 欧美熟妇精品一区二区| 国产剧情在线观看一区二区| 亚洲制服中文字幕| 激情综合色播五月| 国内精品视频一区二区三区| 亚洲欧美一区在线| 色婷婷777777仙踪林| 99精品网站| 中文字幕av日韩精品| 久久久影院免费| 在线天堂一区av电影| 四季av一区二区凹凸精品| 亚洲欧洲国产日韩精品| 成人看的羞羞网站| 性欧美videosex高清少妇| 欧美日韩国产高清电影| 亚洲精品国产一区| 99精品美女| 四虎免费在线观看视频| 亚洲欧美综合| 欧美图片激情小说| 99精品热视频只有精品10| 草草久久久无码国产专区| 免费在线观看成人av| 免费男同深夜夜行网站 | 国产精品久久久精品| 日本久久一区| 亚洲aaa激情| 亚洲日本视频在线| 国产亚洲欧美一区二区| 婷婷综合一区| 天天爽天天狠久久久| 一区二区中文| 免费观看国产精品视频| 视频一区二区国产| 日韩成人精品视频在线观看| 亚洲欧美日本日韩| 国产男女激情视频| 久久99国产精品成人| 野花视频免费在线观看| 蜜臀av国产精品久久久久| 国内外成人免费在线视频| 国产伦理精品不卡| 亚洲国产精品无码久久久久高潮 | 亚洲欧洲精品在线观看| 999国产精品永久免费视频app| 日韩一级特黄毛片| 精品国产精品久久一区免费式| 日韩性感在线| 9l视频白拍9色9l视频| 天堂一区二区在线| 中文字幕22页| 丁香六月久久综合狠狠色| 91精品人妻一区二区| 国产精品美日韩| 久久久久无码精品国产| 都市激情亚洲色图| 136福利视频导航| 欧美成人三级在线| 好男人免费精品视频| 欧美精品中文字幕一区| 韩国美女久久| 91蜜桃网站免费观看| 亲子伦视频一区二区三区| 日韩欧美一区二区三区四区五区| 永久亚洲成a人片777777| 精品99在线视频| 国产精品18久久久久久久久久久久 | 国产午夜精品一区二区三区| 91小视频xxxx网站在线| 庆余年2免费日韩剧观看大牛| 韩国一区二区三区视频| 日韩精品最新在线观看| 尹人成人综合网| 奇米视频7777| 26uuu成人网一区二区三区| 三级影片在线看| 欧美天天综合网| 四虎影视精品成人| 欧美成人精品一区| av在线不卡精品| 欧美大香线蕉线伊人久久| 女人色偷偷aa久久天堂| 亚洲精品20p| 国产日韩亚洲欧美综合| 99久在线精品99re8热| 日韩欧美黄色影院| 免费日本一区二区三区视频| 日本中文字幕久久看| 久久综合另类图片小说| 久操手机在线视频| 国产在线一区二区综合免费视频| 色欲AV无码精品一区二区久久| 性做久久久久久免费观看| 99在线观看免费| 久久精品一区中文字幕| 国产美女久久| 亚洲欧美日韩精品久久久| 日韩高清不卡一区二区三区| a级大片在线观看| 欧美视频二区36p| 天天操天天干天天爽| 国产+人+亚洲| 另类春色校园亚洲| www.av蜜桃| 成人美女视频在线观看| 免看一级a毛片一片成人不卡| 91精品久久久久久久久99蜜臂| 18免费在线视频| 国产日韩在线精品av| 日韩欧美一区免费| 性猛交ⅹ×××乱大交| 国产精品免费网站在线观看| 国产午夜无码视频在线观看| 亚洲欧美国内爽妇网| 成人爽a毛片免费啪啪| 欧美精品免费观看二区| 老牛嫩草一区二区三区日本| 大又大又粗又硬又爽少妇毛片| 欧美日韩在线视频一区二区| 欧美婷婷久久五月精品三区| 日韩av免费在线| 国内黄色精品| 色婷婷一区二区三区av免费看| 国产精品视频线看| 99久久精品无免国产免费| 理论片在线不卡免费观看| 视频亚洲一区二区| 久久国产精品网| 26uuu久久天堂性欧美| 国产精品免费无遮挡无码永久视频| 国产一区二区三区三区在线观看| 欧美国产日韩电影| 少妇高潮流白浆| 成人免费毛片app| 精品人妻一区二区色欲产成人| 在线观看日韩www视频免费| 亚洲色图综合| 国产av人人夜夜澡人人爽麻豆 | 三级黄色在线观看| 日韩亚洲欧美综合| 亚洲优女在线| 一区二区三区久久网| 国产69精品久久99不卡| 国产又黄又猛又粗又爽| 日日噜噜噜夜夜爽亚洲精品| 一区二区在线免费播放| 日韩欧美在线播放视频| 中文字幕一区二区不卡| 国模私拍视频在线| 国产激情视频一区| 欧美不卡一区| 干b视频在线观看| 日韩网站在线看片你懂的| 周于希免费高清在线观看| 成人性做爰片免费视频| 91免费在线视频观看| 国产精品久久综合青草亚洲AV| 97久久国产精品| 国产精品x453.com| 一区二区三区少妇| 欧美丰满一区二区免费视频| 色婷婷av一区二区三区之红樱桃| 国产91色在线|| 亚洲视频一二| 亚洲女同二女同志奶水| 日韩va亚洲va欧洲va国产| 图片一区二区|