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

Java高并發編程基礎三大利器之Semaphore

開發 后端
Semaphore(信號量)是用來控制同時訪問特定資源的線程數量,它通過協調各個線程,以保證合理的使用公共資源。

引言

最近可以進行個稅申報了,還沒有申報的同學可以趕緊去試試哦。不過我反正是從上午到下午(3月1日)一直都沒有成功的進行申報,一進行申報 就返回“當前訪問人數過多,請稍后再試”。為什么有些人就能夠申報成功,有些人就直接返回失敗。這很明顯申報處理資源是有限的, 只能等別人處理完了在來處理你的,你如果運氣好可能重試幾次就輪到你了,如果運氣不好可能重試一天也可能輪不到你。我反正已經是放棄了,等到夜深人靜的時候再來試試。作為一個程序員我們肯定知道這是個稅申請app的限流操作,如果還有不懂什么 是限流操作的可以參考下這個文章《高并發系統三大利器之限流》。比如個稅申報系統每臺機器只最多分別最多只能處理1000個請求,再多的請求就會把機器打掛。如果是多余的請求就把這些請求拒絕掉。直接給你返回一句溫馨提示:“當前訪問人數過多,請稍后再試”,如果要實現這個功能大家想想可以通過哪些方法算法來實現。

共享鎖、獨占鎖

學習semaphore之前我們必須要先了解下什么是共享鎖。

共享鎖:它是允許多個線程同時獲取鎖,并發的訪問共享資源

獨占鎖:也有人把它叫做“獨享鎖”,它是是獨占的,排他的,只能被一個線程可持有, 當獨占鎖已經被某個線程持有時,其他線程只能等待它被釋放后,才能去爭鎖,并且同一時刻只有一個線程能爭鎖成功。

什么是Semaphore

