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

血淚教訓,八個線程池最佳實踐和坑

開發 前端
線程池和 ThreadLocal?共用,可能會導致線程從ThreadLocal?獲取到的是舊值/臟數據。這是因為線程池會復用線程對象,與線程對象綁定的類的靜態屬性 ThreadLocal? 變量也會被重用,這就導致一個線程可能獲取到其他線程的ThreadLocal 值。

1. 正確聲明線程池

線程池必須手動通過 ThreadPoolExecutor 的構造函數來聲明,避免使用Executors 類創建線程池,會有 OOM 風險。

Executors 返回線程池對象的弊端如下(后文會詳細介紹到):

  • FixedThreadPool 和 SingleThreadExecutor :使用的是無界的 LinkedBlockingQueue,任務隊列最大長度為 Integer.MAX_VALUE,可能堆積大量的請求,從而導致 OOM。
  • CachedThreadPool :使用的是同步隊列 SynchronousQueue, 允許創建的線程數量為 Integer.MAX_VALUE ,可能會創建大量線程,從而導致 OOM。
  • ScheduledThreadPool 和 SingleThreadScheduledExecutor : 使用的無界的延遲阻塞隊列DelayedWorkQueue,任務隊列最大長度為 Integer.MAX_VALUE,可能堆積大量的請求,從而導致 OOM。

說白了就是:使用有界隊列,控制線程創建數量。

除了避免 OOM 的原因之外,不推薦使用 Executors提供的兩種快捷的線程池的原因還有:

  • 實際使用中需要根據自己機器的性能、業務場景來手動配置線程池的參數比如核心線程數、使用的任務隊列、飽和策略等等。
  • 我們應該顯示地給我們的線程池命名,這樣有助于我們定位問題。

2. 監測線程池運行狀態

你可以通過一些手段來檢測線程池的運行狀態比如 SpringBoot 中的 Actuator 組件。

除此之外,我們還可以利用 ThreadPoolExecutor 的相關 API 做一個簡陋的監控。從下圖可以看出, ThreadPoolExecutor提供了獲取線程池當前的線程數和活躍線程數、已經執行完成的任務數、正在排隊中的任務數等等。

圖片圖片

下面是一個簡單的 Demo。printThreadPoolStatus()會每隔一秒打印出線程池的線程數、活躍線程數、完成的任務數、以及隊列中的任務數。

/**
 * 打印線程池的狀態
 *
 * @param threadPool 線程池對象
 */
public static void printThreadPoolStatus(ThreadPoolExecutor threadPool) {
    ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(1, createThreadFactory("print-images/thread-pool-status", false));
    scheduledExecutorService.scheduleAtFixedRate(() -> {
        log.info("=========================");
        log.info("ThreadPool Size: [{}]", threadPool.getPoolSize());
        log.info("Active Threads: {}", threadPool.getActiveCount());
        log.info("Number of Tasks : {}", threadPool.getCompletedTaskCount());
        log.info("Number of Tasks in Queue: {}", threadPool.getQueue().size());
        log.info("=========================");
    }, 0, 1, TimeUnit.SECONDS);
}

3. 建議不同類別的業務用不同的線程池

很多人在實際項目中都會有類似這樣的問題:我的項目中多個業務需要用到線程池,是為每個線程池都定義一個還是說定義一個公共的線程池呢?

一般建議是不同的業務使用不同的線程池,配置線程池的時候根據當前業務的情況對當前線程池進行配置,因為不同的業務的并發以及對資源的使用情況都不同,重心優化系統性能瓶頸相關的業務。

我們再來看一個真實的事故案例!

圖片圖片

上面的代碼可能會存在死鎖的情況,為什么呢?畫個圖給大家捋一捋。

試想這樣一種極端情況:假如我們線程池的核心線程數為 n,父任務(扣費任務)數量為 n,父任務下面有兩個子任務(扣費任務下的子任務),其中一個已經執行完成,另外一個被放在了任務隊列中。由于父任務把線程池核心線程資源用完,所以子任務因為無法獲取到線程資源無法正常執行,一直被阻塞在隊列中。父任務等待子任務執行完成,而子任務等待父任務釋放線程池資源,這也就造成了 "死鎖"

圖片圖片

