精品欧美一区二区三区在线观看 _久久久久国色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色视频在线| 国产精品一区二区久久久| 国产精品视频看看| 色88888久久久久久影院| 欧美欧美欧美欧美| 国产jizzjizz一区二区| 亚洲精品永久免费| 亚洲精品20p| bbw在线视频| 国产精品视频一二三区| 成人免费视频网站| 亚洲精品国产欧美在线观看| 一区在线免费观看| 色偷偷9999www| 亚洲国产精品自拍视频| 成人在线精品| 日本丶国产丶欧美色综合| 六月婷婷激情综合| 日韩精品毛片| 久久一夜天堂av一区二区三区 | 日本午夜精品电影| 精品国产乱码一区二区三 | 人妻换人妻a片爽麻豆| 成人精品动漫| 色狠狠色噜噜噜综合网| 免费一级特黄毛片| 在线观看中文| 亚洲视频免费看| 日韩中文一区| 黄色免费在线播放| 久久老女人爱爱| 动漫一区二区在线| 亚洲av无码乱码国产麻豆| 久久97超碰国产精品超碰| 国产精品1234| 亚洲精品中文字幕乱码三区91| 狠狠入ady亚洲精品| 超碰精品一区二区三区乱码| 美国黄色特级片| 国产精品久久久久久免费| 午夜精品久久久久久久96蜜桃| 亚洲巨乳在线| 国产情侣激情自拍| 日韩欧美中文字幕电影| 日韩精品中文字幕在线不卡尤物 | 欧洲高清一区二区| 日韩av成人| 久久一日本道色综合| 久久国产精品久久精品国产| 特黄视频在线观看| 91丨九色丨尤物| 久久亚洲一区二区| 蜜桃视频在线入口www| 久久久欧美精品sm网站| 日韩欧美精品在线不卡 | 色综合久久88| 九九热精彩视频| 国产一区二区三区自拍| 久久久久久一区二区三区| 国产一级av毛片| 99视频+国产日韩欧美| 欧美又大又硬又粗bbbbb| 中文字幕国产在线观看| 日韩中文欧美在线| 国产精品夜色7777狼人| 99久久夜色精品国产亚洲| 国产黄色91视频| 国产日韩在线一区二区三区| 香蕉视频黄色片| 国产偷v国产偷v亚洲高清| 亚洲最新在线| 蜜臀av在线播放| 欧美日韩在线免费| 不卡av免费在线| 电影一区二区| 日韩一级片网站| 国产性生活毛片| 久久99久久人婷婷精品综合| www.亚洲一区| 日本熟女一区二区| 丝袜亚洲另类丝袜在线| 国产日韩在线一区| 人妻91麻豆一区二区三区| 久久伊人蜜桃av一区二区| 曰韩不卡视频| 高端美女服务在线视频播放| 欧美网站一区二区| 成人啪啪18免费游戏链接| 久久99青青| 欧美日韩国产123| 成人免费毛片男人用品| 国产综合一区二区| 精品一区二区三区日本| 日本黄色片在线观看| 亚洲成人免费视| 国产理论在线播放| 最新国产精品精品视频| 亚洲午夜精品久久久久久性色| 国精品无码一区二区三区| 亚欧成人精品| 91视频最新| 性开放的欧美大片| 欧美日韩免费看| 天天综合成人网| 国产欧美日韩精品一区二区三区| 色综合天天综合网国产成人网| 午夜久久久久久久久久影院| 国产宾馆实践打屁股91| 四虎一区二区| 三妻四妾完整版在线观看电视剧| 6080日韩午夜伦伦午夜伦| 自拍偷拍中文字幕| 国内揄拍国内精品久久| 成人妇女免费播放久久久| 三级毛片在线免费看| 一区二区三区在线播放| 日本888xxxx| 日韩激情啪啪| 久久久久国产精品免费| 国产精品特级毛片一区二区三区| 国产亚洲欧美日韩日本| 波多野结衣乳巨码无在线| 日韩高清在线观看一区二区| 中文综合在线观看| 少妇太紧太爽又黄又硬又爽| 成人免费高清视频| 国产香蕉一区二区三区| 视频欧美精品| 中文字幕国产亚洲2019| 无码人妻一区二区三区免费| 99久久777色| 天堂…中文在线最新版在线| 99re6热只有精品免费观看| 久久天天躁狠狠躁夜夜av| 伊人久久国产精品| 国产精品视频第一区| 国产三级日本三级在线播放| 国产亚洲电影| 欧亚精品在线观看| 色视频在线看| 欧美午夜影院在线视频| 久久亚洲AV成人无码国产野外| 一本色道88久久加勒比精品| 精品国产一区二区三区免费| www视频在线观看| 亚洲精品按摩视频| 久草视频在线观| www一区二区| 国产天堂在线播放| 不卡在线一区| 国产精品高潮在线| 999国产在线视频| 欧美日韩一级二级三级| 国精产品久拍自产在线网站| 国产一区三区三区| www.国产二区| 欧美国产极品| 日韩av成人在线观看| 国产在线黄色| 欧美男人的天堂一二区| 欧美日韩成人免费观看| 成人国产免费视频| 国产精品va无码一区二区| 尤物tv在线精品| 国产国语videosex另类| 麻豆av免费在线观看| 欧美一区二区精美| 日韩精品乱码久久久久久| 久久这里只有精品首页| 在线观看国产日韩| 蜜桃传媒一区二区亚洲| 青青草成人在线观看| 一本—道久久a久久精品蜜桃| 国产视频一区二区在线播放| 欧美成人精品一区二区| 天堂在线视频网站| 91极品美女在线| 1769国产精品| 日韩一级片免费在线观看| 福利一区视频在线观看| 中文字幕91视频| www.色亚洲| 国产欧美另类| 午夜精品电影在线观看| 精品国产亚洲一区二区三区在线| 97精品久久久| 日本中文字幕电影在线免费观看| 欧美一个色资源| 国产一级做a爱片久久毛片a| 国产精品高潮呻吟| 中文在线永久免费观看| 久久99最新地址| 六月丁香激情网| 97精品国产福利一区二区三区| 国产呦系列欧美呦日韩呦| 国产亚洲欧美日韩精品一区二区三区 | 亚洲天堂福利av| 国产在线观看无码免费视频| 九九国产精品视频| 日日摸日日碰夜夜爽av| 欧美在线不卡| 日韩av电影免费播放| 4438全国亚洲精品观看视频| 国产欧美一区二区三区四区| 日本不卡1234视频| 欧美精品一区二区免费| 国产h在线观看| 亚洲精品久久在线| 精品国产区一区二| 欧美日韩午夜在线| 中文字幕精品无码一区二区| 亚洲夂夂婷婷色拍ww47| 成人一级黄色大片| 国产人妖乱国产精品人妖| 国产精品嫩草av| 成人天堂资源www在线| 国产高清999| 日本视频免费一区| 国语对白做受xxxxx在线中国| 亚洲午夜伦理| 99精品视频网站| 日本电影一区二区| 日本一区视频在线播放| 日韩a级大片| 国产乱码一区| 第四色在线一区二区| 亚洲一区二区中文| 久久一级大片| 亚洲精品欧美日韩| 日本一区影院| 亚洲r级在线观看| 麻豆国产一区二区三区四区| 国产欧美日韩91| ww久久综合久中文字幕| 国产精品第七十二页| 亚洲成人人体| 国产精品18久久久久久首页狼| 日本免费一区二区三区四区| 欧洲亚洲免费在线| 亚洲精品永久免费视频| 57pao精品| 久久91导航| 国产成人中文字幕| www.一区| 成人欧美在线观看| 亚洲**毛片| 国产不卡一区二区三区在线观看 | 欧美日本亚洲| 国产精选一区| 视频在线观看成人| 成人综合一区| 日韩第一页在线观看| 亚洲人体av| 久久久久久av无码免费网站下载| 你懂的一区二区| 久久精品国产sm调教网站演员| 亚洲国产综合在线看不卡| 欧美色图色综合| 狂野欧美一区| 羞羞的视频在线| 高清不卡在线观看| 黄色录像a级片| 国产欧美精品日韩区二区麻豆天美| 粉嫩精品久久99综合一区| 欧美日韩在线二区| 欧美乱妇15p| 18国产免费视频| 制服丝袜中文字幕亚洲| 亚洲毛片欧洲毛片国产一品色| 亚洲精品久久久久国产| 成年网站在线| 欧美精品做受xxx性少妇| sm在线播放| 国产欧美精品一区二区三区介绍| 亚洲一区二区三区日本久久九| 久久国产日韩欧美| 天天插综合网| 国产午夜福利100集发布| 天堂在线一区二区| 久草福利在线观看| 国产日韩三级在线| 欧美日韩激情在线观看| 色欲综合视频天天天| 国产乱码精品一区二三区蜜臂| 亚洲国产高潮在线观看| 国产大片在线免费观看| 久久久亚洲精品视频| 91成人在线| 国产精品亚洲综合| 日本一区二区在线看| 日本熟妇人妻xxxx| 蜜桃视频免费观看一区| 国产精品成人无码专区| 中文字幕日本不卡| 黄色在线免费观看| 91精品国产高清一区二区三区| 午夜一区在线观看| 久久99国产精品自在自在app| 国产超碰精品| 激情视频在线观看一区二区三区| 91日韩在线| 日本成人在线免费视频| 波多野结衣在线一区| 日本在线一级片| 在线区一区二视频| 视频一区二区免费| 欧美成人精品在线观看| 久久婷婷五月综合色丁香| 精品国产一区二区三区麻豆小说| 中文字幕一区二区av| 免费涩涩18网站入口| 久久夜色精品一区| 黄色片视频网站| 欧美变态tickle挠乳网站| 黄网站在线播放| 国产精品久久电影观看| 少妇久久久久| 国产精品无码人妻一区二区在线| 国产老肥熟一区二区三区| 国产精品视频在| 在线观看欧美日本| 每日更新av在线播放| 57pao国产成人免费| 欧美人与动xxxxz0oz| 六月婷婷激情综合| 国产成人日日夜夜| www青青草原| 7799精品视频| 精品视频在线一区二区| 91精品视频在线看| 外国成人激情视频| 色天使在线观看| 中文字幕视频一区| 91久久精品国产91性色69| 色播久久人人爽人人爽人人片视av| 日本免费一区二区三区四区| 欧美日韩免费观看一区| 乱人伦精品视频在线观看| 国产男男chinese网站| 狠狠色狠狠色综合日日五| 四虎影视在线播放| 欧美一乱一性一交一视频| 亚洲精品无吗| 国产一级片黄色| 日本一区二区三区四区在线视频| 波多野结衣mp4| 中文字幕日韩在线播放| 久久精品资源| 国产一二三四五| 国产成人精品在线看| 国产在线一区视频| 亚洲精品国精品久久99热| 国偷自产一区二区免费视频| 欧美视频1区| 久久精品72免费观看| 国产精品久久久精品四季影院| 日韩欧美久久久| 国产777精品精品热热热一区二区| 久久亚洲高清| 裸体一区二区三区| 天天综合天天做| 亚洲精品成人av| 欧美日韩尤物久久| 视频一区二区视频| 成人做爰69片免费看网站| 欧美a∨亚洲欧美亚洲| 亚洲偷欧美偷国内偷| 在线不卡一区| 欧美视频免费看欧美视频| 久久久精品国产99久久精品芒果| 中文字字幕在线观看| 欧美裸身视频免费观看| 色先锋久久影院av| 艹b视频在线观看| 亚洲一区二区三区国产| 日韩在线无毛| 亚洲精品免费在线视频| 久久av最新网址| 免费一级suv好看的国产网站| 日韩欧美在线一区二区三区| 最新欧美色图| 国产人妻互换一区二区| 91丨porny丨户外露出| 91亚洲国产成人久久精品麻豆| 欧美激情在线观看视频| 国产中文精品久高清在线不| 制服下的诱惑暮生| 欧洲一区二区三区在线| 精品精品导航| 日韩免费av一区二区三区| 国产不卡在线一区| 在线观看免费视频a| 性欧美办公室18xxxxhd| 国产精品97| 人妻丰满熟妇aⅴ无码| 日韩欧美一级二级三级久久久| 日韩在线免费|