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

來聊聊守護線程和 JVM 的優(yōu)雅關(guān)閉

開發(fā)
本文我們的虛擬機鉤子、守護線程、finalize三個角度針對Java程序優(yōu)雅關(guān)閉的哲學(xué)進行一些實踐演示和建議,希望對你有幫助。

本文原本是針對守護線程的一些探討,感覺知識點稍顯淺薄,故基于原有文章進行迭代補充對于Java程序優(yōu)雅關(guān)閉的一些思考。

一、JVM中的關(guān)閉

1. 詳解虛擬機鉤子

在Java進程開發(fā)中,對于重量級的系統(tǒng)資源關(guān)閉或者進程資源整理或信號輸出,常常會通過Java內(nèi)置的addShutdownHook方法注冊回調(diào)函數(shù),確保在Java進程關(guān)閉不再使用這些資源時將其釋放,例如hutool這個工具類對應(yīng)連接池的管理工具GlobalDSFactory,其底層就會在類加載初始化時利用addShutdownHook注冊一個連接池銷毀的回調(diào)函數(shù):

/*
  * 設(shè)置在JVM關(guān)閉時關(guān)閉所有數(shù)據(jù)庫連接
  */
 static {
  // JVM關(guān)閉時關(guān)閉所有連接池
  Runtime.getRuntime().addShutdownHook(new Thread() {
   @Override
   public void run() {
    if (null != factory) {
     factory.destroy();
     StaticLog.debug("DataSource: [{}] destroyed.", factory.dataSourceName);
     factory = null;
    }
   }
  });
 }

而虛擬機鉤子注冊的原理本質(zhì)上就是在調(diào)用addShutdownHook時,其底層將這個現(xiàn)場hook注冊到一個hooks的map容器中,并在shutdown的時候遍歷調(diào)用這些hook線程:

對應(yīng)的我們也給出addShutdownHook的實現(xiàn),可以看到其底層就是調(diào)用ApplicationShutdownHooks來注冊hook:

public void addShutdownHook(Thread hook) {
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("shutdownHooks"));
        }
        ApplicationShutdownHooks.add(hook);
    }

而步入這個add方法后可以看到其內(nèi)部本質(zhì)上就是在必要的校驗后,存入到hooks這個map中:

private static IdentityHashMap<Thread, Thread> hooks;

static synchronized void add(Thread hook) {
        if(hooks == null)
            throw new IllegalStateException("Shutdown in progress");

        if (hook.isAlive())
            throw new IllegalArgumentException("Hook already running");

        if (hooks.containsKey(hook))
            throw new IllegalArgumentException("Hook previously registered");

        hooks.put(hook, hook);
    }

當(dāng)觸發(fā)虛擬機鉤子關(guān)閉時,其內(nèi)部就會針對hooks進行遍歷并按照如下邏輯處理:

  • 將hook線程啟動,執(zhí)行hook邏輯
  • 調(diào)用join確保該hook能夠準(zhǔn)確執(zhí)行完成
static void runHooks() {
        Collection<Thread> threads;
        synchronized(ApplicationShutdownHooks.class) {
            threads = hooks.keySet();
            hooks = null;
        }
  //遍歷hook線程啟動
        for (Thread hook : threads) {
            hook.start();
        }
        for (Thread hook : threads) {
            while (true) {
                try {
                //調(diào)用join加入主線程確保當(dāng)前線程能夠正確執(zhí)行完成
                    hook.join();
                    break;
                } catch (InterruptedException ignored) {
                }
            }
        }
    }

當(dāng)所有關(guān)閉鉤子都執(zhí)行結(jié)束時,如果runFinalizersOnExit為true,那么JVM就會運行終結(jié)器finalizers,此時JVM并不會停止或者關(guān)閉仍然在運行的應(yīng)用線程。直到最終JVM結(jié)束,應(yīng)用線程才會被關(guān)閉,對應(yīng)的我們可以在源碼Shutdown的exit方法印證:

static void exit(int status) {
        boolean runMoreFinalizers = false;
        synchronized (lock) {
             //......
            case FINALIZERS:
                if (status != 0) {
                    /* Halt immediately on nonzero status */
                    halt(status);
                } else {
                   //......
                   //將runFinalizersOnExit賦值給runMoreFinalizers 
                    runMoreFinalizers = runFinalizersOnExit;
                }
                break;
            }
        }
        //如果runMoreFinalizers 為true,則運行終結(jié)器
        if (runMoreFinalizers) {
            runAllFinalizers();
            halt(status);
        }
        //......
    }

2. 虛擬機鉤子串行化使用

需要注意的虛擬機鉤子注冊后的調(diào)用時機,當(dāng)JVM執(zhí)行關(guān)閉鉤子的時候,如果守護或者非守護線程也在運行,那么虛擬機鉤子就可能和這些線程并發(fā)的執(zhí)行,即虛擬機鉤子可能會并行的執(zhí)行一些工作,所以對于一些存在依賴性的共享數(shù)據(jù)操作,虛擬機鉤子要慎重使用。

例如我們用虛擬機鉤子將日志服務(wù)關(guān)閉,此時如果另外的虛擬機鉤子需要使用日志打印,可能就會報錯:

例如我們的日志框架LogService ,本質(zhì)上就是對于文件流的寫入和關(guān)閉:

static class LogService {

        private static final BufferedWriter writer = FileUtil.getWriter("F:\\tmp\\log.txt", Charset.defaultCharset(), true);

        @SneakyThrows
        public void log(String msg) {//將數(shù)據(jù)寫入日志中
            writer.write(msg);
        }


        public void close() {
            try {
                writer.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

如下圖所說,若在虛擬機鉤子上注冊關(guān)閉打印和關(guān)閉日志框架的鉤子,就有可能出現(xiàn)打印鉤子拋出stream close的錯誤:

LogService logService = new LogService();



        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            //拋出stream close的錯誤
            logService.log("hello world");
        }));

        /**
         * 注冊虛擬機鉤子
         */
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            //執(zhí)行一些應(yīng)用程序的資源關(guān)閉
            logService.close();
        }));

總的來說,使用虛擬機鉤子必須注意:

  • 虛擬機鉤子要保證線程安全,即針對共享資源做好同步把控
  • 虛擬機鉤子盡量串行化執(zhí)行,且鉤子之間不可以有任何依賴
  • 關(guān)閉鉤子應(yīng)該盡快的退出,因為它直接的決定的JVM退出的結(jié)束時間

二、守護線程

1. 守護線程的基本概念

很多人對守護線程都不陌生,對于守護線程大部分讀者都停留在JDK官方文檔所介紹的概念:

The Java Virtual Machine exits when the only threads running are all daemon threads.

文檔的意思是當(dāng)JVM中不存在任何一個正在運行的非守護線程時,JVM進程會直接退出。

讀起來很拗口對不對,沒關(guān)系,本文就會基于幾個代碼示例,讓你更深層次的理解守護線程。在此之前,讀者不妨自測一下,下面這幾道面試題:

  • 守護線程和普通線程有什么區(qū)別?
  • 守護線程默認(rèn)優(yōu)先級是多少?
  • 若父線程為守護線程,在其內(nèi)部創(chuàng)建一個普通線程,父線程停止,子線程是否也會停止呢?
  • 如何創(chuàng)建守護線程池?
  • 守護線程使用有哪些注意事項?

2. 守護線程和普通線程的區(qū)別

要了解區(qū)別就先來了解一下兩者的使用,非守護線程,也就我們?nèi)粘?chuàng)建的普通線程,可以看到這段代碼創(chuàng)建了一個普通線程,在無限循環(huán)的定時輸出內(nèi)容,而主線程僅僅是輸出一段文字后就不做任何動作了。

