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

靈魂拷問,AQS 是個啥???

開發 開發工具
AQS 隊列在內部維護了一個 FIFO 的雙向鏈表,如果對數據結構比較熟的話,應該很容易就能想到,在雙向鏈表中,每個節點都有兩個指針,分別指向直接前驅節點和直接后繼節點。

 啥?你連 AQS 是啥都不知道?

如果想要精通 Java 并發的話, AQS 是一定要掌握的。今天跟著阿粉一起搞一搞。

[[328494]]

基本概念

AQS 是 AbstractQueuedSynchronizer 的簡稱,翻譯成中文就是 抽象隊列同步器 ,這三個單詞分開來看:

  • Abstract (抽象):也就是說, AQS 是一個抽象類,只實現一些主要的邏輯,有些方法推遲到子類實現
  • Queued (隊列):隊列有啥特征呢?先進先出( FIFO )對吧?也就是說, AQS 是用先進先出隊列來存儲數據的
  • Synchronizer (同步):即 AQS 實現同步功能

以上概括一下, AQS 是一個用來構建鎖和同步器的框架,使用 AQS 能簡單而又高效地構造出同步器。

AQS 內部實現

AQS 隊列在內部維護了一個 FIFO 的雙向鏈表,如果對數據結構比較熟的話,應該很容易就能想到,在雙向鏈表中,每個節點都有兩個指針,分別指向直接前驅節點和直接后繼節點。使用雙向鏈表的優點之一,就是從任意一個節點開始都很容易訪問它的前驅節點和后繼節點。

在 AQS 中,每個 Node 其實就是一個線程封裝,當線程在競爭鎖失敗之后,會封裝成 Node 加入到 AQS 隊列中;獲取鎖的線程釋放鎖之后,會從隊列中喚醒一個阻塞的 Node (也就是線程)

AQS 使用 volatile 的變量 state 來作為資源的標識:

  1. private volatile int state; 