解決方法也很簡單,就是新增加一個用于執行子任務的線程池專門為其服務(也就是所謂的線程隔離)。

4. 別忘記給線程池命名

初始化線程池的時候需要顯示命名(設置線程池名稱前綴),有利于定位問題。

默認情況下創建的線程名字類似 pool-1-thread-n 這樣的,沒有業務含義,不利于我們定位問題。

給線程池里的線程命名通常有下面兩種方式:

  • 利用 guava 的 ThreadFactoryBuilder
ThreadFactory threadFactory = new ThreadFactoryBuilder()
                        .setNameFormat(threadNamePrefix + "-%d")
                        .setDaemon(true).build();
ExecutorService threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MINUTES, workQueue, threadFactory)
  • 自己實現 ThreadFactor
/**
 * 線程工廠,它設置線程名稱,有利于我們定位問題
 */
public final class NamingThreadFactory implements ThreadFactory {

    private final AtomicInteger threadNum = new AtomicInteger();
    private final ThreadFactory delegate;
    private final String name;

    /**
     * 創建一個帶名字的線程池生產工廠
     */
    public NamingThreadFactory(ThreadFactory delegate, String name) {
        this.delegate = delegate;
        this.name = name; // TODO consider uniquifying this
    }

    @Override
    public Thread newThread(Runnable r) {
        Thread t = delegate.newThread(r);
        t.setName(name + " [#" + threadNum.incrementAndGet() + "]");
        return t;
    }

}

5. 正確配置線程池參數

我們先來看一下各種書籍和博客上一般推薦的配置線程池參數的方式,可以作為參考!

常規操作

很多人甚至可能都會覺得把線程池配置過大一點比較好!我覺得這明顯是有問題的。就拿我們生活中非常常見的一例子來說:并不是人多就能把事情做好,增加了溝通交流成本。你本來一件事情只需要 3 個人做,你硬是拉來了 6 個人,會提升做事效率嘛?我想并不會。 線程數量過多的影響也是和我們分配多少人做事情一樣,對于多線程這個場景來說主要是增加了上下文切換成本。不清楚什么是上下文切換的話,可以看我下面的介紹。

上下文切換:

多線程編程中一般線程的個數都大于 CPU 核心的個數,而一個 CPU 核心在任意時刻只能被一個線程使用,為了讓這些線程都能得到有效執行,CPU 采取的策略是為每個線程分配時間片并輪轉的形式。當一個線程的時間片用完的時候就會重新處于就緒狀態讓給其他線程使用,這個過程就屬于一次上下文切換。概括來說就是:當前任務在執行完 CPU 時間片切換到另一個任務之前會先保存自己的狀態,以便下次再切換回這個任務時,可以再加載這個任務的狀態。任務從保存到再加載的過程就是一次上下文切換。

上下文切換通常是計算密集型的。也就是說,它需要相當可觀的處理器時間,在每秒幾十上百次的切換中,每次切換都需要納秒量級的時間。所以,上下文切換對系統來說意味著消耗大量的 CPU 時間,事實上,可能是操作系統中時間消耗最大的操作。

Linux 相比與其他操作系統(包括其他類 Unix 系統)有很多的優點,其中有一項就是,其上下文切換和模式切換的時間消耗非常少。

類比于實現世界中的人類通過合作做某件事情,我們可以肯定的一點是線程池大小設置過大或者過小都會有問題,合適的才是最好。

  • 如果我們設置的線程池數量太小的話,如果同一時間有大量任務/請求需要處理,可能會導致大量的請求/任務在任務隊列中排隊等待執行,甚至會出現任務隊列滿了之后任務/請求無法處理的情況,或者大量任務堆積在任務隊列導致 OOM。這樣很明顯是有問題的,CPU 根本沒有得到充分利用。
  • 如果我們設置線程數量太大,大量線程可能會同時在爭取 CPU 資源,這樣會導致大量的上下文切換,從而增加線程的執行時間,影響了整體執行效率。

