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

16圖,一個State竟然搞出了這么多并發鎖

開發 后端
AQS使用FIFO隊列實現了一個鎖相關的并發器模板,可以基于這個模板來實現各種鎖。JDK建議并發鎖工具類使用內部類實現AQS的同步屬性。

[[401843]]

本文轉載自微信公眾號「程序員jinjunzhu」,作者jinjunzhu。轉載本文請聯系程序員jinjunzhu公眾號。

上篇文章扔掉源碼,15張圖帶你徹底理解java AQS通過15張圖講解了AQS管程模型中入口等待隊列原理。AQS使用FIFO隊列實現了一個鎖相關的并發器模板,可以基于這個模板來實現各種鎖。JDK建議并發鎖工具類使用內部類實現AQS的同步屬性。

今天我們就來聊一聊基于AQS實現的各種鎖。

1 ReentrantLock

我們先來看一下UML類圖:

從圖中可以看到,ReentrantLock使用抽象內部類Sync來實現了AQS的方法,然后基于Sync這個同步器實現了公平鎖和非公平鎖。主要實現了下面3個方法:

  • tryAcquire(int arg):獲取獨占鎖
  • tryRelease(int arg):釋放獨占鎖
  • isHeldExclusively:當前線程是否占有獨占鎖

ReentrantLock默認實現的是非公平鎖,可以在構造函數指定。

從實現的方法可以看到,ReentrantLock中獲取的鎖是獨占鎖,我們再來看一下獲取和釋放獨占鎖的代碼:

  1. public final void acquire(int arg) { 
  2.     if (!tryAcquire(arg) && 
  3.         acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) 
  4.         selfInterrupt(); 

獨占鎖的特點是調用上面acquire方法,傳入的參數是1。

1.1 獲取公平鎖

獲取鎖首先判斷同步狀態(state)的值。

1.1.1 state等于0

這說明沒有線程占用鎖,當前線程如果符合下面兩個條件,就可以獲取到鎖:

  • 沒有前任節點,如下圖:

  • CAS的方式更新state值(把0更新成1)成功。

如果獲取獨占鎖成功,會更新AQS中exclusiveOwnerThread為當前線程,這個很容易理解。

1.1.2 state不等于0

這說明已經有線程占有鎖,判斷占有鎖的線程是不是當前線程,如下圖:

state += 1值如果小于0,會拋出異常。

如果獲取鎖失敗,則進入AQS隊列等待喚醒。

1.2 獲取非公平鎖

跟公平鎖相比,非公平鎖的唯一不同是如果判斷到state等于0,不用判斷有沒有前任節點,只要CAS設置state值(把0更新成1)成功,就獲取到了鎖。

1.3 釋放鎖

公平鎖和非公平鎖,釋放邏輯完全一樣,都是在內部類Sync中實現的。釋放鎖需要注意兩點,如下圖:

為什么state會大于1,因為是可以重入的,占有鎖的線程可以多次獲取鎖。

1.4 總結

公平鎖的特點是每個線程都要進行排隊,不用擔心線程永遠獲取不到鎖,但有個缺點是每個線程入隊后都需要阻塞和被喚醒,這一定程度上影響了效率。非公平鎖的特點是每個線程入隊前都會先嘗試獲取鎖,如果獲取成功就不會入隊了,這比公平鎖效率高。但也有一個缺點,隊列中的線程有可能等待很長時間,高并發下甚至可能永遠獲取不到鎖。

2 ReentrantReadWriteLock

我們先來看一下UML類圖:

從圖中可以看到,ReentrantReadWriteLock使用抽象內部類Sync來實現了AQS的方法,然后基于Sync這個同步器實現了公平鎖和非公平鎖。主要實現了下面3個方法:

  • tryAcquire(int arg):獲取獨占鎖
  • tryRelease(int arg):釋放獨占鎖
  • tryAcquireShared(int arg):獲取共享鎖
  • tryReleaseShared(int arg):釋放共享鎖
  • isHeldExclusively:當前線程是否占有獨占鎖

可見ReentrantReadWriteLock里面同時用到了共享鎖和獨占鎖。

下圖是定義的幾個常用變量:

下面這2個方法用戶獲取共享鎖和獨占鎖的數量:

  1. static int sharedCount(int c)    { return c >>> SHARED_SHIFT; } 
  2. static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; } 

