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

淺談并發編程中的死鎖問題

開發
本文介紹的死鎖的基本概念和發生的原因,同時也說明死鎖的危害并復現了幾種經典的死鎖案例與解決對策,希望對你有幫助。

Java并發編程中的死鎖在單體Java進程中也算是比較棘手的問題,所以本文將針對死鎖問題的本質和一些規避手段進行詳細的介紹,希望對你有幫助。

一、死鎖問題的本質

關于死鎖,哲學家進餐就是一個非常典型的案例,假設有5個哲學家和5根筷子,每個哲學家必須拿到一雙筷子后才能進餐,完成進餐后放下筷子進入思考。我們試想這樣一種極端情況,每個哲學家左手都拿一根筷子,都在等待其他人放下一根筷子進餐,由此各自都在等待且不放下彼此手里筷子的過程,就造成了死鎖:

這很好的解釋了死鎖的概念,本質來說造成死鎖的四大原因有:

  • 互斥:一個資源只能被一個線程獲取
  • 請求與保持:線程拿到資源后,在沒有獲取到想要的資源前,不會釋放已有資源
  • 不可剝奪:資源被其他線程持有時,其他線程無法剝奪資源使用權
  • 循環等待條件:若干線程獲取資源時,雙方按照相反的方向獲取,頭尾相接構成環路

而這個條件同理換到哲學家進餐問題上就是:

  • 每根筷子只能被一個哲學家獲取
  • 哲學家拿到筷子之后,除非拿到一雙筷子完成進餐,否則不會放下筷子
  • 哲學家持有筷子期間,其他人不可剝奪
  • 5個哲學家左手都拿著筷子,彼此都在等待其他哲學家手里筷子,造成阻塞環路

JVM面對死鎖問題沒有像數據庫那樣強大(默認超時釋放資源),一旦線程陷入死鎖,就可能不可再用了,進而造成:

  • 線程僵死導致整個java進程業務流程阻塞
  • 死鎖線程不可處理新的任務,造成服務吞吐量下降,進而權限癱瘓

除非顯示的將系統完全中止重啟,并希望不再發生類似的事情。

二、死鎖的危害

1. 饑餓問題

死鎖問題會導致大量線程僵持活躍在cpu中長時間執行,使得CPU時鐘周期被長期霸占,例如:

  • Java中線程優先級使用不當且因為各種原因進入死鎖,導致其他低優先級的線程長時間得不到時間執行時間片而執行超時。
  • 持有鎖的線程遲遲未能結束(因為活躍性問題等原因進入無限循環或者本身就是一個大循環),導致其他線程長時間等待。

中java線程的函數中雖然定義了setPriorit用于設置線程的優先級,但這只是作為操作系統調度的參考,手動設置java線程優先級的作用是微乎其微的,對于問題1出現的概率也不高,同時筆者也建議非必要的情況下不要去調整線程的優先級。

2. 糟糕的響應

對于計算密集型的后臺任務,利用使用并發容器在后臺頻繁寫入一些熱點數據,這就可能導致并發讀操作因為這些寫操作而阻塞,導致等待時間變長。為了保證直觀的GUI應用的響應,我們建議可以適當調低后臺任務的線程優先級,異或者采用分段鎖等方式分散并發壓力。

3. 活鎖問題

活鎖是另一種形式的活躍性問題,該問題盡管不會阻塞線程,但可能也會出現線程不能繼續執行后續工作,例如當前線程將處理失敗的任務每次失敗都提交到隊列首部,不斷重試執行這個失敗任務,造成后面的任務無法執行,這就是典型的線程饑餓。

解決辦法即隨機分配,例如redis raft選舉主觀下線后各個節點隨機一段時間發起拉票,從而降低平票的概率,保證盡可能早的選舉出leader,同樣的我們的隨機策略也可以將失敗的任務隨機采用隨機性重試機制,在指定時間后將任務存入隊列中重試。

