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

一文吃透生產者和消費者模型!

開發 前端
簡單的說,生產者和消費者之間不直接進行交互,而是通過一個緩沖區來進行交互,生產者負責生成數據,然后存入緩沖區;消費者則負責處理數據,從緩沖區獲取。

01、背景介紹

在 Java 多線程編程中,還有一個非常重要的設計模式,它就是:生產者和消費者模型。

這種模型可以充分發揮 cpu 的多線程特性,通過一些平衡手段能有效的提升系統整體處理數據的速度,減輕系統負載,提高程序的效率和穩定性,同時實現模塊之間的解耦。

那什么是生產者和消費者模型呢?

簡單的說,生產者和消費者之間不直接進行交互,而是通過一個緩沖區來進行交互,生產者負責生成數據,然后存入緩沖區;消費者則負責處理數據,從緩沖區獲取。

大致流程圖如下:

圖片圖片

對于最簡單的生產者和消費者模型,總結下來,大概有以下幾個特點:

  • 緩沖區為空的時候,消費者不能消費,會進入休眠狀態,直到有新數據進入緩沖區,再次被喚醒
  • 緩沖區填滿的時候,生產者不能生產,也會進入休眠狀態,直到緩沖區有空間,再次被喚醒

生產者和消費者模型作為一個非常重要的設計模型,它的優點在于:

  • 解耦:生產者和消費者之間不直接進行交互,即使生產者和消費者的代碼發生變化,也不會對對方產生影響
  • 消峰:例如在某項工作中,假如 A 操作生產數據的速度很快,B 操作處理速度很慢,那么 A 操作就必須等待 B 操作完成才能結束,反之亦然。如果將 A 操作和B 操作進行解耦,中間插入一個緩沖區,這樣 A 操作將生產的數據存入緩沖區,就接受了;B 操作從緩沖區獲取數據并進行處理,平衡好 A 操作和 B 操作之間的緩沖區,可以顯著提升系統的數據處理能力

生產者和消費者模型的應用場景非常多,例如 Java 的線程池任務執行框架、消息中間件 rabbitMQ 等,因此掌握生產者和消費者模型,對于開發者至關重要。

下面我們通過幾個案例,一起來了解一下生產者和消費者設計模型的實踐思路。

02、代碼實踐

2.1、利用 wait / notify 方法實現思路

生產者和消費者模型,最簡單的一種技術實踐方案就是基于線程的 wait() / notify() 方法,也就是通知和喚醒機制,可以將兩個操作實現解耦,具體代碼實踐如下。

/**
 * 緩沖區容器類
 */
public class Container {

    /**
     * 緩沖區最大容量
     */
    private int capacity = 3;

    /**
     * 緩沖區
     */
    private LinkedList<Integer> list = new LinkedList<Integer>();


