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

ReentrantLock性能好在哪里?你知道嗎?

開發 前端
我們在講解AQS的時候說過AQS基本負責了實現鎖的全部邏輯,唯獨線程搶鎖和線程釋放鎖的邏輯是交給子類來實現了,而ReentrantLock作為最常用的獨占鎖,其內部就是包含了AQS的子類實現了線程搶鎖和釋放鎖的邏輯。

先了解一下

讀本篇前,一定要確保已經讀過本公眾號的AQS講解。

我們知道實現一把鎖要有如下幾個邏輯

  • 鎖的標識
  • 線程搶鎖的邏輯
  • 線程掛起的邏輯
  • 線程存儲邏輯
  • 線程釋放鎖的邏輯
  • 線程喚醒的邏輯

我們在講解AQS的時候說過AQS基本負責了實現鎖的全部邏輯,唯獨線程搶鎖和線程釋放鎖的邏輯是交給子類來實現了,而ReentrantLock作為最常用的獨占鎖,其內部就是包含了AQS的子類實現了線程搶鎖和釋放鎖的邏輯。

我們在使用ReentrantLock的時候一般只會使用如下方法

ReentrantLock lock=new ReentrantLock();
 lock.lock();
 lock.unlock();
 lock.tryLock();
 Condition condition=lock.newCondition();
 condition.await();
 condition.signal();
 condition.signalAll();

技術架構

如果我們自己來實現一個鎖,那么如何設計呢?

根據AQS的邏輯,我們寫一個子類sync,這個類一定會調用父類的acquire方法進行上鎖,同時重寫tryAcquire方法實現自己搶鎖邏輯,也一定會調用release方法進行解鎖,同時重寫tryRelease方法實現釋放鎖邏輯。

圖片圖片

那么ReentrantLock是怎么實現的呢?

ReentrantLock的實現的類架構如下,ReentrantLock對外提供作為一把鎖應該具備的api,比如lock加鎖,unlock解鎖等等,而它內部真正的實現是通過靜態內部類sync實現,sync是AQS的子類,是真正的鎖,因為這把鎖需要支持公平和非公平的特性,所以sync又有兩個子類FairSync和NonfairSync分別實現公平鎖和非公平鎖。

圖片圖片

因為是否公平說的是搶鎖的時候是否公平,那兩個子類就要在上鎖方法acquire的調用和搶鎖方法tryAcquire的重寫上做文章。

公平鎖做了什么文章?

static final class FairSync extends Sync {
  
        final void lock() {
            acquire(1);
        }

        protected final boolean tryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (!hasQueuedPredecessors() &&
                    compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0)
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }
    }

公平鎖比較簡單,直接調用了父級類AQS的acquire方法,因為AQS的鎖默認就是公平的排隊策略。

重寫tryAcquire方法的邏輯為:

  1. 判斷當前鎖是否被占用,即state是否為0
  2. 如果當前鎖沒有被占用,然后會判斷等待隊列中是否有線程在阻塞等待,如果有,那就終止搶鎖,如果沒有,就通過cas搶鎖,搶到鎖返回true,沒有搶到鎖返回false。
  3. 如果當前鎖已經被占用,然后判斷占用鎖的線程是不是自己,如果是,就會將state加1,表示重入,返回true。如果不是自己那就是代表沒有搶到鎖,返回false。

公平就公平在老老實實排隊。

非公平鎖做了什么文章?

static final class NonfairSync extends Sync {
      
        final void lock() {
            if (compareAndSetState(0, 1))
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);
        }

        protected final boolean tryAcquire(int acquires) {
            return nonfairTryAcquire(acquires);
        }
    }
    
    //nonfairTryAcquire代碼在父類sync里面
     final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }

非公平鎖也很簡單,沒有直接調用了父級類AQS的acquire方法,而是先通過cas搶鎖,它不管等待隊列中有沒有其他線程在排隊,直接搶鎖,這就體現了不公平。

