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

日韩精品专区在线| 最近日韩中文字幕| 欧美一区视频在线| 337人体粉嫩噜噜噜| 成人黄色视屏网站| 亚洲精品成人在线| 久久久久网址| 一级片免费网站| 欧美天天在线| 亚洲品质视频自拍网| www.这里只有精品| 欧美xxxxhdvideosex| 99精品一区二区三区| 国产精品视频久久久久| 精品视频久久久久| 国产91精品对白在线播放| 欧美精品色一区二区三区| 屁屁影院ccyy国产第一页| 亚洲人妻一区二区| 国产在线不卡一区| 国产成人亚洲综合青青| 久草免费新视频| 成人羞羞网站入口| 日韩电影免费观看在线观看| 五月天开心婷婷| 成人性生活av| 亚洲小说欧美激情另类| 亚洲精品欧洲精品| 日韩国产福利| 国产sm精品调教视频网站| 国产精品www网站| 日韩xxx高潮hd| 午夜免费一区| 国产亚洲人成a一在线v站| 五月天丁香社区| 国产精久久久| 亚洲国产一区视频| 三上悠亚免费在线观看| av在线二区| 久久老女人爱爱| 极品尤物一区二区三区| 国产chinasex对白videos麻豆| 免费成人在线网站| 日本韩国在线不卡| 青青国产在线观看| 亚洲三级观看| 久久久女人电视剧免费播放下载| 亚洲一区电影在线观看| 日本久久精品| 中文字幕精品一区久久久久 | 久久丫精品久久丫| 亚洲xxx拳头交| 精品国偷自产在线视频99| 亚洲第一综合网| 精品国产美女| 国产亚洲xxx| 国产又黄又粗视频| 精品国产网站| 中文字幕精品国产| chinese全程对白| 久久久久久久久久久久久久久久久久 | 欧美黄视频在线观看| 欧美夫妻性生活| 国产精品探花在线播放| 国产免费av国片精品草莓男男| 欧美精品在欧美一区二区少妇| 国产色视频在线播放| 久久麻豆视频| 欧美久久一二区| 国产成人强伦免费视频网站| 日韩在线观看中文字幕| 精品黑人一区二区三区久久| 日韩无码精品一区二区| 神马香蕉久久| 亚洲色图色老头| 欧美另类69xxxx| 天天操综合网| 欧美大胆a视频| 日韩av男人天堂| 国产精品腿扒开做爽爽爽挤奶网站| 欧美在线欧美在线| 国产偷人爽久久久久久老妇app| 蜜桃av噜噜一区| 91福利视频导航| 性xxxxbbbb| 国产色产综合色产在线视频| 亚洲一区二区在线观| 97超碰在线公开在线看免费| 婷婷综合另类小说色区| 国产真人无码作爱视频免费| 久久久久久国产免费a片| 欧美a视频在线| 日韩一二在线观看| 极品人妻一区二区三区| 久久视频在线| 国内精品小视频在线观看| 日韩电影在线观看一区二区| 激情综合五月天| 国产九色精品| 99视频在线观看地址| 亚洲激情五月婷婷| 国产成人精品无码播放| 国产日韩欧美中文在线| 日韩国产精品一区| 91香蕉视频在线播放| 亚洲美女一区| 成人xvideos免费视频| 欧美 日韩 中文字幕| 国产日韩欧美综合一区| 日韩中文在线字幕| 日本久久免费| 欧美一区二区三区在| 亚洲熟妇一区二区三区| 午夜国产欧美理论在线播放| 日本成人激情视频| 亚洲精品97久久中文字幕无码 | 国产精品制服诱惑| 69久久精品| 黑人巨大精品欧美一区二区免费| 亚洲精品性视频| 中文有码一区| 欧美激情小视频| 91在线公开视频| 久久众筹精品私拍模特| 女人色极品影院| 香蕉久久一区| 国产亚洲精品va在线观看| 豆国产97在线 | 亚洲| 久久国产乱子精品免费女| 久久久国产精品一区二区三区| www视频在线免费观看| 欧美影院午夜播放| 天天躁日日躁aaaa视频| 亚洲三级电影在线观看| 国产不卡一区二区在线观看 | 亚洲欧洲性图库| 成人观看免费完整观看| 超碰97久久| 久久国产精品久久久久久| 日韩xxx视频| 久久蜜桃av一区精品变态类天堂| www精品久久| 中文字幕视频精品一区二区三区| 日韩在线观看免费av| 国产天堂第一区| 久久精品一区八戒影视| 男人天堂999| 香蕉视频一区二区三区| 6080yy精品一区二区三区| 你懂的网站在线| 亚洲成人午夜电影| 国产一级黄色录像| 亚洲激情av| 国产一区在线免费观看| 91福利区在线观看| 亚洲国产女人aaa毛片在线| 国产主播在线观看| www.99精品| 日日碰狠狠添天天爽超碰97| 老司机精品在线| 欧美在线观看网址综合| 青青草在线视频免费观看| 色综合激情久久| 一色道久久88加勒比一| 日韩激情视频网站| 亚洲自拍三区| 久久影院一区二区三区| 九九精品视频在线观看| 黑人精品一区二区| 午夜一区二区三区视频| 久久久久久久久免费看无码| 久久精品官网| 亚洲精品国产系列| 久久国产精品美女| 久久久亚洲影院| 黄色av网站在线| 欧美日韩高清影院| 精品99久久久久成人网站免费 | 91成人理论电影| 日韩另类在线| 亚洲乱码国产乱码精品精| 国产一级片av| 亚洲另类在线一区| 国产精品久久AV无码| 日韩 欧美一区二区三区| 国产91av视频在线观看| 一区二区三区国产好| 97视频在线播放| av在线日韩国产精品| 日韩精品一区二区三区视频播放| 日本va欧美va国产激情| 国产精品区一区二区三| 丰满饥渴老女人hd| 午夜综合激情| 一本色道久久88亚洲精品综合| 久久久久久毛片免费看| 国产精品欧美日韩久久| 国产高清在线a视频大全| 亚洲视频综合网| 性生活免费网站| 在线观看中文字幕不卡| 黄色一级片在线| 中日韩av电影| 波多野结衣影院| 国内精品在线播放| 日韩中文字幕三区| 欧美韩日精品| 亚洲国产欧美不卡在线观看| 成人福利一区| 国产综合色香蕉精品| 日韩伦理在线一区| 欧美精品免费播放| 色网站在线看| 亚洲欧美成人在线| 亚洲乱码在线观看| 一本到不卡免费一区二区| 久久视频一区二区三区| 国产成人精品影院| 亚洲欧美偷拍另类| 久久久夜夜夜| 成人午夜视频在线观看免费| 99久久精品国产亚洲精品 | 国产探花一区二区三区| 一区二区三区高清视频在线观看| 四虎一区二区| 校花撩起jk露出白色内裤国产精品| 亚洲综合精品伊人久久| 国产成人午夜性a一级毛片| 欧美在线影院一区二区| 欧美色图亚洲激情| 成人教育av在线| 久久久久久久免费视频| 精品中文视频| 国产日韩在线视频| 91精品xxx在线观看| 亚洲91精品在线| 日本天码aⅴ片在线电影网站| 久久亚洲电影天堂| 理论片午午伦夜理片在线播放| 欧美精品一区二区三区久久久| 国产av一区二区三区| 777奇米成人网| 国产精品视频a| 欧美视频中文一区二区三区在线观看| 欧美激情 一区| 日本一区二区免费在线观看视频 | 欧美韩国日本在线| 在线亚洲激情| 国产中文字幕免费观看| 一区二区三区四区五区在线 | 国产传媒在线观看| 97精品免费视频| 678在线观看视频| 性色av一区二区三区免费| 8x8ⅹ拨牐拨牐拨牐在线观看| 国内精品久久久久影院优| 成人影院在线播放| 久久久亚洲精品视频| 色是在线视频| 欧洲成人在线视频| 日韩精品99| 国产精品女人久久久久久| 免费一区二区三区四区| 国产综合久久久久久| 日本精品国产| 国产伦精品一区二区三| 欧美亚洲国产日韩| 日本一区免费| 日韩一区二区在线| 今天免费高清在线观看国语| 国产在线欧美| 乱妇乱女熟妇熟女网站| 日韩福利视频导航| 做a视频在线观看| 国产成人av一区| 给我看免费高清在线观看| 高清欧美精品xxxxx| www.一区| 成人精品久久一区二区三区| 成人在线视频国产| 国产精品一区视频网站| 婷婷综合电影| 亚洲午夜精品久久久久久浪潮| 亚洲一区二区| 免费无码国产v片在线观看| 日韩不卡一二三区| 丰满少妇中文字幕| 99久久精品国产精品久久| 国产午夜精品福利视频| 亚洲精品久久7777| 久久夜色精品国产噜噜亚洲av| 欧美日韩国产精品成人| 日本wwwxxxx| 日日骚av一区| 国精一区二区三区| 国产精品免费看久久久香蕉 | 欧美三级中文字幕在线观看| 精品女同一区二区三区| 亚洲欧美日本另类| 精品国产99久久久久久| 2019中文字幕在线| 精品国产乱码久久久久久樱花| 久久国产精品一区二区三区四区| 久久一区91| 九九九九免费视频| 国产精品一区二区你懂的| 短视频在线观看| 一区二区三区.www| 中文字幕天堂在线| 亚洲精品电影网| av免费网站在线| 国产精品热视频| 日本午夜精品| 99久久免费观看| 久久99九九99精品| 亚洲a v网站| 亚洲va中文字幕| 国产精品一级视频| 国产亚洲欧美日韩美女| 国产精品电影| 不卡视频一区二区三区| 99久久夜色精品国产亚洲96| 黄色一级一级片| 99久久精品99国产精品| 久久婷婷国产麻豆91| 51午夜精品国产| caoporn国产精品免费视频| 2024亚洲男人天堂| 国产精品久av福利在线观看| 裸体裸乳免费看| 久久丁香综合五月国产三级网站| 精品人妻无码一区二区三区| 亚洲一二三四区| www.com欧美| 欧美久久精品午夜青青大伊人| 青草综合视频| 天堂社区 天堂综合网 天堂资源最新版 | 男女啪啪免费观看| 韩日av一区二区| 黄色录像一级片| 这里只有精品99re| 国产精品久久麻豆| 91久久精品美女| 国产精品成久久久久| av中文字幕网址| 亚洲视频香蕉人妖| 国产精品热久久| 久久久精品999| 高清一区二区| 在线观看av的网址| 国产成人在线视频网址| 久久成人国产精品入口| 日韩欧美国产三级| 青青草视频在线免费直播| 99九九电视剧免费观看| 欧美国产日本| 艳妇乳肉豪妇荡乳xxx| 午夜精品久久久久久| 深夜福利在线看| 欧美亚洲日本网站| 一区二区三区四区在线看| 美女福利视频在线| 国产欧美一区二区精品婷婷| 欧美一区二区三区久久久| 一区二区亚洲欧洲国产日韩| 国产亚洲人成a在线v网站| 在线视频不卡国产| 国产大陆a不卡| 日韩视频免费观看高清| 精品视频www| 香蕉成人av| 在线观看精品视频| 国产jizzjizz一区二区| 99热在线观看免费精品| 亚洲视频在线免费观看| 欧洲亚洲精品| 日本中文字幕网址| 国产欧美精品国产国产专区| 一级特黄aaa大片| 欧美激情极品视频| 伊人久久大香线蕉综合网蜜芽| 欧美婷婷精品激情| 一区二区免费看| 桃花色综合影院| 国产欧美精品日韩精品| 国产精品红桃| 无码少妇一区二区| 日韩一级免费观看| 成人av观看| 7777在线视频| 久久亚洲一级片| 国产又粗又猛又爽又黄的视频一 | 欧美gay囗交囗交| 亚洲一区二区三区在线观看视频| 懂色av噜噜一区二区三区av| 精品久久久久久久久久久国产字幕| 久久精品99久久香蕉国产色戒| 狠狠久久伊人| 香蕉视频999| 亚洲成人av一区二区|