void sentinelTimer(void) {
    // 前置檢查事件定期任務是否因為系統負載過大或者各種原因導致時鐘回撥,或者處理過長,進入tilt模式,該模式哨兵只會定期發送和接收命令
    sentinelCheckTiltCondition();
    //監聽的master節點作為參數傳入,進行逐個通信處理
    sentinelHandleDictOfRedisInstances(sentinel.masters);
    //......
    //隨機調整執行頻率避免同時執行,確保提高選舉一次性成功的概率
    server.hz = REDIS_DEFAULT_HZ + rand() % REDIS_DEFAULT_HZ;
}

三、詳解不同的死鎖案例與解決方案

1. 鎖順序造成的死鎖

基于上述的基本概念,我們引出第一個死鎖的案例,造成該死鎖的原因是兩個線程獲取鎖的方向是相反的,各自拿到第一把鎖之后,都在等待對方的第二把鎖,出現了加鎖依賴性問題,出現阻塞死鎖。

假設線程1執行leftRight對應先拿leftLock再獲取rightLock,線程2反之,對應的出現這樣一個造成死鎖的流程:

  • 線程0上leftLock
  • 與此同時,線程1上rightLock
  • 線程0嘗試獲取rightLock,發現被線程1持有,陷入阻塞等待
  • 線程1嘗試獲取leftLock,發現被線程0持有,陷入阻塞等待
  • 彼此僵持構成死鎖

對應上述事例,我們給出下面這段代碼:

private static final Object leftLock = new Object();
    private static final Object rightLock = new Object();


    /**
     * 線程0先上左鎖 再上右鎖
     */
    public static void leftRight() {
        synchronized (leftLock) {
            synchronized (rightLock) {
                Console.log("線程0上鎖成功");
            }
        }
    }

    /**
     * 線程1先上右鎖再上左鎖
     */
    public static void rightLeft() {
        synchronized (rightLock) {
            synchronized (leftLock) {
                Console.log("線程1上鎖成功");
            }
        }
    }

對應的筆者給出下面這段測試用例:

Thread t1 = new Thread(() -> leftRight());
        Thread t2 = new Thread(() -> rightLeft());
        
        t1.start();
        t2.start();

啟動后發現兩個線程僵持著,筆者基于jstack -b pid定位到了這兩個線程的死鎖代碼段,也就是我們上文的兩個函數對應的第二次上鎖的位置:

因為造成該問題的原因上因為兩者順序相反造成死鎖環路,所以解決的方式也很簡單,讓線程0和線程1保持一樣的上鎖順序,即讓二者從相同的方向競爭獲取兩把鎖:

2. 隱蔽的動態函數死鎖

我們再來看看這個案例,該函數的邏輯比較簡單,即直接將from賬戶的錢扣減,并加到to賬戶身上,從而完成一次轉賬操作,為了保證并發安全,該函數中執行轉賬操作時會以轉賬方和收款方實例作為鎖的對象:

public static void transfer(Account from, Account to, int amount) {
        synchronized (from) {
            synchronized (to) {
                //轉賬用戶扣除轉賬額度
                from.setMoney(from.getMoney() - amount);
                //接收方增加額度
                to.setMoney(to.getMoney() + amount);
            }
        }
    }

咋一看這段代碼沒有問題,但我們還是試想一下這樣一個場景:

  • 小明打算給小王轉賬100,觸發transfer調用
  • 與此同時,小王也打算給小明轉賬200,觸發transfer調用
  • 小明的轉賬函數先對自己上鎖,然后嘗試鎖住小王實例
  • 小王的轉賬函數先對自己的實例上鎖,然后嘗試鎖住小明的實例

是不是很熟悉?兩個函數調用在小明和小王之間僵持阻塞,再一次構成環路死鎖:

對應的代碼如下代碼所示,兩個不同的賬戶按照相反的方向給對方轉賬,由此出現因為時序問題,造成動態調用死鎖:

Account from = new Account();
        Account to = new Account();
        //兩個線程按照相反的方向給對方轉賬
        new Thread(()->transfer(from, to, 100)).start();
        new Thread(()->transfer(to, from, 200)).start();

對于這種問題的解決思路,永遠是要保證讓并發線程競爭鎖的順序,因為鎖是由外部傳參進來的,隨機性比較大,所以正確的排序鎖的方式筆者這樣一個思路:

  • 比對轉賬雙方實例的hashCode,那個小先嘗試上那把鎖
  • 因為hashcode存在沖突碰撞的情況,所以在hashCode一樣的情況下,則采用加時賽機制,我們建議線程同一去爭搶加時鎖(tile breaking lock)然后再嘗試獲取from和to兩把鎖,由此避免環路死鎖:

對應代碼示例如下,讀者可結合注釋理解:

//加時鎖
private static final Object tieLock = new Object();

public static void transfer(Account from, Account to, int amount) {

        if (from.hashCode() > to.hashCode()) {//如果from大先從小的to開始上鎖
            synchronized (to) {
                synchronized (from) {
                    doTransfer(from, to, amount);
                }
            }
        } else if (from.hashCode() < to.hashCode()) {//from小于to按照正常順序執行
            synchronized (from) {
                synchronized (to) {
                    doTransfer(from, to, amount);
                }
            }

        } else { //hash值一樣則上加時鎖
            synchronized (tieLock) {
                synchronized (from) {
                    synchronized (to) {
                        doTransfer(from, to, amount);
                    }
                }
            }

        }
    }

3. 嵌套包含死鎖和開放調用

協作對象死鎖問題相較于上述問題來說更加隱蔽,這兩個鎖并不一定是在一個方法上獲取的,同樣是持有當前方法鎖的情況下,嘗試獲取外部入參的協作對象的實例鎖,即多線程并發爭搶當前方法的實例鎖,再到函數內部調用入參對象的方法實例鎖。

舉個例子,服務A和服務B彼此會互相調用,服務A希望調用完服務B之后完成一次調用次數累計,服務B同理,因為要保證計數統計操作的原子性,彼此的函數都在方法上加了synchronized關鍵字如下代碼所示:

private static class AService {
        private int count;

        public synchronized void aFunc(BService bService) {//先上自己的實例鎖
            bService.func(this);//再調用外部對象的方法,嘗試上入參實例鎖
            count++;//完成方法計數統計
        }

        public synchronized void func(BService bService) {

        }
    }

    private static class BService {
        private int count;

        public synchronized void bFunc(AService aService) {
            aService.func(this);
            count++;
        }

        public synchronized void func(AService aService) {

        }
    }

我們事項這樣一個情況:

  • 線程0調用aService的aFunc,先獲取到aService的實例鎖
  • 線程1調用bService的bFunc,先獲取到bService的實例鎖
  • 線程0嘗試獲取入參bService的實例鎖,阻塞等待線程1釋放
  • 線程1同理

還是熟悉的環路,只不過這個涉及多個對象之間的函數調用更加的隱蔽:

其實仔細審查上述代碼之間的調用鏈,從邏輯分析的角度來看,它不僅僅是一個環路,更像是兩把實例鎖之間對于彼此使用權的爭搶,從調用鏈路來看,無論是a服務還是b服務,從調用的那一刻起就已經決定整個函數的調用必須是持有一把鎖,嘗試把另一把鎖包在當前實例鎖的維度中,也就是這種帶有包含關系的鎖競爭,最終將平行為度的鎖資源競爭變成了各自持有一把鎖情況下爭搶包含鎖的死鎖問題:

所以解決這種嵌套包含鎖的問題,就必須打破鎖之間的嵌套包哈關系,以本文為例,我們只需將方法鎖的關鍵字移動到僅僅需要保證互斥關系的count變量上,將包含關系變為并行關系:

private static class AService {
        private int count;