它重寫tryAcquire方法的邏輯為:

  1. 判斷當前鎖是否被占用,即state是否為0
  2. 如果當前鎖沒有被占用,就直接通過cas搶鎖(不管等待隊列中有沒有線程在排隊),搶到鎖返回true,沒有搶到鎖返回false。
  3. 如果當前鎖已經被占用,然后判斷占用鎖的線程是不是自己,如果是,就會將state加1,表示重入,返回true。如果不是自己那就是代表沒有搶到鎖,返回false。

公平鎖和非公平分別重寫了tryAcquire方法,來滿足公平和非公平的特性。那么tryAcquire方法也是需要子類重寫的,因為它和是否公平無關,因此tryAcquire方法被抽象到sync類中重寫。

sync類中
protected final boolean tryRelease(int releases) {
            int c = getState() - releases;
            if (Thread.currentThread() != getExclusiveOwnerThread())
                throw new IllegalMonitorStateException();
            boolean free = false;
            if (c == 0) {
                free = true;
                setExclusiveOwnerThread(null);
            }
            setState(c);
            return free;
        }

釋放鎖的邏輯如下:

  1. 獲取state的值,然后減1
  2. 如果state為0,代表鎖已經釋放,清空aqs中的持有鎖的線程字段的值
  3. 如果state不為0,說明當前線程重入了,還需要再次釋放鎖
  4. 將state寫回

釋放鎖往往和搶鎖邏輯是對應的,每個子類搶鎖邏輯不同的話,釋放鎖的邏輯也會對應不同。

具體實現

接下來我們通過ReentrantLock的使用看下它的源碼實現

class X {
            private final ReentrantLock lock = new ReentrantLock();
            Condition condition1=lock.newCondition();
            Condition condition2=lock.newCondition();
            public void m() {
                lock.lock();
                try {

                    if(條件1){
                        condition1.await();
                    }
                    if(條件2){
                        condition2.await();
                    }
                } catch (InterruptedException e) {

                } finally {
                    condition1.signal();
                    condition2.signal();
                    lock.unlock();
                }
            }
        }

先看這個方法:lock.lock()

ReentrantLock類
public void lock() {
        sync.lock();
    }
NonfairSync 類中
  final void lock() {
    if (compareAndSetState(0, 1))
    setExclusiveOwnerThread(Thread.currentThread());
    else
      acquire(1);
  }
FairSync 類中
  final void lock() {
      acquire(1);
  }

公平鎖和非公平鎖中都實現了lock方法,公平鎖直接調用AQS的acquire,而非公平鎖先搶鎖,搶不到鎖再調用AQS的acquire方法進行上鎖

進入acquire方法后的邏輯我們就都知道了。

再看這個方法lock.unlock()

public void unlock() {
        sync.release(1);
}

unlock方法內直接調用了AQS的Release方法進行解鎖的邏輯,進入release方法后邏輯我們都已經知道了,這里不再往下跟。

最后看這個方法lock.tryLock()

public boolean tryLock(long timeout, TimeUnit unit)
            throws InterruptedException {
        return sync.tryAcquireNanos(1, unit.toNanos(timeout));
    }

tryLock方法直接調用sync的tryAcquireNanos方法,看過AQS的應該知道tryAcquireNanos這個方法是父類AQS的方法,這個方法和AQS中的四個核心方法中的Acquire方法一樣都是上鎖的方法,無非是上鎖的那幾個步驟,調用tryAcquire方法嘗試搶鎖,搶不到鎖就會進入doAcquireNanos方法。

public final boolean tryAcquireNanos(int arg, long nanosTimeout)
            throws InterruptedException {
        if (Thread.interrupted())
            throw new InterruptedException();
        return tryAcquire(arg) ||
            doAcquireNanos(arg, nanosTimeout);
    }

doAcquireNanos這個方法做的其實就是入隊,阻塞等一系列上鎖操作,邏輯和Acquire方法中差不多,但是有兩點不同:

  1. 該方法支持阻塞指定時長。
  2. 該方法支持中斷拋異常。

看下下面的代碼

