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

一文搞懂ThreadLocal原理

開發(fā) 前端
ThreadLocal是一種多線程編程的工具,可以幫助我們在多線程環(huán)境中管理線程本地的變量。它通過ThreadLocal實例和ThreadLocalMap的組合實現(xiàn)了這一功能。

大家好,我是了不起。

ThreadLocal相信大家都用過,但你知道他的原理嗎,今天了不起帶大家學(xué)習(xí)ThreadLocal。

ThreadLocal是什么

在多線程編程中,經(jīng)常會遇到需要在不同線程中共享數(shù)據(jù)的情況。通常情況下,為了保證線程安全,我們需要使用鎖或其他同步機(jī)制。然而,有些情況下,我們希望在每個線程中都有一份獨立的數(shù)據(jù)副本,這就是ThreadLocal派上用場的地方。

ThreadLocal翻譯過來就是線程本地,也就是本地線程變量,意思是ThreadLocal中填充的變量屬于當(dāng)前線程,該變量對其他線程而言是隔離的。ThreadLocal提供了一種機(jī)制,允許我們?yōu)槊總€線程創(chuàng)建獨立的變量,每個線程都可以獨立訪問自己的變量,而不會干擾其他線程的數(shù)據(jù)。ThreadLocal為變量在每個線程中都創(chuàng)建了一個副本,那么每個線程可以訪問自己內(nèi)部的副本變量,各個線程間互不影響,從而實現(xiàn)線程安全。

ThreadLocal的原理

ThreadLocal的原理涉及到兩個重要概念:ThreadLocal實例和ThreadLocalMap。

1. ThreadLocal實例

每個ThreadLocal對象實際上是一個容器,用于存儲線程本地的變量副本。每個線程都可以擁有自己的ThreadLocal實例,這些實例可以存儲不同的數(shù)據(jù),互相之間互不影響。

2. ThreadLocalMap

ThreadLocalMap是ThreadLocal的底層數(shù)據(jù)結(jié)構(gòu),它是一個哈希表。每個線程都有一個與之相關(guān)聯(lián)的ThreadLocalMap,用于存儲該線程所擁有的ThreadLocal實例以及對應(yīng)的值。ThreadLocalMap中的鍵是ThreadLocal實例,值是該線程對應(yīng)ThreadLocal實例的變量副本。

當(dāng)我們調(diào)用ThreadLocal的set()方法設(shè)置值時,實際上是在當(dāng)前線程的ThreadLocalMap中以ThreadLocal實例為鍵,將值存儲在對應(yīng)的位置。而調(diào)用get()方法時,則是從當(dāng)前線程的ThreadLocalMap中根據(jù)ThreadLocal實例獲取對應(yīng)的值。

ThreadLocal怎么用,應(yīng)用場景

public static void main(String[] args) {
   IntStream.range(1, 5).forEach(i -> new Thread(() -> {
       // 設(shè)置線程中本地變量的值
       threadLocal.set("thread-" + i);
       // 打印當(dāng)前線程中本地內(nèi)存中本地變量的值
       System.out.println(threadLocal.get());
       // 清除本地內(nèi)存中的本地變量
       threadLocal.remove();
       // 打印本地變量
       System.out.println("thread-" + i + " after remove: " + threadLocal.get());
   }).start());
}
/*
thread-1
thread-4
thread-4 after remove: null
thread-2
thread-3
thread-2 after remove: null
thread-1 after remove: null
thread-3 after remove: null
*/

從結(jié)果可以看到,每一個線程都有各自的值,并且互不影響。

應(yīng)用場景

  1. 用戶訪問之后,在本地線程保存用戶的身份信息,在本次訪問過程中,可以隨時獲取用戶的身份信息以驗證身份。
  2. 在進(jìn)行對象跨層傳遞的時候,使用ThreadLocal可以避免多次傳遞,打破層次間的約束。
  3. 數(shù)據(jù)庫連接管理:每個線程可以擁有自己的數(shù)據(jù)庫連接,避免了線程之間的數(shù)據(jù)庫連接混淆。
  4. 用戶身份管理:在Web應(yīng)用中,可以將用戶身份信息存儲在ThreadLocal中,以便在整個請求處理過程中方便地訪問。
  5. 事務(wù)管理:將事務(wù)狀態(tài)存儲在ThreadLocal中,確保每個線程都能獨立管理自己的事務(wù)狀態(tài)。