        public void aFunc(BService bService) {//先上自己的實例鎖
            bService.func(this);//再調用外部對象的方法,嘗試上入參實例鎖

            synchronized (this) {
                count++;//完成方法計數統計
            }
        }

        public synchronized void func(BService bService) {

        }
    }

    private static class BService {
        private int count;

        public void bFunc(AService aService) {
            aService.func(this);

            synchronized (this) {
                count++;//完成方法計數統計
            }
        }

        public synchronized void func(AService aService) {

        }
    }

代碼改造完成后,從整個服務調用鏈路來看:

  • 線程0 執行aFunc嘗試調用func
  • 線程1執行bFunc嘗試調用func
  • 線程0調用b服務的func成功,拿到b服務的鎖
  • 線程1嘗試調用a服務的func成功,完成后準備上自己的b服務實例鎖,發現被線程0持有,阻塞等待
  • 線程0完成b服務調用返回,上自己的實例鎖完成服務調用,釋放所有鎖
  • 線程1完成所有調用

需要補充一點,開放調用雖然解決了協作對象間請求與保持的死鎖條件,但這會使得原本原子操作變成非原子操作,所以使用時還是需要結合業務場景綜合考量一下。

四、死鎖的診斷

1. 排查方法論

以筆者個人經驗,對于死鎖的排查方式大體遵循如下步驟:

  • 通過監控工具定位阻塞的代碼段,例如筆者上文所使用的jstack指令
  • 基于代碼段定位阻塞的鎖以及所有涉及該鎖調用的函數,梳理出調用鏈
  • 基于該調用鏈,推理出發生死鎖的情況并復現問題
  • 基于上述幾種鎖的情況和解決步驟進行修復

2. 工具推薦

本文是基于JVM的jstack工具查看最下方的線程堆棧信息,實際上類似于arthas等這種監控工具會更方便,感興趣的讀者可以參考筆者這篇文章:《簡明的 Arthas 使用教程》。

責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2017-05-03 16:26:24

MySQL并發死鎖

2025-03-03 04:00:00

線程安全CPU

2024-03-19 14:14:27

線程開發

2016-09-26 17:09:28

Java并發編程內存模型

2013-09-22 10:15:05

編程思想

2009-02-05 15:32:23

接口委托

2021-10-20 20:27:55

MySQL死鎖并發

2022-07-02 08:40:00

并發編程

2011-07-05 10:20:38

java

2011-06-13 10:03:19

Qt 多線程 編程

2024-11-19 17:54:15

JavaCASABA問題

2025-08-25 06:05:00

代碼并發編程等待通知模型

2025-07-25 06:48:26

Java編程并發編程

2025-08-05 06:00:00

并發編程Java開發

2019-09-16 08:45:53

并發編程通信

2012-06-17 12:49:03

并發并發編程

2024-04-02 11:22:01

死鎖Java并發

2024-08-19 11:45:18

2012-03-09 10:44:11

Java

2009-06-29 13:26:44

Java編程入門加密
點贊
收藏

51CTO技術棧公眾號