Semaphore(信號量)是用來控制同時訪問特定資源的線程數量,它通過協調各個線程,以保證合理的使用公共資源。很多年以來,我都覺得從字面上很難理解Semaphore所表達的含義,只能把它比作是控制流量的紅綠燈,比如XX馬路要限制流量,只允許同時有一百輛車在這條路上行使,其他的都必須在路口等待,所以前一百輛車會看到綠燈,可以開進這條馬路,后面的車會看到紅燈,不能駛入XX馬路,但是如果前一百輛中有五輛車已經離開了XX馬路,那么后面就允許有5輛車駛入馬路,這個例子里說的車就是線程,駛入馬路就表示線程在執行,離開馬路就表示線程執行完成,看見紅燈就表示線程被阻塞,不能執行。”

  • Semaphore機制是提供給線程搶占式獲取許可,所以他可以實現公平或者非公平,類似于ReentrantLock。說了這么多我們來個實際的例子看一看,比如我們去停車場停車,停車場總共只有5個車位,但是現在有8輛汽車來停車,剩下的3輛汽車要么等其他汽車開走后進行停車,或者去找別的停車位?
  1. /** 
  2.  * @author: 公眾號【Java金融】 
  3.  */ 
  4. public class SemaphoreTest { 
  5.     public static void main(String[] args) throws InterruptedException { 
  6.          // 初始化五個車位 
  7.         Semaphore semaphore = new Semaphore(5); 
  8.         // 等所有車子 
  9.         final CountDownLatch latch = new CountDownLatch(8); 
  10.         for (int i = 0; i < 8; i++) { 
  11.             int finalI = i; 
  12.             if (i == 5) { 
  13.                 Thread.sleep(1000); 
  14.                 new Thread(() -> { 
  15.                     stopCarNotWait(semaphore, finalI); 
  16.                     latch.countDown(); 
  17.                 }).start(); 
  18.                 continue
  19.             } 
  20.             new Thread(() -> { 
  21.                 stopCarWait(semaphore, finalI); 
  22.                 latch.countDown(); 
  23.             }).start(); 
  24.         } 
  25.         latch.await(); 
  26.         log("總共還剩:" + semaphore.availablePermits() + "個車位"); 
  27.     } 
  28.  
  29.     private static void stopCarWait(Semaphore semaphore, int finalI) { 
  30.         String format = String.format("車牌號%d", finalI); 
  31.         try { 
  32.             semaphore.acquire(1); 
  33.             log(format + "找到車位了,去停車了"); 
  34.             Thread.sleep(10000); 
  35.         } catch (Exception e) { 
  36.             e.printStackTrace(); 
  37.         } finally { 
  38.             semaphore.release(1); 
  39.             log(format + "開走了"); 
  40.         } 
  41.     } 
  42.  
  43.     private static void stopCarNotWait(Semaphore semaphore, int finalI) { 
  44.          String format = String.format("車牌號%d", finalI); 
  45.         try { 
  46.             if (semaphore.tryAcquire()) { 
  47.                 log(format + "找到車位了,去停車了"); 
  48.                 Thread.sleep(10000); 
  49.                 log(format + "開走了"); 
  50.                 semaphore.release(); 
  51.             } else { 
  52.                 log(format + "沒有停車位了,不在這里等了去其他地方停車去了"); 
  53.             } 
  54.         } catch (Exception e) { 
  55.             e.printStackTrace(); 
  56.         } 
  57.  
  58.     } 
  59.  
  60.     public static void log(String content) { 
  61.         // 格式化 
  62.         DateTimeFormatter fmTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 
  63.         // 當前時間 
  64.         LocalDateTime now = LocalDateTime.now(); 
  65.         System.out.println(now.format(fmTime) + "  "+content); 
  66.     } 
  1. 2021-03-01 18:54:57  車牌號0找到車位了,去停車了 
  2. 2021-03-01 18:54:57  車牌號3找到車位了,去停車了 
  3. 2021-03-01 18:54:57  車牌號2找到車位了,去停車了 
  4. 2021-03-01 18:54:57  車牌號1找到車位了,去停車了 
  5. 2021-03-01 18:54:57  車牌號4找到車位了,去停車了 
  6. 2021-03-01 18:54:58  車牌號5沒有停車位了,不在這里等了去其他地方停車去了 
  7. 2021-03-01 18:55:07  車牌號7找到車位了,去停車了 
  8. 2021-03-01 18:55:07  車牌號6找到車位了,去停車了 
  9. 2021-03-01 18:55:07  車牌號2開走了 
  10. 2021-03-01 18:55:07  車牌號0開走了 
  11. 2021-03-01 18:55:07  車牌號3開走了 
  12. 2021-03-01 18:55:07  車牌號4開走了 
  13. 2021-03-01 18:55:07  車牌號1開走了 
  14. 2021-03-01 18:55:17  車牌號7開走了 
  15. 2021-03-01 18:55:17  車牌號6開走了 
  16. 2021-03-01 18:55:17  總共還剩:5個車位 

從輸出結果我們可以看到車牌號5這輛車看見沒有車位了,就不在這個地方傻傻的等了,而是去其他地方了,但是車牌號6和車牌號7分別需要等到車庫開出兩輛車空出兩個車位后才停進去。這就體現了Semaphore 的acquire 方法如果沒有獲取到憑證它就會阻塞,而tryAcquire方法如果沒有獲取到憑證不會阻塞的。

semaphore在dubbo中的應用

在Dubbo中可以給Provider配置線程池大小來控制系統提供服務的最大并行度,默認是200。

  1. <dubbo:provider  threads="200"/> 

比如我現在這個訂單系統有三個接口,分別為創單、取消訂單、修改訂單。這三個接口加起來的并發是200但是創單接口是核心接口,我想讓它多分點線程來執行 讓它可以有最大150個線程,取消訂單和修改訂單分別最大25個線程執行就可以了。dubbo提供了executes這一屬性來實現這個功能

  1. <dubbo:service interface="cn.javajr.service.CreateOrderService" executes="150"/> 
  2. <dubbo:service interface="cn.javajr.service.CancelOrderService" executes="25"/> 
  3. <dubbo:service interface="cn.javajr.service.EditOrderService" executes="25"/> 

我們可以看看dubbo內部是如何來executes的,具體實現是在ExecuteLimitFilter這個類我們可以

  1.  public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { 
  2.         URL url = invoker.getUrl(); 
  3.         String methodName = invocation.getMethodName(); 
  4.         Semaphore executesLimit = null
  5.         boolean acquireResult = false
  6.         int max = url.getMethodParameter(methodName, Constants.EXECUTES_KEY, 0); 
  7.         if (max > 0) { 
  8.             RpcStatus count = RpcStatus.getStatus(url, invocation.getMethodName()); 
  9.             // 如果當前使用的線程數量已經大于等于設置的閾值,那么直接拋出異常 
  10. //            if (count.getActive() >= max) { 
  11. // throw new RpcException("Failed to invoke method " + invocation.getMethodName() + " in provider " + url + ", cause: The service // using threads greater than <dubbo:service executes=\"" + max + "\" /> limited."); 
  12.             /** 
  13.              * http://manzhizhen.iteye.com/blog/2386408 
  14.              * use semaphore for concurrency control (to limit thread number) 
  15.              */ 
  16.               
  17.             executesLimit = count.getSemaphore(max); 
  18.             if(executesLimit != null && !(acquireResult = executesLimit.tryAcquire())) { 
  19.                 throw new RpcException("Failed to invoke method " + invocation.getMethodName() + " in provider " + url + ", cause: The service using threads greater than <dubbo:service executes=\"" + max + "\" /> limited."); 
  20.             } 
  21.         } 
  22.         long begin = System.currentTimeMillis(); 
  23.         boolean isSuccess = true
  24.         // 計數器+1 
  25.         RpcStatus.beginCount(url, methodName); 
  26.         try { 
  27.             Result result = invoker.invoke(invocation); 
  28.             return result; 
  29.         } catch (Throwable t) { 
  30.             isSuccess = false
  31.             if (t instanceof RuntimeException) { 
  32.                 throw (RuntimeException) t; 
  33.             } else { 
  34.                 throw new RpcException("unexpected exception when ExecuteLimitFilter", t); 
  35.             } 
  36.         } finally { 
  37.            // 計數器-1 
  38.             RpcStatus.endCount(url, methodName, System.currentTimeMillis() - begin, isSuccess); 
  39.             if(acquireResult) { 
  40.                 executesLimit.release(); 
  41.             } 
  42.         } 
  43.     } 

從上述代碼我們也可以看出早期這個是沒有采用Semaphore來實現的,而是直接采用被注釋的 if (count.getActive() >= max) 這個來來實現的,由于這個count.getActive() >= max 和這個計數加1不是原子性的,所以會有問題,具體bug號可以看https://github.com/apache/dubbo/pull/582后面才采用上述代碼用Semaphore來修復非原子性問題。具體更詳細的分析可以參見代碼的鏈接。不過現在最新版本(2.7.9)我看是采用采用自旋加上和CAS來實現的。

Semaphore

上面就是對Semaphore一個簡單的使用以及dubbo中用到的例子,說句實話Semaphore在工作中用的還是比較少的,不過面試又有可能會被問到,所以還是有必要來一起學習一下它。我們前面《Java高并發編程基礎之AQS》通過ReentrantLock 一起學習了下AQS,其實Semaphore同樣也是通過AQS來是實現的,我們可以一起來對照下獨占鎖的方法,基本上都是有方法一一相對應的。圖片這里有兩點稍微需要注意的地方:

  • 在獨占鎖模式中,我們只有在獲取了獨占鎖的節點釋放鎖時,才會喚醒后繼節點,因為獨占鎖只能被一個線程持有,如果它還沒有被釋放,就沒有必要去喚醒它的后繼節點。
  • 在共享鎖模式下,當一個節點獲取到了共享鎖,我們在獲取成功后就可以喚醒后繼節點了,而不需要等到該節點釋放鎖的時候,這是因為共享鎖可以被多個線程同時持有,一個鎖獲取到了,則后繼的節點都可以直接來獲取。因此,在共享鎖模式下,在獲取鎖和釋放鎖結束時,都會喚醒后繼節點。

獲取憑證

我們同樣還是通過非公平鎖的模式來獲取憑證 我們可以看下acquire的核心方法

  1. public final void acquireSharedInterruptibly(int arg) 
  2.           throws InterruptedException { 
  3.       if (Thread.interrupted()) 
  4.           throw new InterruptedException(); 
  5.       if (tryAcquireShared(arg) < 0) 
  6.           doAcquireSharedInterruptibly(arg); 
  7.   } 
  8.    protected int tryAcquireShared(int acquires) { 
  9.            return nonfairTryAcquireShared(acquires); 
  10.   } 
  11.  
  12. // 主要看下這個方法,這個方法返回的值也就是tryAcquireShared返回的值,因為tryAcquireShared->nonfairTryAcquireShared 
  13.    final int nonfairTryAcquireShared(int acquires) { 
  14.          //自旋 
  15.    for (;;) { 
  16.         //Semaphore用AQS的state變量的值代表可用許可數 
  17.         int available = getState(); 
  18.         //可用許可數減去本次需要獲取的許可數即為剩余許可數 
  19.         int remaining = available - acquires; 
  20.         //如果剩余許可數小于0或者CAS將當前可用許可數設置為剩余許可數成功,則返回成功許可數 
  21.         if (remaining < 0 || 
  22.             compareAndSetState(available, remaining)) 
  23.             return remaining; 
  24.     } 
  • 當tryAcquireShared 獲取返回許可書小于0時說明獲取許可失敗需要進入doAcquireSharedInterruptibly這個方法去休眠。
  • 當tryAcquireShared 獲取返回許可書小于0時說明獲取許可成功直接結束。

doAcquireSharedInterruptibly

  1. private void doAcquireSharedInterruptibly(int arg) 
  2.        throws InterruptedException { 
  3.        // 獨占鎖的acquireQueued調用的是addWaiter(Node.EXCLUSIVE), 
  4.        // 而共享鎖調用的是addWaiter(Node.SHARED),表明了該節點處于共享模式 
  5.        final Node node = addWaiter(Node.SHARED); 
  6.        boolean failed = true
  7.        try { 
  8.            for (;;) { 
  9.                final Node p = node.predecessor(); 
  10.                if (p == head) { 
  11.                    int r = tryAcquireShared(arg); 
  12.                    if (r >= 0) { 
  13.                        setHeadAndPropagate(node, r); 
  14.                        p.next = null; // help GC 
  15.                        failed = false
  16.                        return
  17.                    } 
  18.                } 
  19.                if (shouldParkAfterFailedAcquire(p, node) && 
  20.                    parkAndCheckInterrupt()) 
  21.                    throw new InterruptedException(); 
  22.            } 
  23.        } finally { 
  24.            if (failed) 
  25.                cancelAcquire(node); 
  26.        } 
  27.    } 

這個方法是不是跟我們上篇文章講的AQS的獨占鎖的acquireQueued很像,不過獨占鎖它是直接調用了用了setHead(node)方法,而共享鎖調用的是setHeadAndPropagate(node, r)這個方法除了調用setHead 里面還調用了doReleaseShared(喚醒后繼節點)

  1. private void setHeadAndPropagate(Node node, int propagate) { 
  2.       Node h = head; // Record old head for check below 
  3.       setHead(node); 
  4.       if (propagate > 0 || h == null || h.waitStatus < 0 || 
  5.           (h = head) == null || h.waitStatus < 0) { 
  6.           Node s = node.next
  7.           if (s == null || s.isShared()) 
  8.               doReleaseShared(); 
  9.       } 
  10.   } 

其他的方法基本上是和ReentrantLock來實現的獨占鎖差不多,我相信大家對源碼分析感興趣的應該也不多,其他更多細節問題還是需要自己親自動手去看源碼的。

總結

當信號量Semaphore初始化設置許可證為1 時,它也可以當作互斥鎖使用。其中0、1就相當于它的狀態,當=1時表示其他線程可以獲取,當=0時,排他,即其他線程必須要等待。

Semaphore是JUC包中的一個很簡單的工具類,用來實現多線程下對于資源的同一時刻的訪問線程數限制

Semaphore中存在一個【許可】的概念,即訪問資源之前,先要獲得許可,如果當前許可數量為0,那么線程阻塞,直到獲得許可

Semaphore內部使用AQS實現,由抽象內部類Sync繼承了AQS。因為Semaphore天生就是共享的場景,所以其內部實際上類似于共享鎖的實現

共享鎖的調用框架和獨占鎖很相似,它們最大的不同在于獲取鎖的邏輯——共享鎖可以被多個線程同時持有,而獨占鎖同一時刻只能被一個線程持有。

由于共享鎖同一時刻可以被多個線程持有,因此當頭節點獲取到共享鎖時,可以立即喚醒后繼節點來爭鎖,而不必等到釋放鎖的時候。因此,共享鎖觸發喚醒后繼節點的行為可能有兩處,一處在當前節點成功獲得共享鎖后,一處在當前節點釋放共享鎖后。

采用semaphore來進行限流的話會產生突刺現象。

★指在一定時間內的一小段時間內就用完了所有資源,后大部分時間中無資源可用。比如在限流方法中的計算器算法,設置1s內的最大請求數為100,在前100ms已經有了100個請求,則后面900ms將無法處理請求,這就是突刺現象。

本文轉載自微信公眾號「java金融」,可以通過以下二維碼關注。轉載本文請聯系java金融公眾號。

 

責任編輯:武曉燕 來源: java金融
相關推薦

2021-03-18 00:14:29

JavaCyclicBarri高并發

2021-03-11 00:05:55

Java高并發編程

2020-08-27 08:17:05

緩存高并發系統

2021-02-26 13:08:27

Java高并發AQS

2014-03-14 10:34:28

JavaJava并發

2020-11-30 16:01:03

Semaphore

2025-06-18 08:10:00

Java并發編程開發

2022-07-02 08:40:00

并發編程

2024-11-21 14:55:37

2020-09-21 06:53:41

NoSQL高并發面試

2024-04-10 08:16:20

多線程編程Java并發編程

2022-11-27 08:12:11

RocketMQ源碼工具類

2019-11-07 09:20:29

Java線程操作系統

2024-12-27 09:08:25

2021-08-05 07:58:22

并發編程包Task

2011-07-05 14:42:46

java

2025-07-04 07:06:48

2024-09-02 22:49:33

2016-11-28 09:08:43

java系統異步非阻塞

2021-02-14 18:26:25

高并發大對象代碼
點贊
收藏

51CTO技術棧公眾號

亚洲天堂网一区| 精品国偷自产在线视频99| 欧美 日韩 国产 高清| 日本天堂在线| 久久99精品久久久| 国模精品视频一区二区三区| 色哟哟精品视频| 精品51国产黑色丝袜高跟鞋| 丁香六月综合激情| 日韩中文字幕精品视频| 国模大尺度视频| 亚洲性色av| www.视频一区| 国产精品美女久久久久久免费| 黄色a级片在线观看| 美女av一区| 欧美一区二区三区四区五区| 欧美三级在线观看视频| 久久日韩视频| 久久一二三国产| 99免费在线观看视频| 超碰在线观看91| 亚洲午夜视频| 日韩中文字幕在线精品| 老熟妇精品一区二区三区| 国产人妖一区| 色婷婷久久综合| 免费一级淫片aaa片毛片a级| 99re热久久这里只有精品34| 91视频一区二区| 国产精品二区在线观看| 在线视频你懂得| 天堂午夜影视日韩欧美一区二区| 九九久久国产精品| 少妇高潮一区二区三区喷水| 自拍偷拍一区| 亚洲韩国日本中文字幕| 中文字幕永久免费| 久久久久久久久成人| 在线看国产一区| 日本精品免费在线观看| heyzo一区| 一区二区视频在线| 91传媒免费视频| 九七久久人人| 日韩一区在线播放| 亚洲午夜精品久久| 色的视频在线免费看| 久久国产精品无码网站| 日韩av三级在线观看| 国产成人免费观看视频| 合欧美一区二区三区| 欧美精品在线播放| 激情五月婷婷在线| 国内精品久久久久久久97牛牛| 色999日韩欧美国产| 久久久精品成人| 天堂av一区| 91麻豆精品国产91久久久更新时间 | 51社区在线成人免费视频| 亚洲电影一级黄| 成人小视频在线观看免费| 美足av综合网| 亚洲va韩国va欧美va精品| 日韩国产一级片| 美女av在线免费看| 国产精品久久夜| 正在播放国产精品| 9191在线播放| 一区二区三区欧美久久| 岛国大片在线播放| 中日韩脚交footjobhd| 欧美性猛交xxxx富婆| 中文字幕99| 黄色网在线免费看| 一区二区理论电影在线观看| 九九爱精品视频| 亚洲欧洲美洲av| 欧美在线视频日韩| 一级网站在线观看| 巨胸喷奶水www久久久免费动漫| 欧美色图天堂网| 亚洲在线观看网站| 亚瑟一区二区三区四区| 中文字幕v亚洲ⅴv天堂| 国产精品无码在线| 久久综合亚洲| 成人444kkkk在线观看| 日韩免费一级片| 日韩电影在线免费看| 91亚洲人电影| 天天色棕合合合合合合合| 国产亚洲一区二区在线观看| 国产av第一区| 91精品论坛| 亚洲曰韩产成在线| 别急慢慢来1978如如2| 91精品国产色综合久久不卡粉嫩| 精品国产免费视频| 女人黄色一级片| 亚洲二区免费| 国产噜噜噜噜噜久久久久久久久| 亚洲精品97久久中文字幕| 国产亚洲一区二区三区四区 | 在线视频欧美精品| 在线成人精品视频| 波多野结衣一区| 久久久噜噜噜久噜久久| 最近中文字幕av| 成人爽a毛片一区二区免费| 亚洲电影一二三区| 美女网站在线看| 日韩色视频在线观看| 久久婷婷五月综合| 国产情侣一区| 3d动漫啪啪精品一区二区免费| 亚洲av无码乱码国产精品fc2| 国产精品一级片| 天堂一区二区三区| 在线男人天堂| 精品国产乱码久久久久久蜜臀 | 亚洲免费高清视频在线| 热久久精品国产| 理论片一区二区在线| 久久综合免费视频影院| 波多野结衣大片| 91视频免费看| 青青艹视频在线| 亚洲一区二区三区中文字幕在线观看| 亚洲午夜小视频| 国产一级片毛片| 国产91综合网| 男人的天堂成人| 国产剧情在线| 欧美性受xxxx黑人xyx| 无码人妻精品一区二区三区温州| 亚洲性色视频| 成人羞羞视频免费| 色网在线观看| 日韩免费在线观看| 九九精品视频免费| 激情小说亚洲一区| 国产高清免费在线| 亚洲二区av| 久久视频在线看| 国产免费不卡视频| 亚洲激情成人在线| 色哟哟在线观看视频| 中文字幕人成人乱码| 国产日韩视频在线观看| 免费不卡视频| 午夜精品免费在线观看| 国产成人av片| 亚洲精品四区| 久久精品国产美女| 亚洲十八**毛片| 亚洲视频日韩精品| 国产一区二区三区在线视频观看| 免费在线看一区| 一级特黄录像免费播放全99| 亚洲高清国产拍精品26u| 久久av.com| 黄色aaa毛片| 亚洲国产精品成人综合色在线婷婷 | 成人淫片在线看| 在线中文字幕电影| 精品国产第一区二区三区观看体验| 久久久香蕉视频| 97久久久精品综合88久久| 日本网站免费在线观看| 国产一区二区精品久| 国产精品视频色| h视频在线免费观看| 欧美成人vr18sexvr| 久久久久久亚洲中文字幕无码| 久久精品在线| 亚洲最新在线| 成人自拍在线| 日韩av手机在线| 国产传媒在线播放| 日韩高清免费观看| 探花国产精品一区二区| 亚洲欧美色图小说| 亚洲av片不卡无码久久| 久久精品国产精品亚洲精品| 国产精品视频二| 亚欧日韩另类中文欧美| 91精品视频在线| 在线观看爽视频| 久久久999国产| 天堂在线中文字幕| 欧美久久一区二区| 99热只有这里有精品| 国产电影精品久久禁18| 中文字幕久精品免| 岛国精品一区| 国产日韩欧美在线看| 9765激情中文在线| 综合网中文字幕| 手机看片1024国产| 51久久夜色精品国产麻豆| 91精品国产乱码在线观看| 国产精品免费丝袜| 丰满少妇一区二区三区| 国产一区二区三区蝌蚪| 亚洲熟妇av一区二区三区| 牛牛国产精品| 日韩久久不卡| 欧美xxxx在线| 97视频com| 性一交一乱一伧老太| 一本大道av一区二区在线播放| 中文字幕av播放| 国产网红主播福利一区二区| 手机免费看av片| 国产一区二区三区日韩| 无码日韩人妻精品久久蜜桃| 亚洲激情自拍| 男人天堂成人网| 99久久精品费精品国产风间由美| 另类欧美小说| 久久午夜影院| 国产偷久久久精品专区| 久久视频免费| 成人精品视频99在线观看免费| 老司机2019福利精品视频导航| 欧美成人免费大片| h片在线观看网站| 自拍偷拍亚洲区| av在线播放av| 亚洲视屏在线播放| 欧美在线观看在线观看| 亚洲黄色av网站| 国 产 黄 色 大 片| 日韩视频123| 99精品人妻无码专区在线视频区| 欧美日韩激情一区| 在线观看免费视频一区| 欧美性感一区二区三区| 国产午夜无码视频在线观看| 欧美性色视频在线| 日韩欧美成人一区二区三区| 精品成人在线视频| 国产a∨精品一区二区三区仙踪林| 亚洲一区二区三区激情| 不卡一区二区在线观看| 91亚洲午夜精品久久久久久| 成人午夜精品无码区| 成人黄色一级视频| 800av在线播放| 97久久精品人人做人人爽50路| 自拍视频一区二区| 2021中文字幕一区亚洲| ass精品国模裸体欣赏pics| www.亚洲激情.com| 性高潮久久久久久久 | 成人一级黄色大片| 亚洲欧美一区二区三区极速播放 | 欧美日韩aaaaa| 国产精品色综合| 日韩亚洲欧美在线| 少妇精品视频一区二区 | 国产精品一区二区三区免费观看 | 成人线上视频| 国产精品久久99久久| 国产精品伦一区二区| 91精品一区二区| 一区二区亚洲视频| 久久精品一二三区| 成人毛片在线| 老司机午夜免费福利视频| 亚洲高清成人| 亚洲人成无码www久久久| 久久精品国产一区二区| 中文字幕无码毛片免费看| 99精品视频一区| 精品人妻中文无码av在线| 亚洲精品写真福利| 日韩高清免费av| 欧美日韩国产精选| 秋霞欧美在线观看| 中文字幕久久久av一区| 欧美6一10sex性hd| 日韩免费在线看| 国产精品一区免费在线| 久久久综合亚洲91久久98| 精品一区二区三区在线| 777久久精品一区二区三区无码 | 精品久久久久久中文字幕一区奶水| 波多野结衣在线电影| 日韩三级av在线播放| 欧美精品少妇| 久久99精品久久久久久青青91| 美女高潮在线观看| 亚洲一区二区三区四区视频| 亚洲精品白浆高清| 国产精品日韩三级| 美女网站在线免费欧美精品| 小毛片在线观看| 亚洲人成网站色在线观看 | 欧美一级国产精品| 国产中文字幕在线视频| 精品电影一区二区| 求av网址在线观看| 青青青国产精品一区二区| 欧洲一区在线| 婷婷精品国产一区二区三区日韩| 欧美日韩一区自拍| 色www免费视频| 久久精品国产久精国产爱| 国产一级二级视频| 亚洲六月丁香色婷婷综合久久 | 亚洲一二三四五六区| 粉嫩av一区二区三区免费野| 国产视频在线观看视频| 国产亚洲一区精品| 亚洲深夜视频| 国产精品v欧美精品v日韩精品| 婷婷亚洲综合| 制服丝袜综合网| 国产三级精品三级在线专区| 日本少妇毛茸茸高潮| 日韩一区二区视频在线观看| av中文资源在线| 国产成人精品一区二区| 欧美有码在线| www.av片| 成人av在线电影| 久久免费精彩视频| 欧美xxx久久| 97超碰资源站在线观看| 成人在线视频福利| 国产精品久久久久无码av| 亚洲一区二区蜜桃| 国产欧美一区二区精品忘忧草| 成年人视频在线免费看| 日韩成人av一区| 高清精品在线| 久久久久无码国产精品一区| 国产人成精品一区二区三| 91丨porny丨对白| 午夜久久久久久久久| 天堂成人在线| 热久久99这里有精品| 免费国产自久久久久三四区久久| 精品少妇在线视频| 91丝袜美腿高跟国产极品老师| 日本少妇毛茸茸高潮| 日韩电影大片中文字幕| 免费在线小视频| 欧美亚洲精品日韩| 奇米色777欧美一区二区| 色www亚洲国产阿娇yao| 欧美日韩高清一区二区不卡| fc2ppv国产精品久久| 999日本视频| 亚洲欧洲日本一区二区三区| 星空大象在线观看免费播放| 欧美日韩人人澡狠狠躁视频| 神马久久高清| 国产欧美日韩亚洲精品| 久久久9色精品国产一区二区三区| 一区二区久久精品| 一区二区三区av电影| 午夜视频www| 国产精品色午夜在线观看| 亚洲成av人电影| 野战少妇38p| 色诱视频网站一区| 日本在线免费| 成人一区二区在线| 天堂一区二区在线免费观看| 中文字幕在线观看2018| 亚洲成人999| 欧美日韩精品免费观看视完整| 亚洲欧洲另类精品久久综合| 国产精品一级在线| 在线观看日本视频| 久久精品最新地址| 欧美freesex8一10精品| 我看黄色一级片| 亚洲综合另类小说| 你懂得在线网址| 69堂成人精品视频免费| 国产日韩一区二区三区在线| 欧美88888| 精品在线小视频| 九九九九九九精品任你躁| 欧美女人性生活视频| 亚洲欧洲日韩综合一区二区| 午夜影院免费体验区| 国产欧美日韩精品丝袜高跟鞋| 黄色工厂这里只有精品| 日韩影视一区二区三区| 欧美mv和日韩mv的网站| 日韩制服一区| 成人午夜精品久久久久久久蜜臀| 国产精品嫩草影院com| 三级无遮挡在线观看| 91在线精品播放|