ThreadLocal源碼分析

先看一下 ThreadLocal 和 Thread 的關(guān)系

圖片圖片

Thread類中有一個threadLocals屬性,是ThreadLocal內(nèi)部類ThreadLocalMap類型的變量,ThreadLocalMap可以看作是一個HashMap,其內(nèi)部有一個內(nèi)部類為 Entry,繼承了WeakReference<ThreadLocal<?>>,是一個弱引用。Entry的key是ThreadLocal<?>,value是Object類型的值。

大致了解了Thread和ThreadLocal的關(guān)系之后,看一下Thread Local的源碼:我們只要看其主要的幾個方法,就可以完全了解ThreadLocal的原理了。

set方法

public void set(T value) {
    // 獲取當(dāng)前線程
    Thread t = Thread.currentThread();
    // 通過當(dāng)前線程獲取線程中的ThreadLocal.ThreadLocalMap對象
    ThreadLocalMap map = getMap(t);
    if (map != null)
        // map不為空,則直接賦值
        map.set(this, value);
    else
        // map為空,則創(chuàng)建一個ThreadLocalMap對象
        createMap(t, value);
}
// 根據(jù)提供的線程對象,和指定的值,創(chuàng)建一個ThreadLocalMap對象
void createMap(Thread t, T firstValue) {
    t.threadLocals = new ThreadLocalMap(this, firstValue);
}
// threadLocals是Thread類的一個屬性
ThreadLocalMap getMap(Thread t) {
    return t.threadLocals;
}

/*
Thread 類 182行
 // ThreadLocal values pertaining to this thread. This map is maintained by the ThreadLocal class.
 與該線程有關(guān)的ThreadLocal值。這個映射由ThreadLocal類維護(hù)
    ThreadLocal.ThreadLocalMap threadLocals = null;
*/

get方法

// ThreadLocalMap中的內(nèi)部類,存放key,value
static class Entry extends WeakReference<ThreadLocal<?>> {
    // 與此ThreadLocal關(guān)聯(lián)的值
    Object value;
 // k:ThreadLocal的引用,被傳遞給WeakReference的構(gòu)造方法
    Entry(ThreadLocal<?> k, Object v) {
        super(k);
        value = v;
    }
}

public T get() {
    // 獲取當(dāng)前線程
    Thread t = Thread.currentThread();
    // 通過當(dāng)前線程獲取線程中的ThreadLocal.ThreadLocalMap對象
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        // map不為空,通過this(當(dāng)前對象,即ThreadLocal對象)獲取Entry對象
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            // Entry不為空,則直接返回Entry中的value值
            return result;
        }
    }
    // 如果map或Entry為空,則返回初始值-null
    return setInitialValue();
}
// 設(shè)置初始值,初始化ThreadLocalMap對象,并設(shè)置value為 null
private T setInitialValue() {
    // 初始化值,此方法返回 null
    T value = initialValue();
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
    return value;
}

remove方法

public void remove() {
    // 通過當(dāng)前線程獲取線程中的ThreadLocal.ThreadLocalMap對象
    ThreadLocalMap m = getMap(Thread.currentThread());
    if (m != null)
        // 移除對象
        m.remove(this);
}
// 根據(jù)key,刪除對應(yīng)的所有值
private void remove(ThreadLocal<?> key) {
    Entry[] tab = table;
    int len = tab.length;
    // 獲取key對應(yīng)的 Entry[] 下標(biāo)
    int i = key.threadLocalHashCode & (len-1);
    for (Entry e = tab[i];
         e != null;
         // 獲取下一個Entry對象
         e = tab[i = nextIndex(i, len)]) {
        if (e.get() == key) {
            e.clear();
            // 通過重新哈希位于staleSlot和下一個null插槽之間的任何可能沖突的條目,來清除陳舊的條目。這還會清除尾隨null之前遇到的所有其他過時的條目,防止出現(xiàn)內(nèi)存泄漏問題
            expungeStaleEntry(i);
            return;
        }
    }
}