private boolean doAcquireNanos(int arg, long nanosTimeout)
            throws InterruptedException {
        if (nanosTimeout <= 0L)
            return false;
        final long deadline = System.nanoTime() + nanosTimeout;
        final Node node = addWaiter(Node.EXCLUSIVE);
        boolean failed = true;
        try {
            for (;;) {
                final Node p = node.predecessor();
                if (p == head && tryAcquire(arg)) {
                    setHead(node);
                    p.next = null; // help GC
                    failed = false;
                    return true;
                }
                nanosTimeout = deadline - System.nanoTime();
                if (nanosTimeout <= 0L)
                    return false;
                if (shouldParkAfterFailedAcquire(p, node) &&
                    nanosTimeout > spinForTimeoutThreshold)
                    LockSupport.parkNanos(this, nanosTimeout);
                if (Thread.interrupted())
                    throw new InterruptedException();
            }
        } finally {
            if (failed)
                cancelAcquire(node);
        }
    }

這里的阻塞不再是LockSupport類的park方法,而是parkNanos方法,這個方法支持指定時長的阻塞,AQS正是利用這個方法實現阻塞指定時長,當自動喚醒后,循環中會判斷是否超過設定時長,如果超過直接返回false跳出循環。

在阻塞期間,如果線程被中斷,就會拋出異常,同樣會跳出循環,外面可以通過捕獲這個異常達到中斷阻塞的目的。

可見ReentrantLock其實啥也沒做,其tryLock方法完全是依賴AQS實現。

lock.newCondition();

在AQS那篇我們說過Condition是AQS中的條件隊列,可以按條件將一批線程由不可喚醒變為可喚醒。

ReentrantLock類
 public Condition newCondition() {
        return sync.newCondition();
 }
sync靜態內部類
final ConditionObject newCondition() {
            return new ConditionObject();
}

sync提供了創建Condition對象的方法,意味著ReentrantLock也擁有Condition的能力。

ReentrantLock和synchronized對比

我們下面說的ReentrantLock其實就是說AQS,因為它的同步實現主要在AQS里面。

  1. 實現方面
    ReentrantLock是jdk級別實現的,其源碼在jdk源碼中可以查看,沒有脫離java。
    synchronized是jvm級別實現的,synchronized只是java端的一個關鍵字,具體邏輯實現都在jvm中。
  2. 性能方面
    優化前的synchronized性能很差,主要表現在兩個方面:
    因為大多數情況下對于資源的爭奪并沒有那么激烈,甚至于某個時刻可能只有一個線程在工作,在這種沒有競爭或者競爭壓力很小的情況下,如果每個線程都要進行用戶態到內核態的切換其實是很耗時的。
    jdk1.6對synchronized底層實現做了優化,優化后,在單線程以及并發不是很高的情況下通過無鎖偏向和自旋鎖的方式避免用戶態到內核態的切換,因此性能提高了,優化后的synchronized和ReentrantLock性能差不多了。
    ReentrantLock是在jdk實現的,它申請互斥量就是對鎖標識state的爭奪,它是通過cas方式實現。在java端實現。
    對于爭奪不到資源的線程依然要阻塞掛起,但凡阻塞掛起都要依賴于操作系統底層,這一步的用戶態到內核態的切換是避免不了的。
    因此在單線程進入代碼塊的時候,效率是很高的,因此我們說ReentrantLock性能高于原始的synchronized

申請互斥量
synchronized的鎖其實就是爭奪Monitor鎖的擁有權,這個爭奪過程是通過操作系統底層的互斥原語Mutex實現的,這個過程會有用戶態到內核態的切換。

線程阻塞掛起
沒能搶到到Monitor鎖擁有權的線程要阻塞掛起,阻塞掛起這個動作也是依靠操作系統實現的,這個過程也需要用戶態到內核態的切換。

  1. 特性方面
    兩個都是常用的典型的獨占鎖。
    ReentrantLock可重入,可中斷,支持公平和非公平鎖,可嘗試獲取鎖,可以支持分組將線程由不可喚醒變為可喚醒。
    synchronized可重入,不可中斷,非公平鎖,不可嘗試獲取鎖,只支持一個或者全部線程由不可喚醒到可喚醒。
  2. 使用方面