亚洲免费久久| 国产精品免费在线免费| 国产精品一级黄片| 欧美日韩美女| 亚洲欧美一区二区在线观看| 粉嫩精品一区二区三区在线观看 | 91久久精品www人人做人人爽| 国产一级特黄视频| 国产一区二区三区日韩精品 | 欧美婷婷久久五月精品三区| 免费成人av资源网| 久久久久久久97| 国产精品美女高潮无套| 在线播放一区二区精品视频| 在线观看亚洲精品| 日本五级黄色片| 自拍视频在线免费观看| gogo大胆日本视频一区| 国产欧美精品一区二区三区-老狼| 久久久久久久久久91| 欧美少妇xxxx| 亚洲国产精品成人va在线观看| 91国产精品视频在线观看| heyzo中文字幕在线| 国产精品不卡一区| 欧美日韩一区在线播放| wwwxxxx国产| 美女视频黄久久| 日韩av电影免费观看高清| 四虎免费在线视频| 国产精品一区2区3区| 精品少妇一区二区| 97超碰人人看| 色综合.com| 色94色欧美sute亚洲线路二| 国产欧美日韩网站| 中中文字幕av在线| 国产精品乱码妇女bbbb| 日本一区视频在线观看| 亚洲av成人无码网天堂| 国产成人免费视频| 亚洲淫片在线视频| 国产原创中文av| 免费高清视频精品| 国产黑人绿帽在线第一区| 久久一区二区三区视频| 激情视频一区| 欧美激情久久久久久| 九九精品在线观看视频| 亚洲成人最新网站| 久久久999精品| 登山的目的在线| 婷婷综合亚洲| 久久的精品视频| 日本在线一级片| 天天射综合网视频| 久久精品国亚洲| 亚洲欧美卡通动漫| 999成人网| 精品久久久91| 欧美又粗又大又长| 亚洲香蕉网站| 97超视频免费观看| 中文字幕在线欧美| 日日嗨av一区二区三区四区| 国产精品久久激情| 综合久久中文字幕| 国产在线视频精品一区| 91成人免费视频| 天天操天天干天天爱| 2014亚洲片线观看视频免费| 你懂的网址一区二区三区| 黄网在线免费| 国产精品国产三级国产普通话99| 中文字幕av日韩精品| av大全在线| 偷窥国产亚洲免费视频| 欧美精品色婷婷五月综合| 国产精品毛片久久久久久久久久99999999| 欧美视频一区二区三区四区| 色网站在线视频| 国产精品香蕉| 亚洲色在线视频| 亚洲一二三在线观看| 精品电影一区| 国产精品高潮呻吟视频| 99精品免费观看| 99久久婷婷国产精品综合| 日韩免费毛片| 日韩成人伦理| 色嗨嗨av一区二区三区| 五月花丁香婷婷| 欧美久久精品| 日韩在线免费视频观看| 久久精品www人人爽人人| 麻豆精品网站| 91av一区二区三区| 秋霞av在线| 亚洲精选免费视频| 日韩免费毛片视频| 日韩中文字幕在线一区| 亚洲视频欧美视频| 欧美成人精品欧美一级私黄| 老司机精品视频网站| 1区1区3区4区产品乱码芒果精品| 青青草视频免费在线观看| 中文字幕在线不卡视频| 久久国产成人精品国产成人亚洲 | 成人av男人的天堂| 国产在线视频网站| 亚洲一二三区不卡| 午夜免费看视频| 亚洲警察之高压线| 欧美二区在线播放| 亚洲最大成人在线视频| 99久久伊人网影院| 91免费国产精品| 日韩精品第二页| 国产午夜精品一区理论片飘花 | 黄色片网站在线观看| 欧美小视频在线观看| wwwww在线观看| 欧美gayvideo| 国产成人精品日本亚洲专区61 | 亚洲性生活视频| 日韩美女视频网站| 国产成人精品综合在线观看| 一区二区三区不卡在线| 深夜成人影院| 日韩精品欧美国产精品忘忧草| 小泽玛利亚一区二区免费| 亚洲一区激情| 成人性色av| 成人日韩欧美| 91精品视频网| 永久免费看mv网站入口| 日韩不卡在线观看日韩不卡视频| 精品国产乱码久久久久久88av | 小日子的在线观看免费第8集| 精品免费一区二区| 91av视频导航| 污污视频在线免费看| 一区二区免费视频| 中文写幕一区二区三区免费观成熟| 日韩久久综合| 国产免费一区视频观看免费 | 亚洲黄色免费网站| 色91精品久久久久久久久| 久久精品国产99久久| 国产成人精品免费久久久久 | 欧美18xxxx| 久久久久久久久综合| 午夜精品久久久久久久爽| 亚洲欧美怡红院| 日韩欧美理论片| 99re66热这里只有精品8| 国产精品久久久久77777| 国产1区2区3区在线| 欧美中文字幕一区二区三区亚洲| 东方伊人免费在线观看| 琪琪一区二区三区| 亚洲人成77777| 亚洲黑人在线| 久热99视频在线观看| 国产成人麻豆精品午夜在线| 一区二区三区欧美| 国产xxxx视频| 亚洲影院一区| 日产精品久久久一区二区| 欧美亚洲大片| 久久偷看各类女兵18女厕嘘嘘| av免费在线不卡| 亚洲成人资源网| 成年人免费观看视频网站| 免费一级欧美片在线观看| 椎名由奈jux491在线播放| 亚洲精品一区二区三区中文字幕| 91国内在线视频| 国产三级电影在线观看| 制服丝袜亚洲网站| 精品无码m3u8在线观看| 久久久一区二区三区| 污视频网站观看| 午夜久久黄色| 蜜桃精品久久久久久久免费影院| 97成人超碰| 欧美精品xxx| 欧美日韩国产亚洲沙发| 在线不卡中文字幕| 日韩激情在线播放| 久久综合色8888| 日韩av自拍偷拍| 亚洲精品免费观看| 日本精品一区二区三区视频| 国产精品99久久免费| 国产做受高潮69| 91大神在线网站| 亚洲第一精品夜夜躁人人爽| 国产成人精品一区二区色戒| 亚洲制服丝袜av| 娇妻被老王脔到高潮失禁视频| 国产成人午夜视频| 粉嫩虎白女毛片人体| 欧美成人高清| 无遮挡亚洲一区| 久久婷婷国产| 91美女片黄在线观| 欧美gay囗交囗交| 久久久久国产精品一区| 97电影在线看视频| 日韩禁在线播放| 国产夫绿帽单男3p精品视频| 在线观看日韩精品| 日产亚洲一区二区三区| 亚洲视频一区二区免费在线观看| 在线免费观看成年人视频| 国产剧情一区在线| wwww.国产| 日韩精品一级二级| 国产xxxx振车| 综合久久亚洲| 一区二区三区在线视频111| 妖精视频一区二区三区| 国产伦精品一区二区三区四区视频| 日本久久一区| 国产精品 欧美在线| 交100部在线观看| 久久久久久com| 日韩三级电影视频| 欧美精品在线免费| 成人国产免费电影| 久久精品国产91精品亚洲| 成人精品一区二区三区校园激情| 日韩黄在线观看| 婷婷在线免费观看| 亚洲精品在线免费播放| 精品女同一区二区三区| 欧美一区二区三区日韩| 国产精品高潮呻吟AV无码| 欧美男同性恋视频网站| 91丨porny丨在线中文| 欧美性感一类影片在线播放| 91在线视频免费播放| 色哟哟一区二区三区| 久久精品国产成人av| 精品日韩中文字幕| 成人免费视频毛片| 精品久久久在线观看| 天堂网一区二区三区| 精品久久久久久电影| 亚洲永久精品在线观看| 大伊人狠狠躁夜夜躁av一区| 五月婷婷视频在线| 色综合久久久久久久| 国产伦精品一区二区三区视频网站| 欧美日韩激情美女| 久久黄色精品视频| 在线观看一区日韩| 97人妻精品一区二区三区软件| 欧美日韩高清在线| 国产伦精品一区二区三区四区| 91精品国产综合久久久久久漫画 | 中文字幕欧美精品在线| 91精品国产综合久久久久久豆腐| 色多多国产成人永久免费网站 | 国产精品欧美激情在线播放| 狠狠久久综合| 91九色露脸| 欧美成人一区在线观看| 青青草国产精品| 日韩欧美视频| 欧美一区日韩一区| 亚洲第一区第一页| 最近中文字幕在线免费观看| 日韩欧美亚洲视频| 色哟哟国产精品免费观看| 无码久久精品国产亚洲av影片| 欧美丝袜自拍制服另类| 精品国产一级片| 日韩成人免费视频| 成年人免费在线视频| www日韩中文字幕在线看| 免费在线看污片| 日本一区二区不卡| 伊人久久一区| 国产综合 伊人色| 色喇叭免费久久综合| 九九热只有这里有精品| 丝瓜av网站精品一区二区| 免费精品99久久国产综合精品应用| 国产suv精品一区二区883| 亚洲欧美色图视频| 国产精品麻豆久久久| 日本少妇激情视频| 在线影视一区二区三区| 精品久久在线观看| 国产亚洲欧美视频| 亚洲wwwww| 国产精品久久久久久av| 51vv免费精品视频一区二区| 日本一区美女| 激情欧美一区| 天堂av8在线| 国产偷v国产偷v亚洲高清| 欧美三级在线免费观看| 欧美在线不卡一区| 日韩在线观看视频一区二区三区| 中文字幕日韩有码| av成人影院在线| 91久久久久久久久久| 亚洲黄页在线观看| 成年人视频大全| 蜜桃视频在线观看一区二区| 精品国产av色一区二区深夜久久| 国产精品萝li| 精品国产一区二区三区四| 欧美mv和日韩mv国产网站| 日本欧美在线视频免费观看| 奇门遁甲1982国语版免费观看高清| 欧美经典影片视频网站| 亚洲 日韩 国产第一区| 久久都是精品| 人妖粗暴刺激videos呻吟| 亚洲色图欧洲色图婷婷| 亚洲香蕉在线视频| 亚洲毛片在线免费观看| av资源中文在线天堂| 97se国产在线视频| 亚洲影视一区| 在线免费观看av网| 亚洲欧洲在线观看av| 毛片在线免费播放| 亚洲欧美视频在线| 天堂av在线网| 国产综合第一页| 伊人久久婷婷| 久久久久久久穴| 亚洲一线二线三线久久久| 国产麻豆免费观看| 日韩视频―中文字幕| а√天堂资源国产精品| 日韩精品一区二区三区外面| 老司机精品视频网站| 日韩中文字幕有码| 欧美亚洲综合另类| 大胆av不用播放器在线播放| 国产精品99久久99久久久二8| 亚州av一区| 久久精品视频91| 欧美激情在线看| 亚洲天堂中文在线| www.亚洲免费视频| 精品国产亚洲日本| 欧美黑人在线观看| 成人国产精品免费观看| 日本一二三区不卡| 精品五月天久久| 午夜伦理福利在线| 欧美午夜视频在线| 日本欧美韩国一区三区| 一本一本久久a久久| 制服.丝袜.亚洲.中文.综合| 亚洲资源一区| 国产欧美日韩综合一区在线观看| 一区二区三区高清视频在线观看| 久久只有这里有精品| 欧美日韩国产一级片| 羞羞视频在线观看免费| 国产免费一区| 国产精品毛片一区二区三区| 欧美特黄一区二区三区| 欧美精品一二三| 欧美男男video| 免费在线观看91| 久久99久国产精品黄毛片色诱| 精品国产乱码久久久久久鸭王1| 精品国产91洋老外米糕| 性欧美xxx69hd高清| 一本久道久久综合狠狠爱亚洲精品| 国产尤物一区二区| 日韩精品久久久久久久| 正在播放亚洲1区| 成人动漫视频| 国产自偷自偷免费一区| 一区二区久久久久久| 久久电影视频| 99re在线视频上| 三级一区在线视频先锋 | 亚洲欧美综合网| 日韩一级片免费看| 国产精品91在线| 黄色av日韩| 美女网站视频色| 亚洲国产精品久久| 欧美综合社区国产| 又粗又黑又大的吊av| 亚洲视频在线观看一区| 四虎影院在线域名免费观看| 成人性教育视频在线观看| 亚洲精品乱码|