有一個簡單并且適用面比較廣的公式:

  • CPU 密集型任務(N+1): 這種任務消耗的主要是 CPU 資源,可以將線程數設置為 N(CPU 核心數)+1。比 CPU 核心數多出來的一個線程是為了防止線程偶發的缺頁中斷,或者其它原因導致的任務暫停而帶來的影響。一旦任務暫停,CPU 就會處于空閑狀態,而在這種情況下多出來的一個線程就可以充分利用 CPU 的空閑時間。
  • I/O 密集型任務(2N): 這種任務應用起來,系統會用大部分的時間來處理 I/O 交互,而線程在處理 I/O 的時間段內不會占用 CPU 來處理,這時就可以將 CPU 交出給其它線程使用。因此在 I/O 密集型任務的應用中,我們可以多配置一些線程,具體的計算方法是 2N。

如何判斷是 CPU 密集任務還是 IO 密集任務?

CPU 密集型簡單理解就是利用 CPU 計算能力的任務比如你在內存中對大量數據進行排序。但凡涉及到網絡讀取,文件讀取這類都是 IO 密集型,這類任務的特點是 CPU 計算耗費時間相比于等待 IO 操作完成的時間來說很少,大部分時間都花在了等待 IO 操作完成上。

拓展一下:

線程數更嚴謹的計算的方法應該是:最佳線程數 = N(CPU 核心數)?(1+WT(線程等待時間)/ST(線程計算時間)),其中 WT(線程等待時間)=線程運行總時間 - ST(線程計算時間)。

線程等待時間所占比例越高,需要越多線程。線程計算時間所占比例越高,需要越少線程。

我們可以通過 JDK 自帶的工具 VisualVM 來查看 WT/ST 比例。

CPU 密集型任務的 WT/ST 接近或者等于 0,因此, 線程數可以設置為 N(CPU 核心數)?(1+0)= N,和我們上面說的 N(CPU 核心數)+1 差不多。

IO 密集型任務下,幾乎全是線程等待時間,從理論上來說,你就可以將線程數設置為 2N(按道理來說,WT/ST 的結果應該比較大,這里選擇 2N 的原因應該是為了避免創建過多線程吧)。

公示也只是參考,具體還是要根據項目實際線上運行情況來動態調整。我在后面介紹的美團的線程池參數動態配置這種方案就非常不錯,很實用!

動態線程池

美團技術團隊在**《Java 線程池實現原理及其在美團業務中的實踐》這篇文章中介紹到對線程池參數實現可自定義配置的思路和方法。

美團技術團隊的思路是主要對線程池的核心參數實現自定義可配置。這三個核心參數是:

  • corePoolSize : 核心線程數線程數定義了最小可以同時運行的線程數量。
  • maximumPoolSize : 當隊列中存放的任務達到隊列容量的時候,當前可以同時運行的線程數量變為最大線程數。
  • workQueue: 當新任務來的時候會先判斷當前運行的線程數量是否達到核心線程數,如果達到的話,新任務就會被存放在隊列中。

為什么是這三個參數?

如何支持參數動態配置? 且看 ThreadPoolExecutor 提供的下面這些方法。

圖片圖片

格外需要注意的是corePoolSize, 程序運行期間的時候,我們調用 setCorePoolSize()這個方法的話,線程池會首先判斷當前工作線程數是否大于corePoolSize,如果大于的話就會回收工作線程。

另外,你也看到了上面并沒有動態指定隊列長度的方法,美團的方式是自定義了一個叫做 ResizableCapacityLinkedBlockIngQueue 的隊列(主要就是把LinkedBlockingQueue的 capacity 字段的 final 關鍵字修飾給去掉了,讓它變為可變的)。

最終實現的可動態修改線程池參數效果如下

動態配置線程池參數最終效果動態配置線程池參數最終效果

如果我們的項目也想要實現這種效果的話,可以借助現成的開源項目:

  • Hippo-4 :一款強大的動態線程池框架,解決了傳統線程池使用存在的一些痛點比如線程池參數沒辦法動態修改、不支持運行時變量的傳遞、無法執行優雅關閉。除了支持動態修改線程池參數、線程池任務傳遞上下文,還支持通知報警、運行監控等開箱即用的功能。
  • Dynamic TP :輕量級動態線程池,內置監控告警功能,集成三方中間件線程池管理,基于主流配置中心(已支持 Nacos、Apollo,Zookeeper、Consul、Etcd,可通過 SPI 自定義實現)。