synchronized不需要手動釋放鎖,ReentrantLock需要手動釋放鎖,需要考慮異常對釋放鎖的影響避免異常導致線程一直持有鎖。

以下是兩個鎖的使用方式

class X {
            private final ReentrantLock lock = new ReentrantLock();
            Condition condition1=lock.newCondition();
            Condition condition2=lock.newCondition();
            public void m() {
                lock.lock();
                try {

                    if(1==2){
                        condition1.await();
                    }
                    if(1==3){
                        condition2.await();
                    }
                } catch (InterruptedException e) {

                } finally {
                    condition1.signal();
                    condition2.signal();
                    lock.unlock();
                }
            }
        }
class X {
            private final testtest sync=new testtest();;
            public void m() throws InterruptedException {
                synchronized(sync){
                    if(1==2){
                        sync.wait();
                    }
                    sync.notify();
                    sync.notifyAll();
                }
            }
        }

對比代碼及特性說明:

  1. 兩個鎖都是依賴一個對象:lock和sync
  2. condition和wait方法具有同樣的效果,進入condition和wait的線程將陷入等待(不可喚醒狀態),只有被分別調用signal和notify方法線程才會重新變為可喚醒狀態,請注意是可喚醒,而不是被喚醒。
  3. 可喚醒是說具備了競爭資源的資格,資源空閑后,synchronized中會在可喚醒狀態的線程中隨機挑選一個線程去拿鎖,而ReentrantLock中不可喚醒的線程變為可喚醒狀態,其實就是將條件隊列中的線程搬到等待隊列中排隊,只有隊頭的才會去嘗試拿鎖。
  4. ReentrantLock分批將線程由不可喚醒變為可喚醒也在這段代碼中體現了,代碼中按照不同的條件將線程放入不同的condition,每個condition就是一個組,釋放的時候也可以按照不同的條件進行釋放。而synchronized中進入wait的線程不能分組,釋放也只能隨機釋放一個或者全部釋放。
責任編輯:武曉燕 來源: 碼農本農
相關推薦

2024-09-03 10:56:49

線程AQS

2025-04-07 00:49:00

WindowsmacOS微軟

2023-04-26 10:21:04

2023-12-20 08:23:53

NIO組件非阻塞

2023-12-12 08:41:01

2024-04-30 09:02:48

2024-04-07 00:00:00

ESlint命令變量

2024-05-28 09:12:10

2022-06-24 08:20:04

CAP網絡通信

2022-03-10 08:25:27

JavaScrip變量作用域

2022-05-27 08:55:15

工具自動化軟件

2021-02-02 08:21:28

網絡面試通信

2017-10-16 13:45:04

2024-01-09 07:29:05

Argo代碼庫應用程序

2024-04-07 00:00:03

2024-07-30 08:22:47

API前端網關

2019-12-12 09:23:29

Hello World操作系統函數庫

2024-11-08 09:48:38

異步編程I/O密集

2024-08-20 08:29:55

2020-10-28 11:20:55

vue項目技
點贊
收藏

51CTO技術棧公眾號