public static void main(String[] args) {

        Thread t = new Thread(() -> {
            while (true) {
                log.info("普通線程執(zhí)行了......");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        t.start();
       log.info("主線程運行結(jié)束");


    }

對應(yīng)的輸出結(jié)果如下,可以看到,即使主線程停止運行了,而非守護線程也仍然會在運行,也就是JDK官方文檔的字面含義,普通線程不停止,JVM就不停止運行:

12:44:57.022 [Thread-0] INFO com.sharkChili.webTemplate.Main - 普通線程執(zhí)行了......
12:44:57.022 [main] INFO com.sharkChili.webTemplate.Main - 主線程運行結(jié)束
12:45:02.031 [Thread-0] INFO com.sharkChili.webTemplate.Main - 普通線程執(zhí)行了......

基于上述代碼,用setDaemon(true)將該線程設(shè)置為守護線程:

public static void main(String[] args) {
        Thread t = new Thread(() -> {
            while (true) {
                log.info("守護線程執(zhí)行了......");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        //設(shè)置當(dāng)前線程為守護線程
        t.setDaemon(true);
        t.start();
        log.info("主線程運行結(jié)束");
    }

輸出結(jié)果如下,可以看到隨著主線程的消亡,守護線程也會隨之停止,不再運行,自此我相信讀者可以理解JDK官方文檔所說的那句話了,只要有一個普通線程在,JVM就不會退出,只要所有普通線程停止工作,JVM自動退出,守護線程也會自動結(jié)束。

12:44:23.239 [Thread-0] INFO com.sharkChili.webTemplate.Main - 守護線程執(zhí)行了......
12:44:23.239 [main] INFO com.sharkChili.webTemplate.Main - 主線程運行結(jié)束

3. 守護線程和普通線程優(yōu)先級的區(qū)別

我們可以通過getPriority方法查看兩者的區(qū)別:

public static void main(String[] args) {

        Thread t = new Thread(() -> {

            log.info("守護線程優(yōu)先級:{}", Thread.currentThread().getPriority());
        });

        //設(shè)置當(dāng)前線程為守護線程
        t.setDaemon(true);
        t.start();
        log.info("主線程運行結(jié)束,當(dāng)前線程運行優(yōu)先級:{}", Thread.currentThread().getPriority());


    }

從輸出結(jié)果來看,兩者的優(yōu)先級是一樣的,都為5:

12:54:36.344 [main] INFO com.sharkChili.webTemplate.Main - 主線程運行結(jié)束,當(dāng)前線程運行優(yōu)先級:5
12:54:36.344 [Thread-0] INFO com.sharkChili.webTemplate.Main - 守護線程優(yōu)先級:5

4. 父守護線程問題

我們創(chuàng)建了一個守護線程,在其runnable實現(xiàn)中創(chuàng)建一個子線程:

public static void main(String[] args) {

        Thread parentThread = new Thread(() -> {
            Thread childThread = new Thread(() -> {
                while (true) {
                    log.info("子線程運行中,是否為守護線程:{}",Thread.currentThread().isDaemon());
                    try {
                        TimeUnit.HOURS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            });

            childThread.start();

            log.info("parentThread守護線程運行中");
        });

        //設(shè)置當(dāng)前線程為守護線程
        parentThread.setDaemon(true);
        parentThread.start();
        log.info("主線程運行結(jié)束");


    }

從輸出結(jié)果來看,父線程為守護線程時,其內(nèi)部創(chuàng)建的子線程也為守護線程,所以隨著父線程的銷毀,子線程也會同步銷毀。

00:05:56.869 [Thread-1] INFO com.sharkChili.webTemplate.Main - 子線程運行中,是否為守護線程:true
00:05:56.869 [main] INFO com.sharkChili.webTemplate.Main - 主線程運行結(jié)束
00:05:56.869 [Thread-0] INFO com.sharkChili.webTemplate.Main - parentThread守護線程運行中

5. 守護線程池的創(chuàng)建

public static void main(String[] args) {

        ExecutorService threadPool = Executors.newFixedThreadPool(10, ThreadFactoryBuilder.create()
                .setNamePrefix("worker-")
                .setDaemon(true)
                .build());
        threadPool.execute(()->{
            while (true){
                try {
                    log.info("守護線程運行了");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });


        log.info("主線程退出");


    }

6. 守護線程的使用場景

因為守護線程擁有自動結(jié)束自己生命周期的特性,當(dāng)JVM中沒有一個普通線程運行時,JVM會退出,即所有守護線程會自動停止,所以守護線程的使用場景可以有以下幾種:

  • 垃圾回收線程就是典型的守護線程,在后臺進行垃圾對象回收的工作。
  • 非核心業(yè)務(wù)工作可交由守護線程,例如:各類信息統(tǒng)計、服務(wù)監(jiān)控等,一旦進程結(jié)束運行則這些守護線程停止工作。

7. 守護線程注意事項

  • 復(fù)雜計算、資源回收這種不建議使用守護線程。
  • setDaemon要在start方法前面,否者該設(shè)置會不生效。

三、finalize關(guān)閉的哲學(xué)

1. 基本介紹

針對一些系統(tǒng)資源例如文件句柄或者套接字句柄,當(dāng)不需要它們時,垃圾回收器定義了finalize方法進行一些資源關(guān)閉,一旦垃圾回收器回收這些對象之后,對應(yīng)的資源就會調(diào)用finalize釋放。

例如FileInputStream的finalize方法,它就會檢查當(dāng)前文件句柄是否非空,然后顯示的調(diào)用一下close方法:

protected void finalize() throws IOException {
        if ((fd != null) &&  (fd != FileDescriptor.in)) {
           //關(guān)閉文件句柄
            close();
        }
    }

2. 終結(jié)器注意事項和正確資源關(guān)閉姿勢

需要注意的finalize在JVM運行中可能會執(zhí)行也可能不會執(zhí)行,JVM對此無法做出保證,所以它運行時存著極端的不確定性,所以進行資源關(guān)閉時,我們非常不建議使用finalize。

正確的一些系統(tǒng)資源關(guān)閉回收,筆者更建議是使用階段采用try-with-resource手動關(guān)閉資源:

//使用try-with-resource手動關(guān)閉資源
try(BufferedReader reader = FileUtil.getUtf8Reader("filePahth")){
            System.out.println(reader.readLine());
        }catch (Exception e){
            //異常處理
        }
責(zé)任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關(guān)推薦

2021-01-19 10:35:49

JVM場景函數(shù)

2022-04-11 08:17:07

JVMJava進程

2021-03-28 09:17:18

JVM場景鉤子函數(shù)

2025-06-11 08:20:00

JVM線程代碼

2024-11-13 16:37:00

Java線程池

2024-10-14 14:28:19

支付系統(tǒng)設(shè)計

2023-12-20 10:04:45

線程池Java

2024-08-07 08:22:27

2023-09-01 08:59:57

2024-02-04 09:00:00

向量查詢數(shù)據(jù)檢索MyScale

2021-05-06 08:11:03

Java用戶線程守護線程

2020-02-24 21:43:36

avaJVM 級鎖線程安全

2024-02-21 08:19:54

2023-10-20 08:00:55

PodRainbow部署

2024-04-24 12:34:08

Spring事務(wù)編程

2023-07-14 12:28:07

JVM優(yōu)化操作

2021-04-20 08:00:31

Redisson關(guān)閉訂單支付系統(tǒng)

2025-01-13 06:00:00

Go語言gRPC

2022-10-12 09:01:52

Linux內(nèi)核線程

2025-07-23 07:09:38

點贊
收藏

51CTO技術(shù)棧公眾號

亚洲精品综合在线观看| 国产精品人成电影在线观看| 精品亚洲视频在线| 丝袜美腿av在线| 丁香五精品蜜臀久久久久99网站| 亚洲国产成人精品视频| 国产一区二区免费在线观看| 在线观看国产亚洲| 成人免费在线播放| 精品国产一二三区| 热久久精品免费视频| 91高清在线观看视频| 99精品视频一区| 国产日韩欧美在线看| 精品无码久久久久久久| 久久成人av| 日韩视频不卡中文| 青青在线免费观看视频| 黄页网站在线| 国产精品嫩草99a| 国产一区在线免费| 一本色道久久综合无码人妻| 亚洲精选在线| 久久影院免费观看| 真实乱视频国产免费观看| 日本色护士高潮视频在线观看| 99久久精品免费精品国产| 国产欧美精品在线| 久久久成人免费视频| 欧美91福利在线观看| 伊人久久综合97精品| 久久黄色片视频| 一区二区三区精品国产| 一二三四国产精品| 婷婷成人影院| 欧美r级在线观看| 黄瓜视频免费观看在线观看www| 免费观看国产精品| 韩国视频一区二区| 国产精品v片在线观看不卡| 免费在线一级片| 亚洲a在线视频| 欧美精品视频www在线观看| 色综合久久久久久久久五月| 中国a一片一级一片| 91久久综合| 欧美理论电影在线播放| 亚洲精品国产精品乱码在线观看| 网红女主播少妇精品视频| 欧美电视剧在线看免费| 一级 黄 色 片一| 四虎国产精品免费久久| 精品视频在线看| 色悠悠久久综合网| 日韩欧美一区二区三区在线观看 | 暖暖视频在线免费观看| 成人性生交大合| 成人综合色站| 丰满少妇高潮在线观看| 国产成人免费视频精品含羞草妖精| 成人国产精品免费视频| 成熟的女同志hd| 一区二区三区国产好| 91精品国产免费| 特黄特黄一级片| 亚洲一区二区三区在线免费| 日韩精品自拍偷拍| 亚洲欧美日韩偷拍| 日韩激情啪啪| 亚洲欧美中文字幕| 欧美老女人性生活视频| 久久中文字幕二区| 欧美大尺度在线观看| 精品国产av色一区二区深夜久久 | www.爱色av.com| www在线看| 五月天视频一区| 免费在线观看的av网站| 日韩在线影院| 国产精品久久一级| 蜜桃视频成人在线观看| 欧美bbbxxxxx| 狠狠操狠狠色综合网| 别急慢慢来1978如如2| 免费视频观看成人| 日韩欧美一级二级三级| xxxx黄色片| 日韩精品水蜜桃| 欧美大胆a视频| 国产成人自拍视频在线| 欧美aaaaa成人免费观看视频| 成人网在线免费观看| 欧美天堂在线视频| 国产欧美日韩综合| 国内精品视频免费| 国产人成在线观看| 亚洲精品ww久久久久久p站| 一区二区传媒有限公司| 欧美a视频在线| 欧美精品一区男女天堂| 成人做爰69片免网站| 欧美日韩亚洲一区三区| 国产91在线播放九色快色| 免费无遮挡无码永久在线观看视频 | 在线亚洲欧美| 成人免费高清完整版在线观看| 丁香花免费高清完整在线播放| 久久精品人人做| 国产区二精品视| aⅴ在线视频男人的天堂 | 国产无遮挡aaa片爽爽| 久久久久久婷| 成人精品一二区| av在线首页| 无码av免费一区二区三区试看| 日日噜噜夜夜狠狠| 美女av一区| 精品视频一区二区三区在线观看| 欧美亚洲动漫精品| 在线观看免费视频黄| 久久免费av| 51精品在线观看| 性欧美18一19性猛交| 欧美国产在线观看| 国内自拍在线观看| 亚洲桃色在线一区| 一本一道久久a久久精品综合 | 久久av资源网站| 亚洲天堂视频网站| 丁香一区二区三区| 女同性恋一区二区| 精品裸体bbb| 亚洲欧美国产一区二区三区| 国产亚洲精品av| 国内外成人在线视频| 日本福利一区二区三区| 成人ssswww在线播放| 日韩欧美的一区二区| 精品少妇一区二区三区密爱| 日韩在线一区二区三区| 久久精品第九区免费观看| 国产三级伦理在线| 日韩欧美的一区二区| 真实国产乱子伦对白在线| 久久丁香综合五月国产三级网站 | 999视频精品| 国产精品户外野外| 欧洲综合视频| 成人黄页在线观看| 韩国精品一区二区三区六区色诱| 国产盗摄在线观看| 6080午夜不卡| 疯狂试爱三2浴室激情视频| 奇米色一区二区三区四区| 成人黄色免费片| caoporn国产精品免费视频| 在线看一区二区| 精品人妻中文无码av在线| 久久久久久久尹人综合网亚洲| 免费久久久一本精品久久区| 国产污视频在线| 欧美午夜性色大片在线观看| 亚洲一区二区三区无码久久| 一区二区福利| 欧美日韩亚洲在线| 日本韩国欧美| 在线日本欧美| 欧美精品一区二区三区蜜臀 | 亚洲综合精品自拍| 亚洲色图欧美另类| 亚洲免费精品| 欧美午夜精品久久久久久蜜| 日韩欧美一区二区三区在线观看| 最近2019中文字幕大全第二页| 中文字幕av资源| 亚洲免费在线视频一区 二区| 性生交大片免费看l| 婷婷精品在线观看| 欧美一级片一区| 国产高清一区在线观看| 欧美久久久久久久久中文字幕| 一级黄色录像视频| 91在线免费视频观看| av天堂永久资源网| 手机在线电影一区| 成人国产1314www色视频| 色黄视频在线观看| 欧美精品第一页| 久久久久黄色片| 久久影院视频免费| 不用播放器的免费av| 在线看片欧美| 亚洲精品国产精品久久| 97一区二区国产好的精华液| 欧美综合国产精品久久丁香| 午夜伦全在线观看| 精品对白一区国产伦| 天天干,天天干| 一区二区三区91| 美女久久久久久久久久| 国产一区二区0| 爱福利视频一区二区| 91精品亚洲| 欧美亚洲精品日韩| 999久久久精品一区二区| 日韩av电影在线网| 欧美xxxx视频| 自拍偷拍亚洲在线| 污污的视频网站在线观看| 欧美日韩亚州综合| 毛片基地在线观看| 亚洲免费在线视频一区 二区| 精品少妇人妻一区二区黑料社区| 精品在线观看视频| 欧美日韩亚洲一二三| 亚洲中无吗在线| 日韩欧美三级一区二区| 欧美影视资讯| 久久免费福利视频| 女人18毛片水真多18精品| 欧美天堂一区二区三区| 91精品国产一区| 国产原创av在线| 亚洲精品一区二区三区精华液 | 国产精品一区二区三区在线| 欧美日韩伦理一区二区| 日本高清+成人网在线观看| 亚洲性图自拍| 久久国产精品久久国产精品| 成年人在线观看| 亚洲精品一区在线观看香蕉 | 亚洲欧美福利视频| 欧美一级做性受免费大片免费| 777久久久精品| 看黄色一级大片| 欧美性xxxxhd| 久久久精品免费看| 亚洲妇女屁股眼交7| 国产波霸爆乳一区二区| 自拍偷在线精品自拍偷无码专区 | 91.com视频| 中文字幕一区二区人妻痴汉电车| 欧美日韩在线观看视频| 国产乡下妇女做爰毛片| 亚洲一区二区在线播放相泽| 一区二区视频免费看| 亚洲三级视频在线观看| 手机在线中文字幕| 中文字幕亚洲电影| 极品美妇后花庭翘臀娇吟小说| 国产精品毛片久久久久久| 欧美一区二区三区粗大| 国产精品污www在线观看| 国产视频三区四区| 国产精品情趣视频| 天天操天天摸天天舔| 国产精品久久久久久久午夜片| 黄色激情小视频| 国产精品国产馆在线真实露脸| 人妻无码一区二区三区免费| 中文字幕的久久| 自拍偷拍你懂的| 中文字幕亚洲不卡| 9999热视频| 亚洲一区电影777| 日韩欧美一区二区一幕| 丁香五六月婷婷久久激情| 欧美一区二区三区网站| 欧美中文字幕一区二区三区 | 男人天堂资源网| 国产精品久99| 欧美成人免费看| 精品欧美激情精品一区| 国产精品无码一区| 给我免费播放日韩视频| 欧美理论电影在线播放| 菠萝蜜视频在线观看www入口| 久久久久久中文| 爱情电影社保片一区| 国产精品爽黄69天堂a| 激情久久免费视频| 精品一区二区日本| 国精一区二区| 黄黄视频在线观看| 国产日韩欧美高清免费| 在线免费视频a| 国产大片一区二区| 男男做爰猛烈叫床爽爽小说| 国产亚洲精品7777| 91视频综合网| 狠狠久久五月精品中文字幕| 一炮成瘾1v1高h| 亚洲福利精品在线| av免费观看一区二区| 欧美大片大片在线播放| av综合电影网站| 亚洲综合成人婷婷小说| 日韩成人av在线资源| 中国成人在线视频| 在线综合亚洲| 中文字幕日韩综合| 91在线观看一区二区| 亚洲少妇xxx| 欧美日韩一区二区精品| 国产一区二区三区成人| 日韩精品中文字幕视频在线| 黄色免费网站在线观看| 欧美亚洲伦理www| 欧美电影在线观看一区| 欧洲久久久久久| 影音先锋中文字幕一区二区| 国产成人黄色网址| 99久久婷婷国产综合精品| 亚洲欧美日本一区二区三区| 成人av在线资源网| 三级黄色在线观看| 一本到三区不卡视频| 亚洲AV无码乱码国产精品牛牛| 国产一区二区三区在线观看网站 | 久久久国产一区二区三区| 性爽视频在线| 成人午夜影院在线观看| 99re66热这里只有精品8| 亚洲性生活网站| 91麻豆国产精品久久| 中文字幕高清视频| 亚洲自拍偷拍图区| 96日本xxxxxⅹxxx17| 亚洲欧美一区二区三区情侣bbw| segui88久久综合| 2020国产精品久久精品不卡| 色999日韩| 999精品视频在线| 久久只精品国产| 国产精品视频久久久久久久| 精品国产成人系列| a级在线免费观看| 一区二区三区中文| 欧美三级午夜理伦三级| 成人黄色一级视频| 精品处破女学生| 欧美大胆人体bbbb| 性国产高清在线观看| 91嫩草在线视频| 91亚洲精品视频在线观看| 手机在线视频你懂的| 久久国产精品99久久久久久老狼| 国产美女免费网站| 在线视频一区二区三区| 国模吧精品人体gogo| 欧美自拍视频在线| 中文有码一区| 午夜dv内射一区二区| 国产欧美一区在线| 欧美在线视频精品| 日韩中文在线不卡| 91精品国产一区二区在线观看| 一区二区三区电影| 国产精品自拍三区| 免费日韩在线视频| 亚洲电影av在线| 三级在线观看视频| 日本一区视频在线播放| 日韩成人dvd| 免费成人深夜夜行网站| 91精品福利在线一区二区三区| 国产黄a三级三级三级av在线看| 亚洲japanese制服美女| 欧美精品一卡| 99久久免费看精品国产一区| 欧美日韩国产色| 国产青青草在线| 成人免费xxxxx在线观看| 欧美激情91| 成年人在线观看av| 欧美亚洲高清一区| 亚洲丝袜精品| 久久久久久久免费| 麻豆91在线播放| 免费看一级一片| 亚洲人成免费电影| 91麻豆精品| 国产免费黄色av| 国产精品麻豆视频| 高清乱码毛片入口| 国产不卡在线观看| 99精品在线观看| 亚洲少妇18p| 欧美色图免费看| 精精国产xxxx视频在线中文版| 精品国产乱码久久久久久108| 青椒成人免费视频| 国产在线拍揄自揄拍| 亚洲人成在线观看| 日韩激情综合| 欧美私人情侣网站| aaa亚洲精品| 国产一级片一区二区| 久久久免费精品视频| 欧美一区2区|