總結(jié):

  1. 每個Thread維護(hù)著一個ThreadLocalMap的引用
  2. ThreadLocalMap是ThreadLocal的內(nèi)部類,用Entry來進(jìn)行存儲
  3. ThreadLocal創(chuàng)建的副本是存儲在自己的threadLocals中的,也就是自己的ThreadLocalMap。
  4. ThreadLocalMap的鍵為ThreadLocal對象,而且可以有多個threadLocal變量,因此保存在map中
  5. 在進(jìn)行g(shù)et之前,必須先set,否則會報空指針異常,當(dāng)然也可以初始化一個,但是必須重寫initialValue()方法。
  6. ThreadLocal本身并不存儲值,它只是作為一個key來讓線程從ThreadLocalMap獲取value。

注意事項

雖然ThreadLocal在某些情況下非常有用,但過度使用它也可能導(dǎo)致內(nèi)存泄漏問題。因為ThreadLocalMap中的數(shù)據(jù)只有在線程結(jié)束時才會被釋放,如果沒有正確地清理ThreadLocal實例,就可能會導(dǎo)致無限制的數(shù)據(jù)積累。

另外,ThreadLocal不適合在并發(fā)量非常大的情況下使用,因為每個線程都會創(chuàng)建自己的變量副本,可能會導(dǎo)致內(nèi)存消耗過大。

ThreadLocal內(nèi)存泄漏問題

在上面的代碼中,我們可以看出,當(dāng)前ThreadLocal的引用k被傳遞給WeakReference的構(gòu)造函數(shù),所以ThreadLocalMap中的key為ThreadLocal的弱引用。

如果當(dāng)前線程一直存在且沒有調(diào)用該ThreadLocal的remove方法,如果這個時候別的地方還有對ThreadLocal的引用,那么當(dāng)前線程中的ThreadLocalMap中會存在對ThreadLocal變量的引用和value對象的引用,是不會釋放的,會造成內(nèi)存泄漏。

ThreadLocalMap中的Entry的key使用的是ThreadLocal對象的弱引用,在沒有其他地方對ThreadLoca依賴,ThreadLocalMap中的ThreadLocal對象就會被回收掉,但是對應(yīng)的value值不會被回收,這個時候Map中就可能存在key為null但是value不為null的項,也會造成內(nèi)存泄漏。

小結(jié)

ThreadLocal是一種多線程編程的工具,可以幫助我們在多線程環(huán)境中管理線程本地的變量。它通過ThreadLocal實例和ThreadLocalMap的組合實現(xiàn)了這一功能。

使用ThreadLocal時需要注意內(nèi)存泄漏和性能問題,確保合理使用。

使用完ThreadLocal后,一定執(zhí)行remove操作,避免出現(xiàn)內(nèi)存泄漏情況。

責(zé)任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2021-01-13 05:21:59

參數(shù)

2024-07-12 14:46:20

2021-07-08 10:08:03

DvaJS前端Dva

2023-09-22 10:45:47

云原生云計算

2023-12-15 15:55:24

Linux線程同步

2024-04-12 12:19:08

語言模型AI

2022-03-24 08:51:48

Redis互聯(lián)網(wǎng)NoSQL

2021-03-22 10:05:59

netstat命令Linux

2023-09-15 12:00:01

API應(yīng)用程序接口

2021-04-27 19:21:48

HBase原理開源

2020-04-15 16:30:24

掃碼登錄微信前端

2023-04-03 15:04:00

RPCPHP語言

2023-08-24 16:50:45

2024-06-05 11:43:10

2019-11-19 08:00:00

神經(jīng)網(wǎng)絡(luò)AI人工智能

2021-06-30 08:45:02

內(nèi)存管理面試

2022-06-07 10:13:22

前端沙箱對象

2022-08-15 15:39:23

JavaScript面向?qū)ο?/a>數(shù)據(jù)

2020-03-18 14:00:47

MySQL分區(qū)數(shù)據(jù)庫

2023-10-16 08:16:31

Bean接口類型
點贊
收藏

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