6. 線程池使用的一些小坑

重復創建線程池的坑

線程池是可以復用的,一定不要頻繁創建線程池比如一個用戶請求到了就單獨創建一個線程池。

@GetMapping("wrong")
public String wrong() throws InterruptedException {
    // 自定義線程池
    ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,1L,TimeUnit.SECONDS,new ArrayBlockingQueue<>(100),new ThreadPoolExecutor.CallerRunsPolicy());

    //  處理任務
    executor.execute(() -> {
      // ......
    }
    return "OK";
}

出現這種問題的原因還是對于線程池認識不夠,需要加強線程池的基礎知識。

Spring 內部線程池的坑

使用 Spring 內部線程池時,一定要手動自定義線程池,配置合理的參數,不然會出現生產問題(一個請求創建一個線程)。

@Configuration
@EnableAsync
public class ThreadPoolExecutorConfig {

    @Bean(name="threadPoolExecutor")
    public Executor threadPoolExecutor(){
        ThreadPoolTaskExecutor threadPoolExecutor = new ThreadPoolTaskExecutor();
        int processNum = Runtime.getRuntime().availableProcessors(); // 返回可用處理器的Java虛擬機的數量
        int corePoolSize = (int) (processNum / (1 - 0.2));
        int maxPoolSize = (int) (processNum / (1 - 0.5));
        threadPoolExecutor.setCorePoolSize(corePoolSize); // 核心池大小
        threadPoolExecutor.setMaxPoolSize(maxPoolSize); // 最大線程數
        threadPoolExecutor.setQueueCapacity(maxPoolSize * 1000); // 隊列程度
        threadPoolExecutor.setThreadPriority(Thread.MAX_PRIORITY);
        threadPoolExecutor.setDaemon(false);
        threadPoolExecutor.setKeepAliveSeconds(300);// 線程空閑時間
        threadPoolExecutor.setThreadNamePrefix("test-Executor-"); // 線程名字前綴
        return threadPoolExecutor;
    }
}

線程池和 ThreadLocal 共用的坑

線程池和 ThreadLocal共用,可能會導致線程從ThreadLocal獲取到的是舊值/臟數據。這是因為線程池會復用線程對象,與線程對象綁定的類的靜態屬性 ThreadLocal 變量也會被重用,這就導致一個線程可能獲取到其他線程的ThreadLocal 值。

不要以為代碼中沒有顯示使用線程池就不存在線程池了,像常用的 Web 服務器 Tomcat 處理任務為了提高并發量,就使用到了線程池,并且使用的是基于原生 Java 線程池改進完善得到的自定義線程池。

當然了,你可以將 Tomcat 設置為單線程處理任務。不過,這并不合適,會嚴重影響其處理任務的速度。

server.tomcat.max-threads = 1

解決上述問題比較建議的辦法是使用阿里巴巴開源的 TransmittableThreadLocal(TTL)。TransmittableThreadLocal類繼承并加強了 JDK 內置的InheritableThreadLocal類,在使用線程池等會池化復用線程的執行組件情況下,提供ThreadLocal值的傳遞功能,解決異步執行時上下文傳遞的問題。

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2024-08-26 08:29:55

2025-09-05 07:28:34

2025-06-06 02:00:00

2019-01-15 10:29:48

物聯網IOTIT

2023-08-03 00:06:21

2011-01-13 15:37:25

vSphere備份

2024-12-06 10:46:03

2015-09-17 09:01:26

創業智能硬件

2022-03-23 14:46:28

安全IT網絡安全

2024-08-09 13:49:56

2023-03-02 12:11:21

2023-07-31 10:56:20

2023-05-15 08:24:46

2023-05-23 14:39:06

2009-12-09 10:16:42

ibmdwSOA

2023-09-12 14:03:44

2012-12-20 10:32:18

云時代云端集成開發環境云開發

2022-08-16 08:27:20

線程毀線程異步

2020-07-07 10:38:11

首席信息官IT領導者經驗教訓

2024-08-08 19:09:51

點贊
收藏

51CTO技術棧公眾號