日韩欧美一区在线| 中文字幕制服丝袜一区二区三区 | 国产裸体写真av一区二区| 91久久国产综合| 日本免费精品| 色综合色综合色综合色综合色综合| 欧美亚洲爱爱另类综合| 91丨九色丨蝌蚪丨对白| 国产日韩亚洲| 麻豆成人在线看| 中文字幕狠狠干| 国产精品777777在线播放| 岛国av一区二区| 欧美精品一区二区性色a+v| 风流老熟女一区二区三区| 日本不卡高清视频| 97国产精品人人爽人人做| 一级免费黄色录像| 国产亚洲一区| 亚洲精品久久久久中文字幕二区| 成人亚洲免费视频| 户外露出一区二区三区| 亚洲午夜在线视频| 干日本少妇视频| 阿v免费在线观看| av动漫一区二区| 91福利视频导航| 怡春院在线视频| 噜噜噜久久亚洲精品国产品小说| 国内精品模特av私拍在线观看| 婷婷国产成人精品视频| 欧美精品一区二区久久| 日韩极品精品视频免费观看| 免费观看黄网站| 欧洲精品久久久久毛片完整版| 欧美网站在线观看| 日韩精品在线视频免费观看| mm1313亚洲国产精品美女| 中文字幕免费不卡在线| 蜜桃导航-精品导航| 色欲久久久天天天综合网| 国产精品亚洲专一区二区三区 | 国产熟妇搡bbbb搡bbbb| 亚欧视频在线观看| 青青一区二区三区| 亚洲视频在线免费看| 亚洲av无码一区二区三区观看| 亚洲三区欧美一区国产二区| 99久久精品国产一区二区成人| **国产精品| 在线观看不卡一区| 三级4级全黄60分钟| 亚洲一区电影在线观看| 欧美视频免费| 国产亚洲欧美日韩精品| 国产jk精品白丝av在线观看| 中国av一区| 亚洲人成毛片在线播放| 国精产品一区二区三区| 国产中文精品久高清在线不| 亚洲午夜精品久久久久久久久久久久 | 黄色的网站在线观看| 最新国产精品久久精品| 国产av不卡一区二区| 操你啦在线视频| 悠悠色在线精品| 日本大胆人体视频| 超碰97免费在线| 欧美日韩在线一区| 日本888xxxx| 日韩一区二区三免费高清在线观看| 欧美日韩国产中文| 女人扒开腿免费视频app| 粉嫩一区二区三区四区公司1| 亚洲成人黄色在线| 亚洲av综合一区二区| 日韩电影二区| 九九久久国产精品| 91九色丨porny丨肉丝| 久久一区精品| 成人有码视频在线播放| 国产91免费看| 26uuu久久天堂性欧美| 日本高清一区| 成人免费高清| 福利精品视频在线| 亚洲天堂2018av| 凹凸av导航大全精品| 亚洲视频一区二区三区| 欧美爱爱免费视频| 亚洲在线日韩| 成人激情视频在线观看| 色窝窝无码一区二区三区| 国产视频视频一区| 久久久99精品视频| 电影一区二区三| 7799精品视频| 男女黄床上色视频| 亚洲区综合中文字幕日日| 91高潮精品免费porn| 一本久道久久综合无码中文| 成人高清伦理免费影院在线观看| 日韩av电影免费在线观看| 在线中文字幕-区二区三区四区| 欧美日韩国产色视频| 日韩va在线观看| 亚洲精品aaaaa| 欧美成人全部免费| 探花国产精品一区二区| 成人黄页在线观看| 久久av秘一区二区三区| 黑人巨大精品| 欧美白人最猛性xxxxx69交| 99久久99久久精品免费| 一区二区三区国产盗摄 | 一级黄色片视频| 91女神在线视频| 污污污污污污www网站免费| 成人看片网页| 日韩电影在线观看中文字幕| 中文字幕手机在线观看| 免费成人美女在线观看.| 加勒比在线一区二区三区观看| 麻豆电影在线播放| 欧美性一二三区| 免费看污片网站| 伊人狠狠色j香婷婷综合| 91久久久久久久久久久| jizzjizz在线观看| 91福利视频久久久久| 中国黄色a级片| 伊人狠狠色j香婷婷综合| 91免费观看| 老司机在线永久免费观看| 日本福利一区二区| 日本少妇色视频| 99热这里只有成人精品国产| 成人在线看片| 污片在线免费观看| 欧美一区二区在线播放| 国产麻豆a毛片| 麻豆精品精品国产自在97香蕉| 欧美日韩国产不卡在线看| a毛片不卡免费看片| 精品久久久三级丝袜| 久久综合成人网| 国产福利不卡视频| 欧美亚洲色图视频| 香蕉免费一区二区三区在线观看| 久久国产精品久久国产精品| 国产后入清纯学生妹| 亚洲激情六月丁香| 久久久久99人妻一区二区三区| 女人天堂亚洲aⅴ在线观看| 亚洲精品欧美极品| 日本在线视频中文有码| 亚洲第一精品福利| 日韩久久中文字幕| 国产欧美综合在线| 午夜剧场高清版免费观看| 国产国产精品| 97人人模人人爽人人喊38tv| 欧美xxxx免费虐| 亚洲国产欧美自拍| 亚洲婷婷综合网| 国产日韩影视精品| 91免费视频污| 亚洲国产导航| 快播亚洲色图| 精品乱码一区二区三区四区| 久久精品视频在线观看| 黄色片网站免费在线观看| 精品国产乱码久久久久久虫虫漫画| 无码熟妇人妻av| 久久99精品国产麻豆不卡| 成人黄色片免费| 欧美五码在线| 国产精品久久久久秋霞鲁丝| 在线黄色网页| 亚洲精品97久久| 一区二区视频网站| 一二三区精品视频| 久久精品成人av| 国产综合久久久久久久久久久久| 精品一区二区三区无码视频| 台湾佬综合网| 91在线直播亚洲| 色黄视频在线观看| 久久精品视频在线| 飘雪影视在线观看免费观看 | 超碰在线观看av| 欧美日韩性视频| 亚洲精品动态| 亚洲黄色成人网| 免费av中文字幕| 亚洲啪啪综合av一区二区三区| 国产精品无码自拍| 久色成人在线| 一二三四中文字幕| 国产成人精品一区二区免费看京| 91视频国产一区| 亚洲啊v在线| 欧美成人免费小视频| 国产在线色视频| 丰满少妇高潮一区二区| 欧美精品一二| 成人在线视频电影| 日本欧美韩国| 国内免费精品永久在线视频| www免费网站在线观看| 奇米色777欧美一区二区| 欧美一级爱爱视频| 精品一区二区三| 精品日本一区二区三区在线观看| **日韩最新| 国产精品久久视频| 忘忧草在线影院两性视频| 欧美精品在线观看| 国产视频一区二区三区在线播放 | 国产精品免费精品自在线观看| 国内精品400部情侣激情| 欧美激情午夜| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 国产精品情趣视频| 精品国产av无码| av网站免费线看精品| 国产精品欧美性爱| 激情综合网av| 久久这里只精品| 久久综合婷婷| 欧美黑人经典片免费观看| 91成人免费| 在线观看免费91| av中文一区| 欧美日韩一区在线观看视频| 五月国产精品| 精品国产综合区久久久久久| 国产欧美一区二区三区米奇| 动漫一区二区在线| 日韩高清一区| 亚洲aa在线观看| 久久影院一区二区三区| 亚洲伊人第一页| 欧美视频精品全部免费观看| 91九色在线视频| 动漫一区二区三区| 92福利视频午夜1000合集在线观看| 欧美aaaaaaaa| 成人av电影天堂| 伊人久久精品| 俄罗斯精品一区二区三区| 天堂va欧美ⅴa亚洲va一国产| 97人人模人人爽人人喊38tv| 成人av地址| 久久久久网址| 美日韩中文字幕| 日韩精品一线二线三线| 日韩综合一区| 艳母动漫在线观看| 国产精品第十页| 国产妇女馒头高清泬20p多| 亚洲人成免费| 黄色片视频在线免费观看| 日日摸夜夜添夜夜添国产精品 | 懂色一区二区三区免费观看| 国产在线不卡av| 久久一区二区三区四区| 久久视频精品在线观看| 亚洲日本韩国一区| 精品一区在线视频| 91久久国产综合久久| 一二三四区在线| 精品日韩在线一区| 欧美美乳在线| 日韩中文字幕在线视频播放| 日本一本在线免费福利| 欧美在线免费视频| 国产精品久久久久久福利一牛影视 | 日本sm极度另类视频| 欧美爱爱免费视频| 亚洲日本成人在线观看| 欧美日韩中文视频| 色激情天天射综合网| 国产一区二区麻豆| 欧美精品一区二区不卡 | 久久蜜臀中文字幕| 永久免费看片直接| 五月激情丁香一区二区三区| 国产精品传媒在线观看| 精品国产乱码久久久久久夜甘婷婷 | 成年男女免费视频网站不卡| 国产成人久久久精品一区| 国产高清视频一区二区| 久久久久久九九| 亚洲精品a级片| 久久精品午夜福利| 国产传媒一区在线| 中文字幕在线观看免费高清| 一区二区三区四区蜜桃 | 51精品视频一区二区三区| 天堂在线视频网站| www.美女亚洲精品| 男人天堂视频在线观看| 91视频免费网站| 国产麻豆一区二区三区精品视频| 激情视频小说图片| 日韩精品免费视频人成| 亚洲av无码专区在线播放中文| 国产日韩亚洲欧美综合| 日韩精品在线免费看| 欧美日韩不卡一区二区| 久久久资源网| 久久久久久有精品国产| 国产亚洲精aa在线看| 日韩成人在线资源| 国产情侣一区| 自拍视频第一页| 国产精品国产成人国产三级 | 欧美丰满嫩嫩电影| 福利在线播放| 欧洲成人免费视频| 国产福利资源一区| 黄色一级片国产| 精品一区二区免费看| 伊人影院综合网| 色综合天天综合狠狠| 五月婷婷六月丁香综合| 久久人91精品久久久久久不卡| 粉嫩av国产一区二区三区| 婷婷亚洲婷婷综合色香五月| 亚洲欧美日韩精品一区二区| 四虎精品一区二区| 亚洲午夜久久久久中文字幕久| av片免费播放| 欧美巨猛xxxx猛交黑人97人| 亚洲在线资源| 一道本在线观看视频| 国产在线视视频有精品| 成人免费视频入口| 欧美撒尿777hd撒尿| av网页在线| 国产精品免费看久久久香蕉| 波多野结衣一区| 天天干在线影院| 亚洲国产精华液网站w| 黄色av一区二区| 中日韩美女免费视频网站在线观看 | www.桃色av嫩草.com| 欧美美女18p| 亚洲国产中文在线二区三区免| 99视频精品全部免费看| 国产·精品毛片| 日本熟妇毛茸茸丰满| 亚洲国产女人aaa毛片在线| 欧产日产国产精品视频| 欧美大香线蕉线伊人久久国产精品| 国产精品日韩| 受虐m奴xxx在线观看| 欧美在线视频不卡| 快射av在线播放一区| 91九色在线免费视频| 国内揄拍国内精品久久| 精品国产av色一区二区深夜久久 | 欧美大片在线播放| 久久综合九色综合欧美就去吻| 无码无套少妇毛多18pxxxx| 最近2019年好看中文字幕视频 | 欧美艳星brazzers| 老司机免费在线视频| 91久久精品在线| 在线高清一区| 免费黄色在线视频| 欧美日韩国产综合视频在线观看 | 日本不卡视频在线播放| 日韩精品一区二区三区免费观看| 国产大片一区二区三区| 五月婷婷综合激情| 国产精品视频一区二区久久| 成人午夜小视频| 亚洲高清网站| 欧美另类z0zx974| 日韩午夜精品视频| 亚洲美女尤物影院| 一本一本a久久| 本田岬高潮一区二区三区| 中文字幕在线观看视频免费| 久久影院资源网| 欧美午夜18电影| 色婷婷一区二区三区av免费看| 亚洲国产美女搞黄色| 加勒比一区二区三区在线| 亚洲综合大片69999| 久久亚洲综合| 精国产品一区二区三区a片| 亚洲人成在线观看网站高清| 婷婷激情成人| 丁香啪啪综合成人亚洲| 亚洲制服欧美中文字幕中文字幕| 日本在线丨区| 国产经品一区二区|