av毛片在线| aaa人片在线| 久久久久九九精品影院| 亚洲一二三区在线观看| 久久国产精品精品国产色婷婷| 亚洲永久精品在线观看| 久久神马影院| 亚洲国产成人精品久久久国产成人一区| 浮妇高潮喷白浆视频| av网站在线免费观看| 国产成人在线免费观看| 日本高清视频精品| 波多野结衣不卡视频| 校花撩起jk露出白色内裤国产精品| 欧美日韩一区二区在线视频| 99在线精品免费视频| 蜜桃av在线免费观看| 成人av在线资源| 国产一区红桃视频| 亚洲精品男人天堂| 国产精品videosex极品| 中文欧美在线视频| 日本三级日本三级日本三级极| 51一区二区三区| 亚洲www啪成人一区二区麻豆| 亚洲va韩国va欧美va精四季| 天天干天天操av| 黄一区二区三区| 国产91精品高潮白浆喷水| 97在线观看免费高| 精品美女视频| 亚洲国产成人久久| 巨乳女教师的诱惑| 日韩在线你懂得| 欧美在线看片a免费观看| 大胆欧美熟妇xx| 老司机午夜在线视频| 国产欧美精品一区| 日本欧美色综合网站免费| 国模人体一区二区| 国产电影一区二区三区| 成人网欧美在线视频| 中文字幕人妻精品一区| 噜噜噜91成人网| 国产91av在线| 国产成人精品a视频一区| 欧美日韩国产色综合一二三四| 中文字幕日韩综合av| 中文字幕一二三四区| 久久亚洲黄色| 亚洲第一区第一页| 成人性生活免费看| 青青视频一区二区| 亚洲国产精品福利| 国产精品果冻传媒| 成人在线超碰| 精品99999| 亚洲高清无码久久| 秋霞在线一区| 亚洲男人天堂网站| 欧美人与性囗牲恔配| 精品72久久久久中文字幕| 国产午夜精品美女视频明星a级| 久久久久久久久久久国产精品| 亚洲春色h网| 国产亚洲欧洲在线| 精品伦精品一区二区三区视频密桃| av资源久久| 色久欧美在线视频观看| 91杏吧porn蝌蚪| 国产精品a级| 97高清免费视频| 黄色片网站在线免费观看| 亚洲欧美视频一区二区三区| 国产精品91久久久| 一区二区三区免费在线| 国产二区国产一区在线观看| 国产一区在线免费观看| 青青青草网站免费视频在线观看| 久久精品人人做人人爽97| 亚洲美女网站18| 亚洲欧美成人影院| 欧美日韩国产中文字幕| 麻豆一区二区三区视频| 久久天堂久久| 日韩成人中文电影| 色噜噜噜噜噜噜| 欧美高清日韩| 亲子乱一区二区三区电影| 精人妻无码一区二区三区| 久久国产麻豆精品| 999在线观看免费大全电视剧| 天天操天天舔天天干| 国产精品美女视频| 日韩视频在线视频| 国产亚洲人成a在线v网站 | 亚洲人精品午夜在线观看| 国产91丝袜美女在线播放| 中文字幕人成人乱码| 88国产精品欧美一区二区三区| 成人黄色三级视频| 国产精品99久久久久久似苏梦涵| 久久99欧美| 日韩中字在线观看| 国产一区二区三区三区在线观看| 国产精品私房写真福利视频| 99亚洲精品| 中文字幕久热精品在线视频 | 粉嫩欧美一区二区三区高清影视| 欧美日韩在线播放一区二区| 快射av在线播放一区| 欧美视频13p| 男人午夜视频在线观看| 国产剧情一区| 欧美激情在线观看视频| 伊人久久一区二区| xnxx国产精品| 国产精品视频一二三四区| 成人全视频在线观看在线播放高清| 精品欧美一区二区三区精品久久| 国产精品综合激情| 国产精品久久久亚洲一区| 91情侣偷在线精品国产| 国产一区二区三区福利| 精品久久久视频| 中文字幕乱码在线人视频| 成人嘿咻视频免费看| 清纯唯美亚洲综合| 人人妻人人玩人人澡人人爽| 亚洲男同性恋视频| 亚洲一二三av| 日产精品一区二区| 国产成人精品免高潮费视频| 五月天福利视频| 亚洲在线免费播放| 永久av免费在线观看| 99re66热这里只有精品8| 国产97在线亚洲| 亚洲 欧美 激情 另类| 亚洲一区二区在线免费看| 一区二区三区国产好的精华液| 欧美r级电影| 国产精品高潮视频| av每日在线更新| 91福利视频网站| 波多野吉衣中文字幕| 久久高清免费观看| 日本成人黄色免费看| 日韩电影大全网站| 国产午夜一区二区| 亚洲 小说区 图片区| 亚洲国产成人午夜在线一区| 一区二区三区 日韩| 青草国产精品| 91免费国产网站| av大全在线| 日韩视频永久免费| 国产精品99精品无码视| 成人免费黄色在线| 免费国产a级片| 亚洲人成亚洲精品| 国产精品扒开腿爽爽爽视频| 91美女视频在线| 欧美电影一区二区| 少妇影院在线观看| 成人国产一区二区三区精品| 国产69精品久久久久久久| 亚洲警察之高压线| 日韩女优人人人人射在线视频| xxxxx日韩| 欧美精品日韩精品| 久久久精品国产sm调教| 成人av免费在线播放| 国产男女无遮挡| 国产中文精品久高清在线不| 国产欧美一区二区三区久久| 成人福利片网站| 欧美mv日韩mv亚洲| 欧美一级特黄视频| 国产精品日韩精品欧美在线| 久久精品无码一区二区三区毛片| 亚洲福利国产| 日韩欧美精品一区二区| 国产精品色婷婷在线观看| 久久久伊人欧美| 国产在线你懂得| 91精品国产黑色紧身裤美女| 动漫精品一区一码二码三码四码| 91麻豆精品在线观看| 污版视频在线观看| 最新国产乱人伦偷精品免费网站| 欧美日韩精品免费看| 伊人久久大香| 97久久精品人搡人人玩| 日本在线免费网| 亚洲国内高清视频| 一级α片免费看刺激高潮视频| 一区二区三区中文免费| 色噜噜日韩精品欧美一区二区| 看片网站欧美日韩| 日本十八禁视频无遮挡| 国产精品99久久| 久久66热这里只有精品| 亚洲狼人综合| 青青草精品毛片| 欧美hdxxxxx| 中文字幕日韩视频| 五月婷婷六月色| 91精品国产福利| 精品一区二三区| 亚欧色一区w666天堂| 中国一级片在线观看| 久久午夜电影网| zjzjzjzjzj亚洲女人| 久久99精品国产麻豆婷婷洗澡| 久色视频在线播放| 欧美va亚洲va日韩∨a综合色| 日产中文字幕在线精品一区 | 久久久精品有限公司| 成人免费91| 国产精品久久久久久亚洲调教| heyzo高清在线| 久久久999国产精品| 超碰免费在线| 日韩成人在线视频网站| 亚洲经典一区二区| 欧美一区二区三区四区久久 | 精品福利在线导航| 国产日韩免费视频| 欧美精品精品一区| 亚洲性猛交富婆| 日本高清成人免费播放| 久久艹精品视频| 亚洲人成人一区二区在线观看| 三年中国中文观看免费播放| 91免费观看视频| 一级特级黄色片| 成人毛片老司机大片| 中国老熟女重囗味hdxx| 国产麻豆9l精品三级站| 182午夜视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲爆乳无码专区| 久久激情婷婷| 无遮挡又爽又刺激的视频| 午夜一级在线看亚洲| 国产素人在线观看| 99热免费精品| 国产精品沙发午睡系列| 制服诱惑一区二区| 国产精品秘入口18禁麻豆免会员| 在线视频观看日韩| 激情伊人五月天| 国产精品综合| 北条麻妃在线一区| 秋霞国产午夜精品免费视频| 波多结衣在线观看| 久久精品国产99久久6| 在线看免费毛片| 国产在线精品一区在线观看麻豆| 免费成人黄色大片| 国产福利91精品| 日本道中文字幕| 久久久久久久综合狠狠综合| 色噜噜日韩精品欧美一区二区| 国产欧美日韩激情| 一级免费黄色录像| 亚洲自拍偷拍麻豆| 激情五月色婷婷| 在线免费亚洲电影| 国产乱子伦精品无码码专区| 欧美大片一区二区三区| 五十路在线观看| 这里只有精品视频在线| www在线免费观看视频| 欧美国产一区二区三区| 2020国产在线| 国产成人免费av电影| 日韩国产大片| 国产一区不卡在线观看| 精品国产aⅴ| 先锋影音男人资源| 日韩午夜电影| 天天干天天av| 国产不卡视频一区| 国产精品成人一区二区三区电影毛片| 国产欧美日韩另类一区| 欧美日韩精品亚洲精品| 欧美性少妇18aaaa视频| 国产又粗又猛又爽又黄的视频一 | 日韩在线欧美| 毛片av在线播放| 鲁大师影院一区二区三区| 欧美精品久久久久久久久25p| 国产成人av在线影院| 欧美激情亚洲色图| 亚洲国产成人精品视频| 国产日韩在线免费观看| 欧美哺乳videos| 成人影院免费观看| 97国产成人精品视频| 欧美亚洲黄色| 欧美成人免费在线| 一区二区电影| 九九热免费精品视频| 东方欧美亚洲色图在线| 大吊一区二区三区| 精品女同一区二区三区在线播放| 91亚洲国产成人精品一区| 日韩国产欧美区| 国产成人午夜| 国产精品久久久久久久久| 国产伦精品一区二区三区免费优势| 亚洲国产欧洲综合997久久| 亚洲综合国产| 欧美一级大片免费看| 国产精品色噜噜| 波多野结衣啪啪| 亚洲国产精彩中文乱码av在线播放| 五月天婷婷在线视频| 欧美综合国产精品久久丁香| 中文字幕亚洲在线观看| 中文字幕一区二区中文字幕| 噜噜噜久久亚洲精品国产品小说| 久久性爱视频网站| 一区二区三区免费看视频| 中文字幕有码视频| 亚洲欧美中文日韩在线| 天天综合av| 激情小说综合网| 欧美91视频| 伊人久久久久久久久久久久久| 特级黄色录像片| 一本久道久久综合无码中文| 青青草国产成人a∨下载安卓| 欧美激情精品久久久久久| 四虎影视精品永久在线观看| 欧美日韩一区二| 国产精品久久久久9999高清| 极品白嫩少妇无套内谢| 成人免费在线播放视频| 伊人影院中文字幕| 一个色综合导航| 精品肉辣文txt下载| 亚州欧美一区三区三区在线 | 国产一区二区三区朝在线观看| 久久久久久国产精品免费免费| 亚洲国产三级| 亚洲午夜久久久久久久久| 亚洲综合激情小说| 懂色av成人一区二区三区| 久久久久久久网站| 加勒比视频一区| 国产在线精品91| www激情久久| 免费的毛片视频| 国产亚洲欧美一区| 成人午夜一级| 91手机视频在线| 国产福利91精品一区二区三区| 欧美成人一区二区三区高清| 精品国产青草久久久久福利| 国产盗摄在线视频网站| 国产日韩一区二区三区| 欧美亚洲三区| 亚洲性猛交xxxx乱大交| 欧美日韩久久一区| 91香蕉在线观看| 国产精品日韩高清| 国产欧美一区二区色老头| 97超碰在线资源| 欧美精品丝袜久久久中文字幕| 国产日产一区二区三区| 国产伦精品一区二区三毛| 亚洲一区久久| 色www亚洲国产阿娇yao| 日韩西西人体444www| av资源新版天堂在线| 日本免费一区二区三区| 激情图片小说一区| 国产一级片视频| 亚洲毛茸茸少妇高潮呻吟| 日韩电影精品| 久艹视频在线免费观看| 久久精品水蜜桃av综合天堂| 国产又粗又大又爽| 欧美极品美女视频网站在线观看免费| 日韩成人一级| 中文字幕永久有效| 五月激情综合网| 色老头视频在线观看| 国产一区二区无遮挡| 蜜桃av一区二区| 精品在线视频观看| 在线播放国产一区二区三区| 欧美经典影片视频网站| 成人av网站观看| 怡红院成人在线| 穿情趣内衣被c到高潮视频| 99久久精品国产一区二区三区|