從sharedCount可以看到,共享鎖的數量要右移16位獲取,也就是說共享鎖占了高16位。從上圖EXCLUSIVE_MASK的定義看到,跟EXCLUSIVE_MASK進行與運算,得到的是低16位的值,所以獨占鎖占了低16位。如下圖:

這樣上面獲取鎖數量的方法就很好理解了。參考1[1]

2.1 讀鎖

讀鎖的實現對應內部類ReadLock。

2.1.1 獲取讀鎖

獲取讀鎖實際上是ReadLock調用了AQS的下面方法,傳入參數是1:

  1. public final void acquireShared(int arg) { 
  2.     if (tryAcquireShared(arg) < 0) 
  3.         doAcquireShared(arg); 

ReentrantReadWriteLock內部類Sync實現了tryAcquireShared方法,主要包括如下三種情況:

  1. 使用exclusiveCount方法查看state中是否有獨占鎖,如果有并且獨占線程不是當前線程,返回-1,獲取失敗。
  2. 使用sharedCount查看state中共享鎖數量,如果讀鎖數量小于最大值(MAX_COUNT=65535),則再滿足下面3個條件就可以獲取成功并返回1:
  • 當前線程不需要阻塞(readerShouldBlock)。在公平鎖中,需要判斷是否有前置節點,如下圖就需要阻塞:

在非公平鎖中,則是判斷第一個節點是不是有獨占鎖,如下圖就需要阻塞:

  • 使用CAS把state的值加SHARED_UNIT(65536)。

這里是不是就更理解讀鎖占高位的說法了,獲取一個讀鎖,state的值就要加SHARED_UNIT這么多個。

  • 給當前線程的holdCount加1。

如果2失敗,自旋,重復上面的步驟直到獲取到鎖。

tryAcquireShared(獲取共享鎖)會返回一個整數,如下:

  • 返回負數:獲取鎖失敗。
  • 返回0:獲取鎖成功但是之后再由線程來獲取共享鎖時就會失敗。
  • 返回正數:獲取鎖成功而且之后再有線程來獲取共享鎖時也可能會成功。

2.1.2 釋放讀鎖

ReentrantReadWriteLock釋放讀鎖是在ReadLock中調用了AQS下面方法,傳入的參數是1:

  1. public final boolean releaseShared(int arg) { 
  2.     if (tryReleaseShared(arg)) { 
  3.         doReleaseShared(); 
  4.         return true
  5.     } 
  6.     return false

ReentrantReadWriteLock內部類Sync實現了releaseShared方法,具體邏輯分為下面兩步:

當前線程holdCounter值減1。

CAS的方式將state的值減去SHARED_UNIT。

2.2 寫鎖

寫鎖的實現對應內部類WriteLock。

2.2.1 獲取寫鎖

ReentrantReadWriteLock獲取寫鎖其實是在WriteLock中調用了AQS的下面方法,傳入參數1:

  1. public final void acquire(int arg) { 
  2.     if (!tryAcquire(arg) && 
  3.         acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) 
  4.         selfInterrupt(); 

在ReentrantReadWriteLock內部類Sync實現了tryAcquire方法,首先獲取state值和獨占鎖數量(exclusiveCount),之后分如下兩種情況,如下圖:

state不等于0:

  • 獨占鎖數量等于0,這時說明有線程占用了共享鎖,如果當前線程不是獨占線程,獲取鎖失敗。
  • 獨占鎖數量不等于0,獨占鎖數量加1后大于MAX_COUNT,獲取鎖失敗。
  • 上面2種情況不符合,獲取鎖成功,state值加1。

state等于0,判斷當前線程是否需要阻塞(writerShouldBlock)。

在公平鎖中,跟readerShouldBlock的邏輯完全一樣,就是判斷隊列中head節點的后繼節點是不是當前線程。在非公平鎖中,直接返回false,即可以直接嘗試獲取鎖。

如果當前線程不需要阻塞,并且給state賦值成功,使用CAS方式把state值加1,把獨占線程置為當前線程。

2.2.2 釋放寫鎖

ReentrantReadWriteLock釋放寫鎖其實是在WriteLock中調用了AQS的下面方法,傳入參數1:

  1. public final boolean release(int arg) { 
  2.     if (tryRelease(arg)) { 
  3.         Node h = head; 
  4.         if (h != null && h.waitStatus != 0) 
  5.             unparkSuccessor(h); 
  6.         return true
  7.     } 
  8.     return false

ReentrantReadWriteLock在Sync中實現了tryRelease(arg)方法,邏輯如下:

  • 判斷當前線程是不是獨占線程,如果不是,拋出異常。
  • state值減1后,用新state值判斷獨占鎖數量是否等于0
  • 如果等于0,則把獨占線程置為空,返回true,這樣上面的代碼就可以喚醒隊列中的后置節點了
  • 如果不等于0,返回false,不喚醒后繼節點。

3 CountDownLatch

我們先來看一下UML類圖:

從上面的圖中看出,CountDownLatch的內部類Sync實現了獲取共享鎖和釋放共享鎖的邏輯。

使用CountDownLatch時,構造函數會傳入一個int類型的參數count,表示調動count次的countDown后主線程才可以被喚醒。

  1. public CountDownLatch(int count) { 
  2.     if (count < 0) throw new IllegalArgumentException("count < 0"); 
  3.     this.sync = new Sync(count); 

上面的Sync(count)就是將AQS中的state賦值為count。

3.1 await

CountDownLatch的await方法調用了AQS中的acquireSharedInterruptibly(int arg),傳入參數1,不過這個參數并沒有用。代碼如下:

  1. public final void acquireSharedInterruptibly(int arg) 
  2.         throws InterruptedException { 
  3.     if (Thread.interrupted()) 
  4.         throw new InterruptedException(); 
  5.     if (tryAcquireShared(arg) < 0) 
  6.         doAcquireSharedInterruptibly(arg); 

Sync中實現了tryAcquireShared方法,await邏輯如下圖:

上面的自旋過程就是等待state的值不斷減小,只有state值成為0的時候,主線程才會跳出自旋執行之后的邏輯。

3.2 countDown

CountDownLatch的countDown方法調用了AQS的releaseShared(int arg),傳入參數1,不過這個參數并沒有用。內部類Sync實現了tryReleaseShared方法,邏輯如下圖:

3.3 總結

CountDownLatch的構造函數入參值會賦值給state變量,入隊操作是主線程入隊,每個子線程調用了countDown后state值減1,當state值成為0后喚醒主線程。

4 Semaphore

Semaphore是一個信號量,用來保護共享資源。如果線程要訪問共享資源,首先從Semaphore獲取鎖(信號量),如果信號量的計數器等于0,則當前線程進入AQS隊列阻塞等待。否則,線程獲取鎖成功,信號量減1。使用完共享資源后,釋放鎖(信號量加1)。

Semaphore跟管程模型不一樣的是,允許多個(構造函數的permits)線程進入管程內部,因此也常用它來做限流。

UML類圖如下:

Semaphore的構造函數會傳入一個int類型參數,用來初始化state的值。

4.1 acquire

獲取鎖的操作調用了AQS中的acquireSharedInterruptibly方法,傳入參數1,代碼見CountDownLatch中await小節。Semaphore在公平鎖和非公平鎖中分別實現了tryAcquireShared方法。

4.1.1 公平鎖

Semaphore默認使用非公平鎖,如果使用公平鎖,需要在構造函數指定。獲取公平鎖邏輯比較簡單,如下圖:

4.1.2 非公平鎖

acquire在非公平的鎖唯一的區別就是不會判斷AQS隊列是否有前置節點(hasQueuedPredecessors),而是直接嘗試獲取鎖。

除了acquire方法外,還有其他幾個獲取鎖的方法,原理類似,只是調用了AQS中的不同方法。

4.2 release

釋放鎖的操作調用了AQS中的releaseShared(int arg)方法,傳入參數1,在內部類Sync中實現了tryReleaseShared方法,邏輯很簡單:使用CAS的方式將state的值加1,之后喚醒隊列中的后繼節點。

5 ThreadPoolExecutor

ThreadPoolExecutor中也用到了AQS,看下面的UML類圖:

Worker主要在ThreadPoolExecutor中斷線程的時候使用。Worker自己實現了獨占鎖,在中斷線程時首先進行加鎖,中斷操作后釋放鎖。按照官方說法,這里不直接使用ReentrantLock的原因是防止調用控制線程池的方法(類似setCorePoolSize)時能夠重新獲取到鎖,

5.1 tryAcquire

使用CAS的方式把AQS中state從0改為1,把當前線程置為獨占線程。

5.2 tryRelease

把獨占線程置為空,把AQS中state改為0。

Worker初始化的時候會把state置為-1,這樣是不能獲取鎖成功的。只有調用了runWorker方法,才會通過釋放鎖操作把state更為0。這樣保證了只中斷運行中的線程,而不會中斷等待中的線程。

6 總結

AQS基于雙向隊列實現了入口等待隊列,基于state變量實現了各種并發鎖,上篇文章講了入口等待隊列,而這篇文章主要講了基于AQS的并發鎖原理。

 

在管程模型中,還有一塊兒沒有介紹,就是條件等待隊列,請看下篇。

 

責任編輯:武曉燕 來源: 程序員jinjunzhu
相關推薦

2021-09-28 12:25:30

數據庫

2022-09-27 10:52:25

Pythonprint函數

2020-12-01 08:19:15

Redis

2020-06-01 08:04:18

三目運算符代碼

2022-09-21 10:45:42

局域網Mesh網絡結構

2021-01-14 10:24:55

壓縮集合方式

2025-05-26 09:30:00

SQL數據庫索引

2024-04-02 08:41:10

ArrayListSubList場景

2017-08-11 14:21:33

軟件開發前端框架

2023-07-17 08:21:52

漏洞版本項目

2018-12-11 12:58:20

CPU散熱器鰭片

2020-11-20 10:22:34

代碼規范設計

2024-04-29 09:38:16

2021-02-03 20:19:08

Istio流量網格

2019-05-21 15:06:53

微信長按功能分享

2018-06-05 11:06:05

模塊化數據中心管理

2024-07-12 09:35:38

前端工具檢驗

2018-06-26 15:00:24

Docker安全風險

2021-06-05 07:33:09

ID分布式架構

2023-11-13 08:49:54

點贊
收藏

51CTO技術棧公眾號

成人a免费视频| 日韩精品视频观看| 欧美 日韩 国产精品| 精品国产免费无码久久久| 国内揄拍国内精品久久| 日韩精品视频三区| www.99r| 久久久123| 国产欧美日韩亚州综合| 亚洲自拍偷拍网址| 9i看片成人免费看片| 日韩一级毛片| 日韩成人av一区| jizzzz日本| 欧美办公室脚交xxxx| 国产精品护士白丝一区av| 国产乱码一区| 91国偷自产中文字幕久久| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲色图17p| 在线观看中文av| 亚洲播播91| 亚洲成人资源在线| 亚洲一区二区三区乱码| 色视频在线观看免费| 国产精品一二二区| 国产精品午夜视频| 国产精品500部| 亚洲h色精品| 亚洲一区二区精品| a级一a一级在线观看| 看亚洲a级一级毛片| 在线一区二区三区做爰视频网站| 久久精品xxx| 欧美一区二区三区在线观看免费| 91亚洲永久精品| 国产精品国产三级国产专区53| 91麻豆国产视频| 一区二区三区福利| 欧美激情视频一区| 欧美三级 欧美一级| 久久性感美女视频| 亚洲网址你懂得| 国产精品探花一区二区在线观看| 国产成人aa在线观看网站站| 欧美丰满嫩嫩电影| av丝袜天堂网| 欧美电影网址| 欧美日韩在线视频观看| 免费av手机在线观看| 青草在线视频| 亚洲一卡二卡三卡四卡无卡久久| 97超碰在线视| 在线观看av免费| 一区二区视频在线| 国产精品自拍合集| 狂野欧美性猛交xxxxx视频| 一区二区三区四区av| 超碰97在线看| 在线不卡日本v二区707| 亚洲一区二区在线免费观看视频| 一二三在线视频| 四虎亚洲精品| 亚洲午夜私人影院| 欧美日韩成人免费视频| 蜜桃视频m3u8在线观看| 欧美性精品220| 91av在线免费播放| 欧美free嫩15| 欧美年轻男男videosbes| 一二三级黄色片| 亚洲国产中文在线| 亚洲激情在线观看| 中文字幕人妻一区二区| 国产精品中文字幕亚洲欧美| 亚洲一区999| 久久99久久99精品免费看小说| 婷婷久久综合| 欧美激情18p| 欧美日韩一二三四区| 天堂一区二区在线免费观看| 国产欧美精品xxxx另类| 国产精品久久久久久免费 | 凸凹人妻人人澡人人添| 91在线视频播放| 日韩高清av电影| av中文字幕在线观看| 亚洲一区二区高清| 国产免费人做人爱午夜视频| 日本国产亚洲| 亚洲成av人片在线观看香蕉| 精品国产av无码| 久久在线电影| 久久男人的天堂| 波多野结衣视频网址| 国产一区二区三区精品视频| 国产精品一区在线播放| 超碰在线国产| 亚洲综合成人在线视频| 日本999视频| 免费一区二区三区在线视频| 亚洲欧美另类在线观看| 国产麻豆a毛片| 亚洲视频大全| 亚洲iv一区二区三区| 美女毛片在线看| 亚洲激情五月婷婷| 妓院一钑片免看黄大片| 草草视频在线一区二区| 中文字幕精品av| 国语对白一区二区| 久久福利资源站| 久久亚洲综合网| 91黄色在线| 欧美影视一区二区三区| 激情综合丁香五月| 久久精品青草| 国产精品久久久久免费a∨大胸| 亚洲欧美另类日韩| 亚洲欧洲精品成人久久奇米网| 欧美深夜福利视频| 亚洲经典视频| 日韩中文字幕网| 国产一区二区视频免费| 国产99久久久精品| 国产91av视频在线观看| 亚洲精品一级二级| 亚洲国产日韩欧美在线99| 国精品无码一区二区三区| 日本欧美在线观看| 久久伦理网站| 黄视频网站在线观看| 日韩欧美电影一区| 99久久精品久久亚洲精品| 久久国产福利| 精品在线视频一区二区| 欧美四级在线| 欧美一级久久久久久久大片| 国产精品综合激情| 日韩福利视频导航| 欧美日韩综合另类| 午夜av不卡| 精品亚洲精品福利线在观看| 日韩伦人妻无码| 国产69精品久久777的优势| 日本精品福利视频| 亚洲啊v在线免费视频| 久热在线中文字幕色999舞| 一区二区自拍偷拍| 中文字幕av在线一区二区三区| 人妻无码视频一区二区三区| 亚洲欧洲av| 热久久视久久精品18亚洲精品| 天堂а在线中文在线无限看推荐| 亚洲h在线观看| japanese在线观看| 国产日本精品| 免费99视频| 色豆豆成人网| 深夜精品寂寞黄网站在线观看| 中文字幕日本人妻久久久免费| 国产精品久久久一区麻豆最新章节| chinese少妇国语对白| 精品国产午夜| 91免费欧美精品| 污污的视频在线观看| 精品久久久久一区二区国产| 久草手机在线观看| 久久精品一二三| 亚洲性生活网站| 色乱码一区二区三区网站| 91欧美日韩一区| 9lporm自拍视频区在线| 亚洲人成在线免费观看| 亚洲综合网av| 亚洲综合激情小说| 国产精品1000部啪视频| 青青草国产成人99久久| 中文字幕免费高| 一区二区在线免费播放| 5252色成人免费视频| av片在线免费观看| 日韩欧美在线综合网| 欧美一级视频免费观看| 国产喷白浆一区二区三区| theporn国产精品| 伊人久久成人| 日韩三级电影网站| 国产日韩一区二区三免费高清| 欧美日本中文字幕| 男人的天堂在线视频| 欧美日本不卡视频| 久久精品这里有| 中文字幕av资源一区| av不卡中文字幕| 日韩1区2区日韩1区2区| 亚洲五码在线观看视频| 蜜臀久久99精品久久一区二区| 国产在线视频一区| 狠狠操一区二区三区| 伊人成人开心激情综合网| 亚洲AV无码精品色毛片浪潮| 色婷婷综合久久久中文字幕| 青草影院在线观看| 久久免费国产精品| 国产伦理在线观看| 日本不卡视频一二三区| 久久99久久99精品| 99久久99视频只有精品| 美国av一区二区三区| 国产午夜亚洲精品一级在线| 日韩美女毛茸茸| 男男gaygays亚洲| 精品国偷自产在线视频99| 污污的视频网站在线观看| 欧美日韩大陆一区二区| 中文字幕视频网站| 亚洲一区二区在线免费观看视频| 任你操精品视频| 99精品欧美一区| 国模大尺度视频| 久久99久国产精品黄毛片色诱| 国模吧无码一区二区三区| 欧美午夜久久| 色呦呦网站入口| 日韩精品dvd| 欧美日韩国产高清视频| 精品国内亚洲2022精品成人| 91九色极品视频| 伊人久久一区| 国产精品视频永久免费播放| 超碰国产一区| 欧美在线视频一二三| 免费看男女www网站入口在线| 欧美二区乱c黑人| 福利在线视频网站| 久久精品视频一| 久久日韩视频| 日韩视频免费在线观看| 男人和女人做事情在线视频网站免费观看| 亚洲午夜av久久乱码| 日本一区视频| 精品亚洲精品福利线在观看| 色视频在线观看| 亚洲欧美国产va在线影院| 天堂中文字幕在线| 精品视频在线播放| 麻豆app在线观看| 亚洲欧美日韩综合| 加勒比一区二区三区在线| 亚洲精品之草原avav久久| 四虎免费在线观看| 亚洲精品美女视频| 青青国产在线| 亚洲丝袜av一区| 搞黄视频免费在线观看| 在线视频国产日韩| 免费在线观看av| 久久中文字幕一区| 日本资源在线| 91精品国产精品| 免费福利视频一区二区三区| 日本午夜人人精品| 成人黄色毛片| 91久久精品日日躁夜夜躁国产| 日韩区欧美区| 国产一区精品视频| 欧美美乳视频| 一本一本a久久| 欧美精品日本| 欧美老熟妇喷水| 青青草精品视频| 在线观看免费看片| 97久久精品人人爽人人爽蜜臀| 色一情一交一乱一区二区三区| 中文字幕日本乱码精品影院| 免费在线一区二区三区| 欧美日韩国产精品专区| 嫩草影院一区二区三区| 欧美电影在线免费观看| 噜噜噜久久,亚洲精品国产品| 亚洲精品一区二区三区婷婷月| 岛国视频免费在线观看| 久久国产精品久久久久| 成年男女免费视频网站不卡| 国产精品久久久久久久久影视 | 精品视频1区2区| 精品国产区一区二| 国产视频欧美视频| 日本视频在线观看| 97视频在线观看免费| 高清av一区| 国产精品高清一区二区三区| 日韩.com| 日韩视频在线视频| 久久99蜜桃精品| 狠狠人妻久久久久久综合蜜桃| 国产精品久久久久久福利一牛影视| 国产无套在线观看| 欧美色综合网站| 亚洲aⅴ乱码精品成人区| 日韩亚洲精品视频| a欧美人片人妖| 成人欧美一区二区三区黑人免费| 最新国产一区| 无码av天堂一区二区三区| 蓝色福利精品导航| 中文乱码人妻一区二区三区视频| 1024精品合集| 无码人妻精品一区二区三区不卡| 日韩精品一区二区三区视频| 国产高清一区在线观看| 韩国精品久久久999| 成人国产精品久久| 欧美日韩亚洲在线| 亚洲福利专区| 亚洲丝袜在线观看| 亚洲欧美在线视频| 波多野结衣二区三区| 亚洲黄色在线看| 午夜成年人在线免费视频| 国产专区精品视频| 色狮一区二区三区四区视频| 草草久久久无码国产专区| 成人午夜看片网址| 东方av正在进入| 欧美二区乱c少妇| 日本不卡不卡| 国产精品免费看久久久香蕉 | 丰满亚洲少妇av| 99久久婷婷国产综合| 精品污污网站免费看| 欧美捆绑视频| 人人爽久久涩噜噜噜网站| 欧洲精品一区| 精品少妇人妻av免费久久洗澡| 国产成人av电影在线| 国产麻豆视频在线观看| 欧美日韩国产美| 在线免费观看黄色av| 国产精品第一区| 成人黄色av| 五月婷婷激情久久| 日本一区二区三区国色天香| 国产女主播喷水视频在线观看| 亚洲天堂av在线播放| 成人欧美大片| 欧美一区国产一区| 久色成人在线| 日本一卡二卡在线播放| 欧美日韩国产美女| а√中文在线8| 亚洲综合一区二区不卡| 国户精品久久久久久久久久久不卡| 97免费公开视频| 亚洲第一福利视频在线| 天天综合天天色| 国产成人在线一区二区| 成人羞羞视频在线看网址| 久久婷五月综合| 亚洲欧美日韩久久精品| 亚洲产国偷v产偷v自拍涩爱| 久久免费国产精品1| 欧美绝顶高潮抽搐喷水合集| 日本久久久精品视频| 国产亚洲精品资源在线26u| 中日韩在线观看视频| 北条麻妃久久精品| 在线精品视频一区| www.com毛片| 中文字幕不卡在线观看| 99久久夜色精品国产亚洲| 欧美激情精品久久久久久免费印度 | 日韩欧美在线一区| 在线观看黄色av| 99re6热在线精品视频播放速度| 99综合在线| 少妇视频在线播放| 日韩一区二区免费在线观看| 日韩伦理在线| 国产精品99久久久久久大便| 成人免费av在线| 最近中文字幕在线免费观看 | 国产在线视视频有精品| 精品爆乳一区二区三区无码av| 精品粉嫩超白一线天av| 日韩电影免费观| 国产激情片在线观看| 久久这里只有精品首页| 一卡二卡三卡在线| 国内外成人免费激情在线视频| 国产精品一区二区99| www.久久av.com| 精品国产乱码久久久久久天美 | 久久久久久中文| 免费久久久久久久久| 亚洲熟女乱综合一区二区| 欧美性猛交99久久久久99按摩| 麻豆传媒在线免费| 麻豆蜜桃91|