    /**
     * 添加數據到緩沖區
     * @param value
     */
    public synchronized void add(Integer value) {
        if(list.size() >= capacity){
            System.out.println("生產者:"+ Thread.currentThread().getName()+",緩沖區已滿,生產者進入waiting...");
            try {
                // 進入等待狀態
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("生產者:"+ Thread.currentThread().getName()+",add:" + value);
        list.add(value);

        //喚醒其他所有處于wait()的線程,包括消費者和生產者
        notifyAll();
    }


    /**
     * 從緩沖區獲取數據
     */
    public synchronized void get() {
        if(list.size() == 0){
            System.out.println("消費者:"+ Thread.currentThread().getName()+",緩沖區為空,消費者進入waiting...");
            try {
                // 進入等待狀態
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 從頭部獲取數據,并移除元素
        Integer val = list.removeFirst();
        System.out.println("消費者:"+ Thread.currentThread().getName()+",value:" + val);

        //喚醒其他所有處于wait()的線程,包括消費者和生產者
        notifyAll();
    }
}
/**
 * 生產者類
 */
public class Producer extends Thread{

    private Container container;

    public Producer(Container container) {
        this.container = container;
    }

    @Override
    public void run() {
        for (int i = 0; i < 6; i++) {
            container.add(i);
        }
    }
}
/**
 * 消費者類
 */
public class Consumer extends Thread{

    private Container container;

    public Consumer(Container container) {
        this.container = container;
    }

    @Override
    public void run() {
        for (int i = 0; i < 6; i++) {
            container.get();
        }
    }
}
/**
 * 測試類
 */
public class MyThreadTest {

    public static void main(String[] args) {
        Container container = new Container();
        Producer producer = new Producer(container);
        Consumer consumer = new Consumer(container);

        producer.start();
        consumer.start();
    }
}

運行結果如下:

生產者:Thread-0,add:0
生產者:Thread-0,add:1
生產者:Thread-0,add:2
生產者:Thread-0,緩沖區已滿,生產者進入waiting...
消費者:Thread-1,value:0
消費者:Thread-1,value:1
消費者:Thread-1,value:2
消費者:Thread-1,緩沖區為空,消費者進入waiting...
生產者:Thread-0,add:3
生產者:Thread-0,add:4
生產者:Thread-0,add:5
消費者:Thread-1,value:3
消費者:Thread-1,value:4
消費者:Thread-1,value:5

從日志上可以很清晰的看到,生產者線程生產一批數據之后,當緩沖區已經滿了,會進入等待狀態,此時會通知消費者線程;消費者線程處理完數據之后,當緩沖區沒有數據時,也會進入等待狀態,再次通知生產者線程。

2.2、利用 await / signal 方法實現思路

除此之外,我們還可以利用ReentrantLock和Condition類中的 await() / signal() 方法實現生產者和消費者模型。

緩沖區容器類,具體代碼實踐如下。

/**
 * 緩沖區容器類
 */
public class Container {

    private Lock lock = new ReentrantLock();

    private Condition condition = lock.newCondition();

    private int capacity = 3;

    private LinkedList<Integer> list = new LinkedList<Integer>();


    /**
     * 添加數據到緩沖區
     * @param value
     */
    public void add(Integer value) {
        boolean flag = false;
        try {
            flag = lock.tryLock(3, TimeUnit.SECONDS);
            if(list.size() >= capacity){
                System.out.println("生產者:"+ Thread.currentThread().getName()+",緩沖區已滿,生產者進入waiting...");
                // 進入等待狀態
                condition.await();
            }
            System.out.println("生產者:"+ Thread.currentThread().getName()+",add:" + value);
            list.add(value);

            //喚醒其他所有處于wait()的線程,包括消費者和生產者
            condition.signalAll();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(flag){
                lock.unlock();
            }
        }
    }


    /**
     * 從緩沖區獲取數據
     */
    public void get() {
        boolean flag = false;
        try {
            flag = lock.tryLock(3, TimeUnit.SECONDS);
            if(list.size() == 0){
                System.out.println("消費者:"+ Thread.currentThread().getName()+",緩沖區為空,消費者進入waiting...");
                // 進入等待狀態
                condition.await();
            }
            // 從頭部獲取數據,并移除元素
            Integer val = list.removeFirst();
            System.out.println("消費者:"+ Thread.currentThread().getName()+",value:" + val);

            //喚醒其他所有處于wait()的線程,包括消費者和生產者
            condition.signalAll();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(flag){
                lock.unlock();
            }
        }
    }
}

生產者、消費者、測試類代碼,跟上文一致,運行結果和上文介紹的也是一樣。

2.3、多生產者和消費者的實現思路

上面介紹的都是一個生產者線程和一個消費者線程,模型比較簡單。實際上,在業務開發中,經常會出現多個生產者線程和多個消費者線程,按照以上的實現思路,會出現什么情況呢?

有可能會出現程序假死現象!下面我們來分析一下案例,假如有兩個生產者線程 a1、a2,兩個消費者線程 b1、b2,執行過程如下:

  • 1.生產者線程 a1 執行生產數據的操作,發現緩沖區數據已經填滿了,然后進入等待階段,同時向外發起通知,喚醒其它線程
  • 2.因為線程喚醒具有隨機性,本應該喚醒消費者線程 b1,結果可能生產者線程 a2 被喚醒,檢查緩沖區數據已經填滿了,又進入等待階段,緊接向外發起通知,消費者線程得不到被執行的機會
  • 3.消費者線程 b1、b2,也有可能會出現這個現象,本應該喚醒生產者線程,結果喚醒了消費者線程

遇到這種情況,應該如何解決呢?

因為ReentrantLock和Condition的結合,編程具有高度靈活性,我們可以采用這種組合解決多生產者和多消費者中的假死問題。

具體實現邏輯如下:

/**
 * 緩沖區容器類
 */
public class ContainerDemo {

    private Lock lock = new ReentrantLock();
    private Condition producerCondition = lock.newCondition();
    private Condition consumerCondition = lock.newCondition();

    private int capacity = 3;
    private LinkedList<Integer> list = new LinkedList<Integer>();


    /**
     * 添加數據到緩沖區
     * @param value
     */
    public void add(Integer value) {
        boolean flag = false;
        try {
            flag = lock.tryLock(3, TimeUnit.SECONDS);
            if(list.size() >= capacity){
                System.out.println("生產者:"+ Thread.currentThread().getName()+",緩沖區已滿,生產者進入waiting...");
                // 生產者進入等待狀態
                producerCondition.await();
            }
            System.out.println("生產者:"+ Thread.currentThread().getName()+",add:" + value);
            list.add(value);

            // 喚醒所有消費者處于wait()的線程
            consumerCondition.signalAll();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(flag){
                lock.unlock();
            }
        }
    }


    /**
     * 從緩沖區獲取數據
     */
    public void get() {
        boolean flag = false;
        try {
            flag = lock.tryLock(3, TimeUnit.SECONDS);
            if(list.size() == 0){
                System.out.println("消費者:"+ Thread.currentThread().getName()+",緩沖區為空,消費者進入waiting...");
                // 消費者進入等待狀態
                consumerCondition.await();
            }
            // 從頭部獲取數據,并移除元素
            Integer val = list.removeFirst();
            System.out.println("消費者:"+ Thread.currentThread().getName()+",value:" + val);

            // 喚醒所有生產者處于wait()的線程
            producerCondition.signalAll();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(flag){
                lock.unlock();
            }
        }
    }
}
/**
 * 生產者
 */
public class Producer extends Thread{

    private ContainerDemo container;

    private Integer value;

    public Producer(ContainerDemo container, Integer value) {
        this.container = container;
        this.value = value;
    }

    @Override
    public void run() {
        container.add(value);
    }
}
/**
 * 消費者
 */
public class Consumer extends Thread{

    private ContainerDemo container;

    public Consumer(ContainerDemo container) {
        this.container = container;
    }

    @Override
    public void run() {
        container.get();
    }
}
/**
 * 測試類
 */
public class MyThreadTest {

    public static void main(String[] args) {
        ContainerDemo container = new ContainerDemo();

        List<Thread> threadList = new ArrayList<>();
        // 初始化6個生產者線程
        for (int i = 0; i < 6; i++) {
            threadList.add(new Producer(container, i));
        }
        // 初始化6個消費者線程
        for (int i = 0; i < 6; i++) {
            threadList.add(new Consumer(container));
        }

        // 啟動線程
        for (Thread thread : threadList) {
            thread.start();
        }
    }
}

運行結果如下:

生產者:Thread-0,add:0
生產者:Thread-1,add:1
生產者:Thread-2,add:2
生產者:Thread-3,緩沖區已滿,生產者進入waiting...
生產者:Thread-4,緩沖區已滿,生產者進入waiting...
生產者:Thread-5,緩沖區已滿,生產者進入waiting...
消費者:Thread-6,value:0
消費者:Thread-7,value:1
生產者:Thread-3,add:3
生產者:Thread-4,add:4
生產者:Thread-5,add:5
消費者:Thread-8,value:2
消費者:Thread-9,value:3
消費者:Thread-10,value:4
消費者:Thread-11,value:5

通過ReentrantLock定義兩個Condition,一個表示生產者的Condition,一個表示消費者的Condition,喚醒的時候調用對應的signalAll()方法就可以解決假死現象。

03、小結

最后我們來總結一下,對于生產者和消費者模型,通過合理的編程實現,可以充分充分發揮 cpu 多線程的特性,顯著的提升系統處理數據的效率。

對于生產者和消費者模型中的假死現象,可以使用ReentrantLock定義兩個Condition,進行交叉喚醒,以解決假死問題。

責任編輯:武曉燕 來源: 潘志的研發筆記
相關推薦

2021-04-20 08:32:51

消息MQ隊列

2009-08-13 13:14:31

C#生產者和消費者

2021-12-22 11:00:05

模型Golang語言

2015-08-26 09:39:30

java消費者

2024-03-14 11:58:43

2012-02-14 12:31:27

Java

2017-05-16 12:30:21

Python多線程生產者消費者模式

2021-08-31 10:26:24

存儲

2021-09-09 06:55:43

kafka冪等生產者

2020-09-14 08:45:58

多線程模型面試

2024-08-27 10:19:31

2021-12-28 12:01:59

Kafka 消費者機制

2023-06-01 08:08:38

kafka消費者分區策略

2015-06-15 11:29:34

數據中心綠色數據中心

2022-07-07 09:00:49

RocketMQ消費者消息消費

2011-08-05 16:21:24

2011-07-22 16:25:38

CA TechnoloIT消費化

2011-11-15 10:05:29

Kindle Fire平板市場

2024-07-15 08:20:24

2009-04-15 11:17:23

點贊
收藏

51CTO技術棧公眾號

污污视频在线观看网站| 国产一级在线视频| 日韩五码电影| 亚洲色图视频网| 国严精品久久久久久亚洲影视| 国产乡下妇女做爰毛片| 精品99在线| 日韩亚洲欧美成人一区| 欧美一级在线看| 日本电影在线观看网站| 国产盗摄女厕一区二区三区| 久久久久免费视频| 成年人在线免费看片| 亚洲综合网站| 欧美三级乱人伦电影| www.国产在线视频| 日本在线观看免费| 91视频com| 91久久极品少妇xxxxⅹ软件 | 国产在线视频欧美| 欧美另类一区二区| 欧美成人综合| 日韩最新在线视频| 伊人久久一区二区三区| 国产精品日本一区二区不卡视频| 欧美性生交大片免网| 国产 国语对白 露脸| jizz亚洲| 久久久精品免费观看| 国产精品久久7| 国产毛片毛片毛片毛片毛片| 石原莉奈在线亚洲三区| 97人洗澡人人免费公开视频碰碰碰| 亚洲 欧美 国产 另类| 在线视频亚洲专区| 亚洲国产免费av| 波多野结衣三级视频| 日韩在线激情| 欧美揉bbbbb揉bbbbb| av天堂永久资源网| 丁香影院在线| 亚洲人吸女人奶水| 正在播放一区二区三区| 91se在线| 中文字幕在线观看一区二区| 日本视频一区二区在线观看| 天堂在线免费av| 91丨九色porny丨蝌蚪| 国产精品一区二区三区免费| 亚洲欧美另类日韩| 成人一区二区三区在线观看 | 亚欧激情乱码久久久久久久久| 久久毛片亚洲| 日本道免费精品一区二区三区| 日日橹狠狠爱欧美超碰| 欧美办公室脚交xxxx| 五月天丁香久久| 久久综合九色综合88i| 看黄在线观看| 色播五月激情综合网| 99视频在线免费| 精品久久久网| 欧美一级一级性生活免费录像| 色哟哟在线观看视频| 亚洲va欧美va人人爽成人影院| 91精品国产高清一区二区三区蜜臀| 中文字幕国产高清| 日韩中文字幕无砖| 精品99999| 久久国产精品无码一级毛片| 美国十次av导航亚洲入口| 日韩av中文字幕在线免费观看| 中文字幕日韩三级片| 国产成人手机高清在线观看网站| 一本一本久久a久久精品综合小说| 蜜桃传媒一区二区亚洲| 婷婷亚洲五月色综合| 欧美成人sm免费视频| 国产一二三四在线| 模特精品在线| 国产这里只有精品| 人妻精品一区二区三区| 久久综合九色综合久久久精品综合| 日韩视频在线播放| 久久99精品久久| 午夜精品123| 日韩精品你懂的| 欧美三级一区| 亚洲人成网站在线播| 国产中文av在线| 亚洲日本久久| 国产日韩在线视频| 天天干天天舔天天射| 中文字幕第一区二区| 成人免费网站入口| 天堂av中文在线观看| 在线播放欧美女士性生活| 日韩无码精品一区二区| 日韩在线高清| 538国产精品一区二区在线 | 国产精品theporn动漫| 天堂成人国产精品一区| 97伦理在线四区| 国产成人天天5g影院在线观看| 亚洲乱码国产乱码精品精98午夜| 男人操女人逼免费视频| 国产成人免费视频网站视频社区 | 18网站在线观看| 色综合一个色综合| 国产人妻精品午夜福利免费| 成人高清av| 97人人模人人爽人人喊中文字| 91麻豆国产视频| 久久综合久久99| 男人添女荫道口喷水视频| 精品美女一区| 亚洲欧美日韩在线一区| 国产一级片播放| 韩国精品在线观看| 日韩久久不卡| 成人爽a毛片免费啪啪| 日韩欧美一区二区免费| 国产馆在线观看| 久久精品人人做人人爽电影蜜月| 99精品欧美一区二区三区| 在线日本中文字幕| 色噜噜狠狠成人中文综合| 在线观看免费视频国产| 中出一区二区| 成人激情av在线| 在线看的av网站| 欧美中文字幕亚洲一区二区va在线| 久久久久亚洲av成人网人人软件| 久久久久久久久久久久久久| 国产精品精品国产| 国产三级在线| 色www精品视频在线观看| 好吊日免费视频| 国产欧美大片| 久久99精品久久久久子伦 | 久久一区二区中文字幕| 国产精品va在线播放| 你懂的在线播放| 欧美性猛交xxxx| 亚洲av片不卡无码久久| 一本久道久久综合婷婷鲸鱼| 国产精品乱码视频| 免费污视频在线观看| 精品国产污网站| 日本特黄特色aaa大片免费| 懂色av一区二区三区蜜臀| 国产高清不卡无码视频| 97久久综合区小说区图片区 | 五月天婷婷网站| 成人丝袜视频网| 日韩欧美国产综合在线| 日韩黄色网络| 国产成+人+综合+亚洲欧洲| www.在线视频.com| 欧美精三区欧美精三区| 亚洲天堂黄色片| 国产精品99久久久久久有的能看| 久久久无码中文字幕久...| 视频一区日韩精品| 久久久久久久电影一区| 日韩欧美电影在线观看| 91久久精品一区二区二区| 久久久久久久久久久久| 免费国产亚洲视频| 黄色a级在线观看| 成人看片爽爽爽| 日韩美女视频在线观看| av片在线看| 欧美一区二区三区免费在线看 | 黄色网页在线播放| 精品日韩99亚洲| 中文字幕第四页| 国产精品天干天干在线综合| 亚洲第一区第二区第三区| 亚洲无吗在线| 日韩免费中文专区| 九九99久久精品在免费线bt| 午夜精品福利电影| 大片免费播放在线视频| 日韩免费观看高清完整版在线观看| 四虎永久在线精品| 欧美激情在线一区二区三区| 日本亚洲一区二区三区| 性8sex亚洲区入口| 免费观看中文字幕| 日本亚洲不卡| 91精品国产一区二区三区动漫 | 国产这里只有精品| 国产白浆在线免费观看| 中文字幕日韩精品在线观看| 国产高清在线观看视频| 色婷婷精品久久二区二区蜜臂av| 91麻豆免费视频网站| av中文字幕一区| 激情五月婷婷基地| 性色av一区二区怡红| 夜夜爽99久久国产综合精品女不卡| 97久久精品| 国产日韩在线看片| 中文在线资源| 久久天天躁夜夜躁狠狠躁2022| 青青草视频免费在线观看| 欧美一区二区在线免费观看| 久久久久久亚洲av无码专区| 亚洲最色的网站| 任你操精品视频| 久久麻豆一区二区| 成人做爰69片免费| 久久电影网站中文字幕| 国产精品亚洲αv天堂无码| 国内精品久久久久久久97牛牛 | 精品嫩草影院久久| 一级特黄aaa| 在线这里只有精品| 免费在线不卡视频| 亚洲午夜久久久久久久久久久| www成人啪啪18软件| 久久日韩精品一区二区五区| 亚洲少妇中文字幕| 国产精品乡下勾搭老头1| 在线观看国产一级片| 免费观看30秒视频久久| 中文字幕乱码人妻综合二区三区 | 国产99精品一区| 国产午夜精品在线| 中文字幕亚洲在线观看| 亚洲qvod图片区电影| 国语自产精品视频在线看抢先版结局 | 欧美精品在线一区二区| 中文字幕在线观看国产| 91久久精品日日躁夜夜躁欧美| 天天干天天干天天操| 欧美日韩中文字幕日韩欧美| 国产午夜在线播放| 亚洲h在线观看| 日韩成人免费在线视频| 亚洲国产精品影院| 日韩av一二三区| 亚洲成人av一区二区三区| 精品人妻在线播放| 香蕉av福利精品导航| 国产五月天婷婷| 亚洲电影中文字幕在线观看| 国产在线观看成人| 亚洲v中文字幕| 国产成人亚洲精品自产在线 | 青娱乐在线免费视频| 色88888久久久久久影院野外| 亚洲乱码国产乱码精品| 欧美专区日韩专区| 一区二区三区播放| 欧美一区二区三区小说| 性生交生活影碟片| 亚洲国产精彩中文乱码av| 黄色片一区二区| 日韩精品一区二区三区第95| 麻豆导航在线观看| 中文字幕一区二区三区电影| 男人的天堂在线视频免费观看| 日韩综合中文字幕| 欧美人与动牲性行为| 97热精品视频官网| ww久久综合久中文字幕| 亚洲va码欧洲m码| 久久久久观看| 日韩av不卡播放| 五月久久久综合一区二区小说| 热久久最新地址| 国产精品普通话对白| 不卡av免费在线| 极品尤物av久久免费看| 国产伦精品一区二区三区88av| 26uuu精品一区二区在线观看| 99国产精品无码| 一级特黄大欧美久久久| 毛片在线免费视频| 欧美日韩一区精品| 亚洲AV无码精品自拍| 亚洲男人天堂古典| 中中文字幕av在线| 26uuu另类亚洲欧美日本老年| 国产精品亚洲成在人线| 国产精品对白刺激久久久| 要久久爱电视剧全集完整观看| 亚洲一区二区三区四区中文| 在线看片一区| 亚洲综合婷婷久久| 91麻豆精东视频| 亚洲综合网在线| 日韩欧美中文免费| 国产成人av免费看| 亚洲图中文字幕| 欧洲性视频在线播放| 国产精品久久久91| 给我免费播放日韩视频| 一区二区三区四区国产| 国产农村妇女精品一区二区| 思思久久精品视频| 久久久久久久综合色一本| 久久久久久久久毛片| 在线免费亚洲电影| 色呦呦视频在线| 草民午夜欧美限制a级福利片| 偷拍视频一区二区三区| 国产成人精品一区二区三区福利| 精品一区电影| 成人在线免费观看av| 国产成人av网站| 日韩av手机在线免费观看| 在线观看视频一区二区| 无码国产色欲xxxx视频| 欧美猛男性生活免费| 欧美风情在线视频| 日韩精品欧美一区二区三区| 亚洲欧美日韩国产| 亚洲少妇18p| 亚洲综合激情另类小说区| 国产又黄又大又粗的视频| 亚洲网址你懂得| 欧美1级2级| 欧美激情第一页在线观看| 亚洲激情综合| 性活交片大全免费看| 亚洲欧美日韩国产手机在线| 中文字幕 国产| 国产亚洲欧美日韩一区二区| 亚洲天堂av在线| 久久亚洲国产精品日日av夜夜| 激情综合中文娱乐网| 免费啪视频在线观看| 一区二区三区在线观看动漫| 国产精品久久久久久久一区二区 | 菠萝蜜视频在线观看www入口| 91色视频在线观看| 97国产精品| 色91精品久久久久久久久| 亚洲欧洲av另类| 国产手机精品视频| 欧美床上激情在线观看| 日本精品国产| 丰满的少妇愉情hd高清果冻传媒| 丁香啪啪综合成人亚洲小说 | 午夜伦全在线观看| 国产玖玖精品视频| 久久久久免费av| 青青草精品在线| 亚洲一区二区三区四区不卡| 性生活视频软件| 18禁一区二区三区| 亚洲一级大片| 中文字幕在线中文| 国产精品主播直播| 麻豆成人在线视频| 亚洲第一福利在线观看| 999av小视频在线| 美乳视频一区二区| 久久一综合视频| 成人欧美一区二区三区黑人一| 制服丝袜亚洲精品中文字幕| 99在线播放| 国产在线精品一区二区三区| 鲁大师影院一区二区三区| 少妇无套高潮一二三区| 欧美人与z0zoxxxx视频| 在线中文字幕-区二区三区四区| av成人午夜| 亚洲一区国产一区| 免费黄在线观看| 日韩亚洲欧美成人一区| 色在线中文字幕| 亚洲午夜精品福利| 国产高清精品网站| 毛片在线免费视频| 日韩中文字幕在线播放| 福利电影一区| 国产精品久久a| 亚洲一区二区三区精品在线| 青青草av免费在线观看| 国产在线拍偷自揄拍精品| 亚洲国产综合在线看不卡| 人妻少妇无码精品视频区| 欧美一区二区三区在线观看视频| 成人影院在线视频| 亚洲春色在线| aaa亚洲精品| 亚洲在线精品视频| 国内精品视频久久| 久久免费精品视频在这里| 日本一区二区在线免费观看| 欧美午夜精品一区二区蜜桃| 美女网站视频在线| 亚洲精品一区二区三| 东方aⅴ免费观看久久av| 337p粉嫩色噜噜噜大肥臀| 久久91亚洲精品中文字幕|