關于 state 狀態的讀取與修改,子類可以通過覆蓋 getState() 和 setState() 方法來實現自己的邏輯,其中比較重要的是:

  1. // 傳入期望值 expect ,想要修改的值 update ,然后通過 Unsafe 的 compareAndSwapInt() 即 CAS 操作來實現 
  2. protected final boolean compareAndSetState(int expect, int update) { 
  3.     // See below for intrinsics setup to support this 
  4.     return unsafe.compareAndSwapInt(this, stateOffset, expect, update); 

下面是 AQS 中兩個重要的成員變量:

  1. private transient volatile Node head;   // 頭結點 
  2. private transient volatile Node tail;   // 尾節點 

關于 AQS 維護的雙向鏈表,在源碼中是這樣解釋的:

  • The wait queue is a variant of a "CLH" (Craig, Landin, and Hagersten) lock queue. CLH locks are normally used for spinlocks. We instead use them for blocking synchronizers, but use the same basic tactic of holding some of the control information about a thread in the predecessor of its node.

也就是 AQS 的等待隊列是 “CLH” 鎖定隊列的變體

直接來一張圖會更形象一些:

Node 節點維護的是線程,控制線程的一些操作,具體來看看是 Node 是怎么做的:

  1. static final class Node { 
  2.     /** Marker to indicate a node is waiting in shared mode */ 
  3.     // 標記一個節點,在 共享模式 下等待 
  4.     static final Node SHARED = new Node(); 
  5.   
  6.     /** Marker to indicate a node is waiting in exclusive mode */ 
  7.     // 標記一個節點,在 獨占模式 下等待 
  8.     static final Node EXCLUSIVE = null
  9.  
  10.     /** waitStatus value to indicate thread has cancelled */ 
  11.     // waitStatus 的值,表示該節點從隊列中取消 
  12.     static final int CANCELLED =  1; 
  13.   
  14.     /** waitStatus value to indicate successor's thread needs unparking */ 
  15.     // waitStatus 的值,表示后繼節點在等待喚醒 
  16.     // 只有處于 signal 狀態的節點,才能被喚醒 
  17.     static final int SIGNAL    = -1; 
  18.   
  19.     /** waitStatus value to indicate thread is waiting on condition */ 
  20.     // waitStatus 的值,表示該節點在等待一些條件 
  21.     static final int CONDITION = -2; 
  22.   
  23.  /** 
  24.      * waitStatus value to indicate the next acquireShared should 
  25.      * unconditionally propagate 
  26.     */ 
  27.     // waitStatus 的值,表示有資源可以使用,新 head 節點需要喚醒后繼節點 
  28.     // 如果是在共享模式下,同步狀態應該無條件傳播下去 
  29.     static final int PROPAGATE = -3; 
  30.  
  31.  // 節點狀態,取值為 -3,-2,-1,0,1 
  32.     volatile int waitStatus; 
  33.  
  34.  // 前驅節點 
  35.     volatile Node prev; 
  36.  
  37.  // 后繼節點 
  38.     volatile Node next
  39.  
  40.  // 節點所對應的線程 
  41.     volatile Thread thread; 
  42.  
  43.  // condition 隊列中的后繼節點 
  44.     Node nextWaiter; 
  45.  
  46.  // 判斷是否是共享模式 
  47.     final boolean isShared() { 
  48.         return nextWaiter == SHARED; 
  49.     } 
  50.  
  51.  /** 
  52.  * 返回前驅節點 
  53.  */ 
  54.     final Node predecessor() throws NullPointerException { 
  55.         Node p = prev; 
  56.         if (p == null
  57.             throw new NullPointerException(); 
  58.         else 
  59.             return p; 
  60.     } 
  61.  
  62.     Node() {    // Used to establish initial head or SHARED marker 
  63.     } 
  64.  
  65.  /** 
  66.  * 將線程構造成一個 Node 節點,然后添加到 condition 隊列中 
  67.  */ 
  68.     Node(Thread thread, Node mode) {     // Used by addWaiter 
  69.         this.nextWaiter = mode; 
  70.         this.thread = thread; 
  71.     } 
  72.  
  73.  /** 
  74.  * 等待隊列用到的方法 
  75.  */ 
  76.     Node(Thread thread, int waitStatus) { // Used by Condition 
  77.         this.waitStatus = waitStatus; 
  78.         this.thread = thread; 
  79.     } 

AQS 如何獲取資源

在 AQS 中,獲取資源的入口是 acquire(int arg) 方法,其中 arg 是獲取資源的個數,來看下代碼:

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

在獲取資源時,會首先調用 tryAcquire 方法,這個方法是在子類中具體實現的

如果通過 tryAcquire 獲取資源失敗,接下來會通過 addWaiter(Node.EXCLUSIVE) 方法,將這個線程插入到等待隊列中,具體代碼:

  1. private Node addWaiter(Node mode) { 
  2.  // 生成該線程所對應的 Node 節點 
  3.     Node node = new Node(Thread.currentThread(), mode); 
  4.     // 將 Node 插入到隊列中 
  5.     Node pred = tail; 
  6.     if (pred != null) { 
  7.         node.prev = pred; 
  8.         // 使用 CAS 操作,如果成功就返回 
  9.         if (compareAndSetTail(pred, node)) { 
  10.             pred.next = node; 
  11.             return node; 
  12.         } 
  13.     } 
  14.     // 如果 pred == null 或者 CAS 操作失敗,則調用 enq 方法再次自旋插入 
  15.     enq(node); 
  16.     return node; 
  17.   
  18. // 自旋 CAS 插入等待隊列 
  19. private Node enq(final Node node) { 
  20.     for (;;) { 
  21.         Node t = tail; 
  22.         if (t == null) { // Must initialize 
  23.             if (compareAndSetHead(new Node())) 
  24.                 tail = head; 
  25.         } else { 
  26.             node.prev = t; 
  27.             if (compareAndSetTail(t, node)) { 
  28.                 t.next = node; 
  29.                 return t; 
  30.             } 
  31.         } 
  32.     } 

在上面能夠看到使用的是 CAS 自旋插入,這是因為在 AQS 中會存在多個線程同時競爭資源的情況,進而一定會出現多個線程同時插入節點的操作,這里使用 CAS 自旋插入是為了保證操作的線程安全性

現在呢,申請 acquire(int arg) 方法,然后通過調用 addWaiter 方法,將一個 Node 插入到了隊列尾部。處于等待隊列節點是從頭結點開始一個一個的去獲取資源,獲取資源方式如下:

  1. final boolean acquireQueued(final Node node, int arg) { 
  2.     boolean failed = true
  3.     try { 
  4.         boolean interrupted = false
  5.         for (;;) { 
  6.             final Node p = node.predecessor(); 
  7.             // 如果 Node 的前驅節點 p 是 head,說明 Node 是第二個節點,那么它就可以嘗試獲取資源 
  8.             if (p == head && tryAcquire(arg)) { 
  9.              // 如果資源獲取成功,則將 head 指向自己 
  10.                 setHead(node); 
  11.                 p.next = null; // help GC 
  12.                 failed = false
  13.                 return interrupted; 
  14.             } 
  15.             // 節點進入等待隊列后,調用 shouldParkAfterFailedAcquire 或者 parkAndCheckInterrupt 方法 
  16.             // 進入阻塞狀態,即只有頭結點的線程處于活躍狀態 
  17.             if (shouldParkAfterFailedAcquire(p, node) && 
  18.                 parkAndCheckInterrupt()) 
  19.                 interrupted = true
  20.         } 
  21.     } finally { 
  22.         if (failed) 
  23.             cancelAcquire(node); 
  24.     } 

在獲取資源時,除了 acquire 之外,還有三個方法:

  • acquireInterruptibly :申請可中斷的資源(獨占模式)
  • acquireShared :申請共享模式的資源
  • acquireSharedInterruptibly :申請可中斷的資源(共享模式)

到這里,關于 AQS 如何獲取資源就說的差不多了,接下來看看 AQS 是如何釋放資源的

AQS 如何釋放資源

釋放資源相對于獲取資源來說,簡單了很多。源碼如下:

  1. public final boolean release(int arg) { 
  2.  // 如果釋放鎖成功 
  3.     if (tryRelease(arg)) {  
  4.      // 獲取 AQS 隊列中的頭結點 
  5.         Node h = head; 
  6.         // 如果頭結點不為空,且狀態 != 0 
  7.         if (h != null && h.waitStatus != 0) 
  8.          // 調用 unparkSuccessor(h) 方法,喚醒后續節點 
  9.             unparkSuccessor(h); 
  10.         return true
  11.     } 
  12.     return false
  13.  
  14. private void unparkSuccessor(Node node) { 
  15.     int ws = node.waitStatus; 
  16.     // 如果狀態是負數,嘗試將它改為 0 
  17.     if (ws < 0) 
  18.         compareAndSetWaitStatus(node, ws, 0); 
  19.  // 得到頭結點的后繼節點 
  20.     Node s = node.next
  21.     // 如果 waitStatus 大于 0 ,說明這個節點被取消 
  22.     if (s == null || s.waitStatus > 0) { 
  23.         s = null
  24.         // 那就從尾節點開始,找到距離 head 最近的一個 waitStatus<=0 的節點進行喚醒 
  25.         for (Node t = tail; t != null && t != node; t = t.prev) 
  26.             if (t.waitStatus <= 0) 
  27.                 s = t; 
  28.     } 
  29.     // 如果后繼節點不為空,則將其從阻塞狀態變為非阻塞狀態 
  30.     if (s != null
  31.         LockSupport.unpark(s.thread); 

AQS 兩種資源共享模式

資源有兩種共享模式:

  • 獨占模式( Exclusive ):資源是獨占的,也就是一次只能被一個線程占有,比如 ReentrantLock
  • 共享模式( Share ):同時可以被多個線程獲取,具體的資源個數可以通過參數來確定,比如 Semaphore/CountDownLatch

看到這里, AQS 你 get 了嘛?

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2019-11-19 10:32:55

Java語言程序員

2020-05-29 11:48:01

安全運維信息安全網絡安全

2020-05-22 08:13:45

敏捷開發OKR

2022-12-12 08:46:11

2022-08-26 01:10:32

TCPSYNLinux

2022-03-16 18:27:39

開發低代碼軟件開發

2021-05-26 05:22:48

SQL 數據庫SELECT

2023-06-16 14:10:00

TCPUDP網絡通信

2025-10-29 16:29:27

OpenAIGPT-2模型

2019-08-12 11:14:00

JVM垃圾對象

2019-07-29 10:10:06

Java內存線程安全

2021-03-12 09:24:58

Redis面試場景

2022-05-30 18:37:03

數據個人信息人工智能

2019-08-01 10:20:10

2019-10-09 10:00:02

集群故障場景

2019-10-09 09:39:15

PythonHDFS大數據

2021-06-02 09:47:48

RSA2021

2014-11-26 14:46:47

代碼

2023-02-13 13:37:20

ChatGPTAI微軟

2021-02-03 10:17:03

5G5G專網通信市場
點贊
收藏

51CTO技術棧公眾號

国产精品吊钟奶在线| 67194成人在线观看| 久久久久久九九九九| 欧美亚洲天堂网| 四虎地址8848精品| 亚洲蜜臀av乱码久久精品| av资源站久久亚洲| 超碰人人干人人| 久久九九精品视频| 亚洲va中文字幕| 国产精品国产三级欧美二区| 国产精品美女久久久久av爽| 小嫩嫩12欧美| 欧美日韩一区国产| 黄色一级片网址| 免费看黄色一级视频| 久久精品动漫| 欧美成人激情在线| 中文字幕一区二区三区人妻| 欧美电影在线观看网站| 国产精品高清亚洲| 国外成人在线视频网站| 中文字幕 国产精品| 欧美日韩专区| 伊人久久五月天| xxxx视频在线观看| yy6080久久伦理一区二区| 国产精品欧美综合在线| 狠狠色综合一区二区| 做爰视频毛片视频| 黄色成人av网站| 亚洲人成在线观| 香蕉视频1024| 国模私拍国内精品国内av| 一区二区三区欧美久久| 欧美午夜精品理论片a级大开眼界| 国产一区二区三区成人| 亚洲男女自偷自拍| 中文字幕亚洲第一| 9.1成人看片| ccyy激情综合| 欧美精品色一区二区三区| 无码人妻精品一区二区三区在线| 国产精品ⅴa有声小说| 成人ar影院免费观看视频| 91精品在线看| 波多野结衣视频在线观看| 亚洲区国产区| 久久手机免费视频| 91视频免费看片| 一区二区小说| 亚洲国产成人一区| 亚洲精品久久久久久| 成人影院网站| 性做久久久久久久久| 日本福利视频网站| 69xxxx欧美| 久久九九全国免费| 久久精品第九区免费观看| 亚洲精品国产av| 国产精品一区三区| 国产欧美精品一区二区三区介绍| 日本视频免费观看| 亚洲欧美日韩综合国产aⅴ| 国模精品一区二区三区色天香| 18岁成人毛片| 你懂的一区二区三区| 亚洲精品国产欧美| av亚洲天堂网| 国产精品久久久久久妇女| 日本道色综合久久| 玩弄japan白嫩少妇hd| 欧美羞羞视频| 午夜电影一区二区三区| 91视频 -- 69xx| 午夜小视频在线观看| 亚洲午夜影视影院在线观看| 免费视频爱爱太爽了| 岛国av在线播放| 高跟丝袜一区二区三区| 人妻少妇精品久久| 久草在线中文最新视频| 欧美视频在线观看 亚洲欧| 91九色在线观看视频| 大胆人体一区| 欧美日韩亚洲综合在线| 欧美丝袜在线观看| 国产精品一区免费在线| 91精品国产aⅴ一区二区| 国产亚洲视频一区| 国产日韩在线观看视频| 欧美tickling挠脚心丨vk| 国产大尺度视频| 日韩精品欧美大片| 亚洲欧美中文日韩v在线观看| 先锋影音av在线| 久久精品国产www456c0m| 久久成年人免费电影| 国产在线视频二区| 国产精品久久国产愉拍| 国产精品国产三级国产专播精品人| 黄色av一区二区| 国产一区二区日韩精品| 国产精品欧美久久| 熟妇人妻系列aⅴ无码专区友真希| 91免费视频大全| 国产综合欧美在线看| 国产在线你懂得| 亚洲日本欧美天堂| 国产极品尤物在线| 国产精品传媒麻豆hd| 日韩精品一区二区三区视频播放| 亚洲第一页av| 91精品天堂福利在线观看| 欧美理论电影在线播放| 国产91国语对白在线| 久久国产免费看| 成人免费91在线看| 噜噜噜噜噜在线视频| 亚洲天堂免费看| 无码人妻丰满熟妇区96| 99亚洲男女激情在线观看| 亚洲国产精品va在线看黑人| 污污视频网站在线免费观看| 亚洲高清在线| 成人免费在线网址| 神马久久高清| 一区二区免费在线| 欧美男女交配视频| 美国一区二区| 欧美另类交人妖| 性高潮视频在线观看| 成人国产亚洲欧美成人综合网| 欧美不卡1区2区3区| 中文国产字幕在线观看| 欧美亚洲自拍偷拍| yy6080午夜| 欧美激情综合色综合啪啪| 国产精品99久久久久久久久 | 五月天激情播播| 天天久久夜夜| 久久久国产91| 中文字幕 自拍偷拍| 久久综合九色综合97_久久久| 看一级黄色录像| 日韩五码电影| 在线看日韩av| 波多野结衣在线电影| 久久亚洲一区二区三区明星换脸 | 女人色偷偷aa久久天堂| 国产精品美女www爽爽爽视频| 日韩一级片免费看| 洋洋av久久久久久久一区| 不用播放器的免费av| 日韩av自拍| 国产精品88a∨| 蝌蚪视频在线播放| 色悠久久久久综合欧美99| 日韩精品人妻中文字幕有码| 亚洲性人人天天夜夜摸| 俄罗斯精品一区二区| 黄色网页在线观看| 678五月天丁香亚洲综合网| 国产精品无码一区二区三区| 欧美一级网站| 久久亚洲高清| 五月天国产在线| 国产视频精品一区二区三区| 欧美啪啪小视频| 久久蜜桃一区二区| 一本色道无码道dvd在线观看| 一本色道久久综合亚洲精品酒店 | 成人在线高清视频| 一本大道久久a久久精品综合| 性色av蜜臀av色欲av| 亚洲欧美日韩视频二区| 日韩精品国内| 榴莲视频成人app| 91高潮在线观看| 在线播放毛片| 精品国产伦一区二区三区观看体验| 亚洲精品男人的天堂| 国产精品久久免费看| 麻豆av免费看| 日韩成人午夜电影| 奇米777四色影视在线看| 日韩av三区| 91精品视频播放| 中文在线а√在线8| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 中文字幕在线观看免费视频| 中文字幕免费不卡| 9.1在线观看免费| 蜜臀久久久久久久| 免费拍拍拍网站| 久久一区二区中文字幕| 国产三区二区一区久久| 欧美日韩卡一| 欧美一乱一性一交一视频| 麻豆影视在线观看_| 日韩精品在线电影| 国产肥老妇视频| 91福利国产成人精品照片| 欧美成人一二三区| 国产片一区二区| wwwxx日本| 精品制服美女久久| 黑森林福利视频导航| 欧美日韩精品| 欧美三级午夜理伦三级老人| 久久99国产成人小视频| 国产欧美一区二区在线播放| 91成人在线网站| 国产98色在线| 国产伦久视频在线观看| 欧美多人乱p欧美4p久久| √新版天堂资源在线资源| 亚洲男人天天操| 国产小视频一区| 欧美一区日韩一区| 中文字幕在线观看视频一区| 欧美性猛交xxxx免费看久久久| 国产高潮国产高潮久久久91| 国产精品久久久久aaaa| 亚洲一区二区三区日韩| 26uuu久久天堂性欧美| 91九色蝌蚪porny| 国产精品性做久久久久久| 国产成年人视频网站| 美女在线视频一区| 成人黄色一区二区| 视频一区二区中文字幕| 国产精品亚洲a| 欧美综合二区| 免费无码av片在线观看| 亚洲欧美网站| 久久久久久香蕉| 久久精品三级| 999精品网站| 日韩av网站免费在线| 精品国产成人av在线免| 亚洲欧美网站| 亚洲精品一二三四五区| 水蜜桃久久夜色精品一区的特点| 久久无码高潮喷水| 免费久久99精品国产自在现线| 日本福利视频在线| 久久福利毛片| 亚洲精品一二三四五区| 麻豆精品一区二区av白丝在线| www.这里只有精品| 韩国一区二区三区| 99国产精品免费视频| 粉嫩嫩av羞羞动漫久久久| 高清中文字幕mv的电影| 久久综合网色—综合色88| 熟女少妇内射日韩亚洲| 中文字幕不卡在线观看| 一级片一级片一级片| 亚洲精品写真福利| 久草国产在线视频| 亚洲国产裸拍裸体视频在线观看乱了| 91香蕉在线视频| 日韩欧美在线字幕| 亚洲中文字幕在线一区| 欧美一区二区三区精品| 亚洲av永久无码国产精品久久| 亚洲精品www久久久| 久久久久久久影视| 日韩一区视频在线| 蜜桃传媒在线观看免费进入 | 欧美大片网站| 91精品国产一区二区三区动漫| 激情av综合| 欧美一区二区视频17c| 欧美大人香蕉在线| 国产制服91一区二区三区制服| 宅男噜噜噜66国产日韩在线观看| 中文字幕国产传媒| 国产精品538一区二区在线| 538国产视频| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 97视频一区| 另类欧美小说| 国产精品成久久久久| 免费在线看黄色片| 久久蜜桃精品| 国产精品熟女一区二区不卡| 91免费国产在线观看| 精品无码一区二区三区蜜臀 | 亚洲 欧美 日韩 国产综合 在线| 日韩精品一二三四| 亚洲精品久久一区二区三区777 | 精品美女被调教视频大全网站| 国产三级在线免费| 久久久久久久国产| 亚洲mmav| 国产伦精品一区二区三区照片| 欧美日韩在线观看视频小说| 日韩欧美不卡在线| 国产真实乱对白精彩久久| 国产熟女一区二区| 亚洲午夜免费电影| 国产剧情精品在线| 亚洲人成电影网| 国产三级电影在线播放| 91视频最新| 国产精品7m凸凹视频分类| 97成人在线观看视频| 国产成人av电影免费在线观看| 欧美aaa级片| 一本到一区二区三区| 日韩中文字幕综合| 欧美日韩爱爱视频| 婷婷久久免费视频| 日日骚一区二区网站| 9色国产精品| 无码av免费精品一区二区三区| 亚洲视频你懂的| 97精品人妻一区二区三区香蕉| 国产亚洲xxx| 台湾佬成人网| 麻豆精品传媒视频| 一区二区激情| 艳妇乳肉豪妇荡乳xxx| 一区二区三区加勒比av| 国产区精品在线| 久久韩国免费视频| 日本免费成人| 亚洲一区二区三区涩| 日产国产高清一区二区三区| 巨胸大乳www视频免费观看| 五月婷婷久久综合| 韩国av电影在线观看| 欧美黑人性视频| 136导航精品福利| www.亚洲成人网| 国产成人免费在线视频| 麻豆91精品91久久久| 日韩精品一区二区三区四区| 青青草原国产在线| 国产精品视频在线免费观看 | 孩娇小videos精品| 欧美激情一二三区| 最新在线中文字幕| 日韩最新在线视频| 91成人在线网站| 欧美黄色免费网址| 国产成人精品免费一区二区| 国产一级性生活| 亚洲韩国欧洲国产日产av | 国产日本欧美在线观看 | 日韩在线观看你懂的| 亚洲免费看片| 免费看日b视频| aaa亚洲精品| 在线观看亚洲黄色| www.欧美精品| 亚洲国产高清在线观看| 成年人午夜免费视频| 久久久不卡网国产精品二区| 中文字幕精品一区二区精| 久久精品成人一区二区三区 | 日韩欧美国产三级电影视频| 成人三级小说| 免费h精品视频在线播放| 日韩国产精品久久| 婷婷社区五月天| 亚洲福利在线视频| 日韩天堂在线| 亚洲五码在线观看视频| 99久久99久久精品国产片果冻| 看片网址国产福利av中文字幕| 中文字幕少妇一区二区三区| 日韩精品一区二区三区中文在线 | 激情成人午夜视频| 久久久一二三区| 伊人伊人伊人久久| 日韩精品免费视频一区二区三区 | 亚洲欧美日韩一区二区在线| 四虎影视精品永久在线观看| 日韩av在线播放不卡| 中文字幕不卡在线观看| 亚洲高清视频网站| 国产成人精品视频在线| 欧美日本亚洲韩国国产| 在线国产视频一区| 日韩欧美中文字幕公布| 奇米777日韩| 青青在线视频免费观看| 久久九九全国免费| 懂色av成人一区二区三区| 日本精品视频在线播放| 欧美 日韩 国产一区二区在线视频| 精品无码在线视频| 91精品国产入口在线| 91看片一区| 日韩亚洲欧美视频| 国产精品久久毛片av大全日韩| 四虎电影院在线观看|