gogo亚洲高清大胆美女人体| www国产黄色| 国产精品亚洲αv天堂无码| 日中文字幕在线| 日本亚洲视频在线| 另类专区欧美制服同性| 农村末发育av片一区二区| 日本不卡网站| 中文字幕欧美三区| 成人免费看片网址| 无码人妻丰满熟妇区五十路 | 欧美四级电影网| 国产精品啪啪啪视频| 青青青草原在线| 国产精品资源在线看| 日本一本a高清免费不卡| 亚洲二区在线播放| 九九亚洲视频| 日韩欧美高清在线| 美女在线视频一区二区| av女在线播放| 国产精品电影院| 欧洲视频一区二区三区| 丰满人妻一区二区三区免费| 琪琪一区二区三区| 26uuu久久噜噜噜噜| 免费成人深夜夜行网站| 欧洲亚洲视频| 精品噜噜噜噜久久久久久久久试看| 日本男人操女人| 欧美大胆a人体大胆做受| 亚洲欧美日韩电影| 亚洲欧洲精品在线| 黄色av网址在线免费观看| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 日韩av手机在线播放| 九色精品蝌蚪| 欧美性大战久久| 亚洲中文字幕久久精品无码喷水| 成人影院在线视频| 亚洲在线观看免费视频| 91麻豆精品国产91久久久使用方法| 亚洲一区中文字幕在线观看| 精品成人无码久久久久久| 亚洲伦理一区| 欧美激情在线观看| 久草视频在线资源| 亚洲精品在线观看91| 日韩在线视频二区| 免费看的黄色录像| 日本午夜一区| 日韩在线视频国产| 国产精品免费在线视频| 日韩电影一区| 日韩视频免费观看| 波多野结衣亚洲一区二区| 亚洲不卡av不卡一区二区| 色婷婷久久av| 亚洲波多野结衣| 亚洲国产老妈| 欧美成人高清视频| 午夜免费激情视频| 欧美日韩亚洲一区| 国语自产精品视频在线看抢先版图片 | 久久综合中文字幕| 欧美二级三级| 超碰国产在线观看| 亚洲色图在线播放| 成人av在线播放观看| 高清电影在线免费观看| 精品国产乱码久久久久久虫虫漫画 | 91久久国产综合久久91猫猫| 成人黄色一级视频| 精品日产一区2区三区黄免费| 少妇人妻一区二区| 久久毛片高清国产| 亚洲综合首页| 性欧美1819sex性高清大胸| 亚洲自拍与偷拍| 人妻av中文系列| 欧美舌奴丨vk视频| 欧美精品tushy高清| 亚洲国产日韩在线一区| 加勒比中文字幕精品| 国产香蕉精品视频一区二区三区| 青青青视频在线播放| 欧美成人精品| 26uuu久久噜噜噜噜| 亚洲网站免费观看| 国产成人av福利| 欧美连裤袜在线视频| 日韩黄色影院| 欧美日韩国产在线| 亚洲精品免费一区亚洲精品免费精品一区 | 亚洲精品成a人| 99视频在线免费播放| 福利一区视频| 亚洲成人黄色在线| 国产精品久久久久久成人| 国产精品vip| 国产精品国产三级国产aⅴ9色 | 亚洲国产成人精品女人久久久| 好吊视频在线观看| 欧美暴力喷水在线| 国产精品视频色| 手机福利在线| 亚洲综合丝袜美腿| 美女网站视频黄色| 日韩有码一区| 欧美极品美女视频网站在线观看免费| 久草视频一区二区| 国产999精品久久久久久| 日韩少妇中文字幕| 蜜桃视频在线网站| 日韩免费电影网站| 国产中文字幕久久| 亚洲免费中文| 精品久久精品久久| 日本h片在线观看| 欧美日韩不卡视频| 白白色免费视频| 99日韩精品| 国产精品成人观看视频免费| 午夜免费视频在线国产| 日韩欧美亚洲范冰冰与中字| 五月天丁香社区| 91精品国产91久久久久久密臀| 国产91在线播放| 五月婷婷六月丁香| 亚洲国产精品人人做人人爽| 婷婷激情小说网| 欧美电影《轻佻寡妇》| 国产精品91久久久久久| 天天av综合网| 调教+趴+乳夹+国产+精品| 日本美女视频网站| 欧美视频亚洲视频| 91成人免费视频| 国产黄a三级三级三级av在线看| 欧美三片在线视频观看| 日本少妇高潮喷水xxxxxxx| 国产日韩高清一区二区三区在线| 国产精品av一区| heyzo中文字幕在线| 日韩视频免费观看高清在线视频| 欧美大片xxxx| 国产精品一二一区| 国产专区在线视频| 美女精品久久| 欧美精品国产精品日韩精品| 成人毛片在线免费观看| 亚洲影视在线播放| 亚洲av成人片无码| 99成人在线| 久久久久高清| 色婷婷综合久久久中字幕精品久久| 亚洲精品日韩久久久| 中文字字幕在线中文| 99riav一区二区三区| 日本免费不卡一区二区| 日韩三级av| 国产精欧美一区二区三区| 国产高清视频免费最新在线| 欧美私人免费视频| 精品国产乱码久久久久久鸭王1| 国产成人亚洲综合a∨猫咪| 免费在线看黄色片| 日韩高清电影免费| 国产精品91免费在线| 黄色精品在线观看| 精品久久久久av影院| 久久久久久久久久影院| 久久精品日产第一区二区三区高清版 | 丝袜诱惑制服诱惑色一区在线观看| 日本精品一区二区三区视频 | 久久久亚洲人| 一区二区三区四区五区精品| 清纯唯美激情亚洲| 91av福利视频| av网站大全在线观看| 欧美一区二区高清| 欧美福利视频一区二区| 日本一二三不卡| 一级全黄裸体片| 久久精品一区二区国产| 最新精品视频| 色橹橹欧美在线观看视频高清| 国产精品视频地址| 日本三级在线观看网站| 亚洲色图18p| 精品国产av 无码一区二区三区| 狠狠久久五月精品中文字幕| sm捆绑调教视频| av中文字幕亚洲| 亚洲欧美自偷自拍另类| 亚洲激情影院| 影音先锋欧美在线| 日韩母乳在线| 亚洲999一在线观看www| 欧美日韩视频免费观看| 欧美插天视频在线播放| 国产女主播在线直播| 精品女同一区二区| 中文字幕人妻丝袜乱一区三区| 亚洲宅男天堂在线观看无病毒| 日本乱子伦xxxx| 成人爽a毛片一区二区免费| 性猛交ⅹ×××乱大交| 国产精品美女久久久浪潮软件| 中文字幕一区二区三区四区五区人| 巨人精品**| 99电影网电视剧在线观看| www成人在线视频| 91精品国产乱码久久久久久久久 | 色88888久久久久久影院| 96国产粉嫩美女| 午夜av成人| 欧美自拍大量在线观看| 日本高清在线观看视频| 久久精品视频播放| 成年女人的天堂在线| 亚洲欧美日韩成人| 欧美熟女一区二区| 日韩欧美色电影| 亚洲天堂男人网| 欧美专区亚洲专区| 国产精品久免费的黄网站| 依依成人综合视频| 亚洲国产123| 国产精品久久久久永久免费观看| 最新中文字幕视频| 91丨九色丨尤物| 国产高清成人久久| 丁香激情综合国产| 国产人妻精品午夜福利免费| 国产主播一区二区三区| 在线观看免费不卡av| 日韩精品免费视频人成| 国产精品99久久免费黑人人妻| 午夜在线一区二区| 欧美变态另类刺激| 一区二区三区高清视频在线观看| 国产亚洲黄色片| 黄色亚洲在线| 黄色大片在线免费看| 伊人久久久大香线蕉综合直播| 制服丝袜综合日韩欧美| 婷婷综合五月| 男女激烈动态图| 你懂的一区二区| 欧美狂野激情性xxxx在线观| 国产主播精品| 亚洲不卡中文字幕无码| 宅男噜噜噜66国产日韩在线观看| 欧美牲交a欧美牲交| 亚洲专区免费| 精品免费国产一区二区| 日本不卡中文字幕| 五月天开心婷婷| 国产成人免费视频一区| 你懂的在线观看网站| 91在线视频在线| 精品人妻中文无码av在线 | 午夜欧美一区二区三区免费观看| 激情综合网五月| 在线免费一区| 亚洲一级高清| 亚洲中文字幕无码中文字| 美女黄色成人网| 午夜免费福利视频在线观看| 国产精品影视在线| 手机免费看av片| 久久精品欧美日韩| 婷婷激情四射网| 亚洲电影一区二区| 久久人人爽人人爽人人片av免费| 欧美日韩在线精品一区二区三区激情| 91精品人妻一区二区三区果冻| 欧美tickling网站挠脚心| 丝袜+亚洲+另类+欧美+变态| 国产亚洲欧美另类中文| av免费在线免费观看| 91av在线视频观看| 国产黄色精品| 国产精品一区二区三区精品| 欧美激情在线精品一区二区三区| 中文字幕在线亚洲三区| aa级大片欧美三级| 亚洲国产日韩欧美在线观看| 成人福利视频网站| 亚洲精品国产精品国自| 亚洲一区二区三区中文字幕| 国产免费a视频| 日韩精品一区国产麻豆| 国产在线高清| 亚洲成av人片一区二区梦乃| 7777奇米亚洲综合久久| 成人午夜大片| 亚洲精品成人久久久998| 亚洲一级一区| 日本中文字幕观看| 2023国产精品视频| 校园春色 亚洲| 欧美在线播放高清精品| 亚洲第一黄色片| 最近2019中文字幕一页二页| yellow在线观看网址| 国产综合视频在线观看| 婷婷成人综合| www.日本在线视频| 久久99精品国产91久久来源| 精品少妇人妻一区二区黑料社区| 亚洲日穴在线视频| 中文字幕免费高清网站| 亚洲精品一区二区三区香蕉| 日本综合在线| 国产精品男女猛烈高潮激情| 日韩大片在线免费观看| 日韩成人三级视频| 国产一区二区精品在线观看| 国产伦理片在线观看| 大伊人狠狠躁夜夜躁av一区| www黄色在线观看| 久久视频国产精品免费视频在线| 日韩电影av| 久久综合入口| 国产欧美日韩综合一区在线播放 | www.欧美日韩| 国产a免费视频| 91麻豆精品国产| 色多多视频在线观看| 国产精品电影观看| 国产成人一区| 日本男人操女人| 国产日韩欧美精品一区| www.久久精品视频| 亚洲精品中文字| 在线成人av观看| 91福利在线看| 中国毛片在线观看| 精品久久久久久久久久久久| 亚洲第九十九页| 国内精品一区二区三区四区| 国产精品qvod| 国产一区二区四区| 不卡的av在线| 亚洲精品77777| 亚洲国产欧美日韩精品| 91美女主播在线视频| 国产精品一区二区三区不卡| 亚洲神马久久| 大黑人交xxx极品hd| 一本一本大道香蕉久在线精品 | 国产精品第5页| 亚洲欧美自拍一区| 草民电影神马电影一区二区| 亚洲精品免费在线看| 精品一区二区三区视频在线观看| 黄大色黄女片18免费| 欧美电影影音先锋| 18在线观看的| 国产乱码精品一区二区三区卡 | 成人羞羞动漫| 热久久久久久久久| 一区二区三区免费在线观看| 韩国av免费在线观看| 欧洲一区二区视频| 日韩av自拍| 国产在线a视频| 精品福利在线视频| www.黄在线观看| 91精品国产高清久久久久久91裸体 | 国产精品久久久久9999爆乳| eeuss影院一区二区三区 | 午夜在线视频观看日韩17c| 一区二区三区伦理片| 7777精品久久久大香线蕉| 91精品久久| 欧美日本韩国国产| 久久99久久99小草精品免视看| 18精品爽视频在线观看| 亚洲免费av电影| 免费视频成人| 国产精彩视频一区二区| 中文字幕第一区二区| 国产高清视频免费| 青青久久av北条麻妃黑人 | 欧妇女乱妇女乱视频| 91亚洲国产成人精品一区二三| 亚洲 国产 日韩 欧美| 欧美成人在线免费视频| 亚洲亚洲免费| 国产欧美一区二区三区不卡高清| 欧美片第一页| eeuss中文| 久久亚洲综合av| 国产精品怡红院| 日本a级片电影一区二区| 亚洲v在线看| 亚洲一级片在线播放|