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

ThreadLocal原理詳解--面試粉碎機

開發 前端
ThreadLocal不是用于解決共享變量的問題的,也不是為了協調線程同步而存在,而是為了方便每個線程處理自己的狀態而引入的一個機制。

一種解決多線程環境下成員變量的問題的方案,但是與線程同步無關,其思路是為每一個線程創建一個單獨的變量副本,從而每個線程都可以獨立地改變所擁有的變量副本,而不會影響其他線程所對應的副本;

ThreadLocal不是用于解決共享變量的問題的,也不是為了協調線程同步而存在,而是為了方便每個線程處理自己的狀態而引入的一個機制;

1、threadlocal使用

void set(Object value)

設置當前線程的線程局部變量的值

public Object get()

該方法返回當前線程所對應的線程局部變量

public void remove()

將當前線程局部變量的值刪除,目的是為了減少內存的占用,該方法是JDK 5.0新增的方法。需要指出的是,當線程結束后,對應該線程的局部變量將自動被垃圾回收,所以顯式調用該方法清除線程的局部變量并不是必須的操作,但它可以加快內存回收的速度;

創建一個ThreadLocal對象

private ThreadLocal<Integer> localInt = new ThreadLocal<>();
public int setAndGet(){
localInt.set(8);
return localInt.get();
}

設置變量的值為8

ThreadLocal里設置的值,只有當前線程自己看得見,這意味著你不可能通過其他線程為它初始化值。為了彌補這一點,ThreadLocal提供了一個withInitial()方法統一初始化所有線程的ThreadLocal的值:

private ThreadLocal<Integer> localInt = ThreadLocal.withInitial(() -> 6);

上述代碼將ThreadLocal的初始值設置為6,這對全體線程都是可見的

2、ThreadLocal源碼分析

ThreadLocal類源碼

/**
* ThreadLocals依賴于附加到每個線程的每個線程線性探測哈希映射(thread.ThreadLocals和可繼承的ThreadLocal)。
* ThreadLocal對象充當鍵,通過threadLocalHashCode進行搜索。
* 這是一個自定義哈希代碼(僅在ThreadLocalMaps中有用),在相同線程使用連續構造的ThreadLocal的常見情況下消除了沖突,
* 而在不常見的情況下保持良好的行為。
*/
private final int threadLocalHashCode = nextHashCode();
/**
* 要給出的下一個哈希代碼。原子更新。從零開始。
*/
private static AtomicInteger nextHashCode = new AtomicInteger();
/**
* 連續生成的哈希碼之間的差異-將隱式順序線程本地ID轉換為兩個大小表的冪的近似最優的乘法哈希值。
*/
private static final int HASH_INCREMENT = 0x61c88647;
/**
* 返回下一個哈希代碼。
*/
private static int nextHashCode() {
return nextHashCode.getAndAdd(HASH_INCREMENT);
}
/**
* 設置調整大小閾值,在最壞的情況下為 2/3 負載系數
*/
private void setThreshold(int len) {
threshold = len * 2 / 3;
}
/**
* 根據傳入的下標,返回下一個下標 (環形: 0-1-...-(len-1)-len-0-1-...-len)
*/
private static int nextIndex(int i, int len) {
return ((i + 1 < len) ? i + 1 : 0);
}
/**
* ThreadLocalMap 內部類
*/
static class ThreadLocalMap {
private Entry[] table;//數據數組
private int size = 0;//數組大小
private int threshold; //閾值
private static final int INITIAL_CAPACITY = 16; //默認大小
/*
* Entry 繼承WeakReference,并且用ThreadLocal作為key.
* 如果key為null(entry.get() == null),意味著key不再被引用,
* 因此這時候entry也可以從table中清除。
*/
static class Entry extends WeakReference<ThreadLocal<?>> {
Object value; //存儲線程值
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
/**
* 初始化
*/
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
table = new Entry[INITIAL_CAPACITY];
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
table[i] = new Entry(firstKey, firstValue);
size = 1;
setThreshold(INITIAL_CAPACITY);
}
}

作為一個存儲數據的類,關鍵點就在get和set方法。

(1)set 方法

//set 方法
public void set(T value) {
//獲取當前線程
Thread t = Thread.currentThread();
//實際存儲的數據結構類型
ThreadLocalMap map = getMap(t);
//如果存在map就直接set,沒有則創建map并set
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
//getMap方法
ThreadLocalMap getMap(Thread t) {
//thred中維護了一個ThreadLocalMap
return t.threadLocals;
}
//createMap
void createMap(Thread t, T firstValue) {
//實例化一個新的ThreadLocalMap,并賦值給線程的成員變量threadLocals
t.threadLocals = new ThreadLocalMap(this, firstValue);
}

  • 首先獲取當前線程,并根據當前線程獲取一個Map。
  • 如果獲取的Map不為空,則將參數設置到Map中(當前ThreadLocal的引用作為key)。
  • (這里調用了ThreadLocalMap的set方法)**。
  • 如果Map為空,則給該線程創建 Map,并設置初始值。
  • (這里調用了ThreadLocalMap的構造方法)**。
  • 構造方法`ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue)。

/*
* firstKey : 本ThreadLocal實例(this)
* firstValue : 要保存的線程本地變量
*/
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
//初始化table
table = new ThreadLocal.ThreadLocalMap.Entry[INITIAL_CAPACITY];
//計算索引(重點代碼)
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
//設置值
table[i] = new ThreadLocal.ThreadLocalMap.Entry(firstKey, firstValue);
size = 1;
//設置閾值
setThreshold(INITIAL_CAPACITY);
}

構造函數首先創建一個長度為16的Entry數組,然后計算出firstKey對應的索引,然后存儲到table中,并設置size和threshold。

ThreadLocalMap中的set方法

private void set(ThreadLocal<?> key, Object value) {
ThreadLocal.ThreadLocalMap.Entry[] tab = table;
int len = tab.length;
//計算索引(重點代碼,剛才分析過了)
int i = key.threadLocalHashCode & (len-1);
/**
* 使用線性探測法查找元素(重點代碼)
*/
for (ThreadLocal.ThreadLocalMap.Entry e = tab[i];
e != null;
e = tab[i = nextIndex(i, len)]) {
ThreadLocal<?> k = e.get();
//ThreadLocal 對應的 key 存在,直接覆蓋之前的值
if (k == key) {
e.value = value;
return;
}
// key為 null,但是值不為 null,說明之前的 ThreadLocal 對象已經被回收了,
// 當前數組中的 Entry 是一個陳舊(stale)的元素
if (k == null) {
//用新元素替換陳舊的元素,這個方法進行了不少的垃圾清理動作,防止內存泄漏
replaceStaleEntry(key, value, i);
return;
}
}
//ThreadLocal對應的key不存在并且沒有找到陳舊的元素,則在空元素的位置創建一個新的Entry。
tab[i] = new Entry(key, value);
int sz = ++size;
/**
* cleanSomeSlots用于清除那些e.get()==null的元素,
* 這種數據key關聯的對象已經被回收,所以這個Entry(table[index])可以被置null。
* 如果沒有清除任何entry,并且當前使用量達到了負載因子所定義(長度的2/3),那么進行 * rehash(執行一次全表的掃描清理工作)
*/
if (!cleanSomeSlots(i, sz) && sz >= threshold)
rehash();
}
/**
* 獲取環形數組的下一個索引
*/
private static int nextIndex(int i, int len) {
return ((i + 1 < len) ? i + 1 : 0);
}

  • 首先還是根據key計算出索引 i,然后查找i位置上的Entry。
  • 若是Entry已經存在并且key等于傳入的key,那么這時候直接給這個Entry賦新的value值。
  • 若是Entry存在,但是key為null,則調用replaceStaleEntry來更換這個key為空的Entry。
  • 不斷循環檢測,直到遇到為null的地方,這時候要是還沒在循環過程中return,那么就在這個null的位置新建一個Entry,并且插入,同時size增加1。
  • ThreadLocalMap使用線性探測法來解決哈希沖突的;該方法一次探測下一個地址,直到有空的地址后插入,若整個空間都找不到空余的地址,則產生溢出。

(2)get()方法

//ThreadLocal中get方法
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
//ThreadLocalMap中getEntry方法
private Entry getEntry(ThreadLocal<?> key) {
int i = key.threadLocalHashCode & (table.length - 1);
Entry e = table[i];
if (e != null && e.get() == key)
return e;
else
return getEntryAfterMiss(key, i, e);
}

通過計算出索引直接從數組對應位置讀取即可;

(3)ThreadLocal特性

  • ThreadLocal和Synchronized都是為了解決多線程中相同變量的訪問沖突問題;
  • Synchronized是通過線程等待,犧牲時間來解決訪問沖突
  • ThreadLocal是通過每個線程單獨一份存儲空間,犧牲空間來解決沖突,并且相比于Synchronized,ThreadLocal具有線程隔離的效果,只有在線程內才能獲取到對應的值,線程外則不能訪問到想要的值;
  • 正因為ThreadLocal的線程隔離特性,使他的應用場景相對來說更為特殊一些。在android中Looper、ActivityThread以及AMS中都用到了ThreadLocal;
  • 當某些數據是以線程為作用域并且不同線程具有不同的數據副本的時候,就可以考慮采用ThreadLocal;

3、ThreadLocal內存泄漏

我們調用threadLocal的set,get方法時,會判斷當前的key是否為null,將Entry中的value賦值為null,但是這個釋放value還有其他條件限制,并不是一定會發生,當系統內存不足時,由于Entry中的key繼承軟引用,回被垃圾回收器回收調,這時,Entry中的key為null,無法被線程訪問,但是value仍然占用一定的內存空間,雖然在調用set,get方法時有可能進行系統回收,仍然無法回收無用所有內存。無法被訪問的vlaue就會導致內存泄漏,怎么解決內存泄漏呢,最好的方法就是當我們使用完變量副本后及時調用remove方法,手動進行垃圾回收。

public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
/**
* Remove the entry for key.
*/
private void remove(ThreadLocal<?> key) {
Entry[] tab = table;
int len = tab.length;
int i = key.threadLocalHashCode & (len-1);
for (Entry e = tab[i];
e != null;
e = tab[i = nextIndex(i, len)]) {
if (e.get() == key) {
e.clear();//清除value
expungeStaleEntry(i);
return;
}
}
}

  • 當線程發生內存泄漏時,線程與內部的ThreadLocalMap之間存在著強引用,導致ThreadLocalMap無法被釋放,這時由于ThreadLocalMap中的Entry的key為弱引用,ThreadLocal容易被回收,導致key為null,當調用remove方法時,會清除key為null對應的value。
  • 所以為了避免內存泄漏的出現,我們在使用完ThreadLocal的set方法后,及時調用remove方法進行內存釋放。避免出現內存泄漏。

圖片

責任編輯:姜華 來源: Android開發編程
相關推薦

2019-04-02 09:57:29

阿里AI自然語言

2017-08-23 16:10:12

2017-06-12 08:14:54

電商打印設備京東

2023-08-02 08:54:58

Java弱引用鏈表

2021-05-06 08:55:24

ThreadLocal多線程多線程并發安全

2015-09-09 08:45:49

JavaThreadLocal

2023-10-07 08:26:40

多線程數據傳遞數據共享

2020-10-14 10:25:20

深度學習機器學習神經網絡

2023-09-08 08:20:46

ThreadLoca多線程工具

2022-03-17 08:55:43

本地線程變量共享全局變量

2020-07-28 08:59:22

JavahreadLocal面試

2011-04-28 20:33:14

2024-08-13 15:07:20

2018-02-06 22:18:47

Java虛擬機面試

2020-04-01 14:24:06

機器學習人工智能AI

2024-10-28 08:15:32

2024-03-26 00:33:59

JVM內存對象

2024-09-24 10:28:22

2022-10-25 10:20:31

線程變量原理

2024-11-11 10:40:19

Java變量副本
點贊
收藏

51CTO技術棧公眾號

日韩欧美视频一区二区| 国产91精品青草社区| 99九九99九九九99九他书对| 国产日产一区二区| 国产成人综合在线观看| 久久99国产精品自在自在app| 人妻激情偷乱频一区二区三区| 神马久久午夜| 国产精品卡一卡二卡三| 国产成人精品免费视频大全最热| 日本熟女毛茸茸| 亚洲天天综合| 亚洲跨种族黑人xxx| 亚洲精品成人在线播放| 多野结衣av一区| 一区免费观看视频| 裸模一区二区三区免费| 99riav国产| 日韩成人av影视| 国内免费久久久久久久久久久 | 国产一区二区美女| 国产精品99久久久久久白浆小说 | 亚州av乱码久久精品蜜桃| 亚洲国产婷婷香蕉久久久久久| 欧美成人福利在线观看| 亚洲美女炮图| 亚洲高清视频中文字幕| 影音先锋欧美资源| 国产在线视频网址| 99精品视频一区二区三区| 4444kk亚洲人成电影在线| 亚洲欧美另类在线视频| 国产欧美在线| 国内成人精品一区| 九九热视频精品| 久久久久久久久久久久久久| 中日韩美女免费视频网址在线观看| 99久久久无码国产精品性波多| 99国内精品久久久久| 欧美三级电影网站| 国产成人精品无码播放| 无码小电影在线观看网站免费| 亚洲国产精品人人做人人爽| 日本三级中文字幕在线观看| 免费**毛片在线| 国产精品理伦片| 制服诱惑一区| 免费av毛片在线看| 亚洲人成网站在线| 黄色影视在线观看| 超碰在线免费公开| 亚洲精品中文字幕在线观看| 男人的天堂成人| 国产剧情在线| 伊人色综合久久天天人手人婷| 一级黄色录像免费看| 日本成人网址| 亚洲免费观看在线视频| 麻豆传媒网站在线观看| 肉肉视频在线观看| 亚洲午夜激情av| 黄色一级在线视频| 高清不卡av| 欧洲亚洲精品在线| www.久久久久久久久久久| 亚洲最大的免费视频网站| 91麻豆精品国产自产在线| 伊人免费视频二| 97久久超碰| 日韩精品免费综合视频在线播放| www.色天使| 日韩国产一区二区| 欧美床上激情在线观看| 久久精品欧美一区二区| 性一交一乱一区二区洋洋av| 国产suv精品一区二区| 中文区中文字幕免费看| 激情五月播播久久久精品| 999久久久| 四虎影视2018在线播放alocalhost| 高清成人免费视频| 欧美高清一区二区| 伦xxxx在线| 午夜精品久久久久久久久久久 | 国产成a人无v码亚洲福利| 国产精品二区三区| 精品无吗乱吗av国产爱色| 国产精品久久久久一区| 800av在线免费观看| 第84页国产精品| 91精品欧美一区二区三区综合在| 国产在线不卡av| 日本激情一区| 久久久爽爽爽美女图片| 一级一级黄色片| 国产成人自拍网| 欧美亚洲国产免费| 在线免费观看的av| 欧美在线观看禁18| 无码人妻久久一区二区三区蜜桃| 九九在线高清精品视频| 九九精品在线视频| 波多野结衣影片| 成人性视频网站| 伊人精品久久久久7777| 超碰高清在线| 欧美疯狂性受xxxxx喷水图片| 黄色免费看视频| 五月婷婷六月综合| 日韩av大片在线| 精品久久人妻av中文字幕| 久久久电影一区二区三区| av日韩在线看| 超碰这里只有精品| 日韩av一区在线观看| 九九精品视频免费| 可以免费看不卡的av网站| 国产成人女人毛片视频在线| 日本视频在线| 91国偷自产一区二区三区观看 | 国产精品熟女久久久久久| 99国产精品久| 中文字幕人妻熟女人妻洋洋| 欧美videos粗暴| 亚洲人成电影网站色www| 日本三级欧美三级| 国产精品99久久久久久久vr | 里番在线观看网站| 在线观看日韩毛片| 好吊日免费视频| 国内精品久久久久久久97牛牛 | 国产二区视频在线播放| 视频亚洲一区二区| 久久亚洲私人国产精品va| 中文字幕在线播出| 国产欧美精品一区| 亚洲性生活网站| 国产一区二区欧美| 国产91免费观看| 欧美日本韩国一区二区| 欧美日韩精品二区| 日本五十肥熟交尾| 亚洲欧洲日本mm| 国产在线观看一区| 女海盗2成人h版中文字幕| 亚洲国产精品小视频| 久久久精品一区二区涩爱| 国产乱对白刺激视频不卡| 中文精品一区二区三区| 色综合视频一区二区三区日韩 | 日韩成人av影视| 日韩一区二区三区高清| 97欧美成人| 亚洲欧美日韩中文视频| 在线免费观看av网址| 国产婷婷一区二区| 国模私拍视频在线观看| 天天做天天爱天天综合网| 91麻豆国产精品| 色网在线观看| 日韩av一区在线观看| 亚洲乱码国产乱码精品| 欧美国产禁国产网站cc| 在线黄色免费看| 欧美 日韩 国产 一区| caoporn国产精品免费公开| 俺来也官网欧美久久精品| 亚洲第一国产精品| 精产国品一区二区| 久久精品亚洲国产奇米99 | 国产sm精品调教视频网站| 精品国产av无码一区二区三区| 日韩大胆成人| 国产精品三级网站| 91精选在线| 日韩精品在线视频| 在线视频免费观看一区| 一区二区在线观看av| 毛片网站免费观看| 久久99国产乱子伦精品免费| 日本男女交配视频| 久久av网址| 99精品国产一区二区| 亚洲性受xxx喷奶水| 精品久久久999| 色wwwwww| 欧美精品久久一区| 国产又爽又黄的视频| 国产精品国产三级国产aⅴ原创| 香蕉视频1024| 视频一区二区欧美| 老司机激情视频| 欧美精品一区二区三区中文字幕 | 精品中文字幕一区二区三区av| 国产日韩中文字幕| 欧美另类老肥妇| 久久色在线播放| 视频一区二区三区国产| 91精品国产综合久久久久| 99久热在线精品996热是什么| 国产精品欧美精品| 99re久久精品国产| 国产一区999| 日本成人黄色网| 亚洲高清免费| 裸体裸乳免费看| 国产一区二区三区四区二区| 高清日韩一区| 96视频在线观看欧美| 热re91久久精品国99热蜜臀| 性xxxxfjsxxxxx欧美| 国产一区二区三区18| 丁香六月色婷婷| 欧美福利电影网| 日韩xxx视频| 欧美网站在线观看| 久久午夜无码鲁丝片| 国产精品成人免费精品自在线观看| 捆绑凌虐一区二区三区| 国产精品99久久久久久久女警| 艹b视频在线观看| 狂野欧美一区| 国产a级一级片| 999亚洲国产精| 夜夜添无码一区二区三区| 在线国产一区| 青青草原国产免费| 日韩欧美自拍| 亚洲a∨一区二区三区| 亚洲资源网你懂的| 久久久久网址| 久久精品亚洲成在人线av网址| 97人人干人人| 香蕉大人久久国产成人av| 91免费的视频在线播放| 亚洲伦理网站| 成人精品一区二区三区电影免费| 色猫猫成人app| 国产精品久久久久久久美男| 欧美福利在线播放| 日韩美女激情视频| 香蕉成人av| 国产激情久久久| 性欧美超级视频| 国产精品成人av性教育| 日本欧美一区| 国产精品久久久久久久久久99| 日本精品不卡| 国产精品久久久久久久av电影| 蜜桃精品在线| 国产精品综合不卡av| 亚洲网站三级| 99热在线播放| 国产欧美三级电影| 久久99久久99精品蜜柚传媒| 网曝91综合精品门事件在线| 欧美视频1区| 青草国产精品| 国产一二三四五| 在线免费高清一区二区三区| 9久久9毛片又大又硬又粗| 久久激情中文| 成年人三级黄色片| 国产精品一区免费视频| 日本精品一二三区| 2023国产精品| 99自拍偷拍视频| 一区二区三区四区国产精品| 久久久久久久黄色片| 欧洲国内综合视频| 国产日产亚洲系列最新| 亚洲成人网av| а天堂8中文最新版在线官网| 北条麻妃一区二区三区中文字幕| 中文字幕中文字幕在线十八区 | 波多野结衣中文字幕一区| 偷拍女澡堂一区二区三区| 日本一区二区高清| 青青操视频在线播放| 欧美视频专区一二在线观看| 91超薄丝袜肉丝一区二区| 精品国产一区二区亚洲人成毛片 | www.久久东京| 欧美日韩在线观看一区| 91精品精品| 成人在线免费在线观看| 麻豆精品国产传媒mv男同 | 国产香蕉久久精品综合网| 多男操一女视频| 狠狠爱在线视频一区| 国产乱淫a∨片免费观看| 日韩电影在线观看永久视频免费网站| chinese偷拍一区二区三区| 欧美精品国产精品日韩精品| 成人看片网站| 国产免费一区二区| 91日韩欧美| 国产欧美在线一区| 国产一区二区三区综合| 久久精品成人av| 亚洲一区二区综合| 一级淫片免费看| 亚洲精品日韩久久久| av片在线观看网站| 国产精品手机播放| 四虎5151久久欧美毛片| 久久av高潮av| 麻豆国产欧美日韩综合精品二区| 制服丝袜第一页在线观看| 亚洲欧洲日产国码二区| www.国产com| 亚洲精品一区二区三区精华液 | 午夜影院在线视频| 欧美久久久精品| 全球中文成人在线| 日本一区二区三区视频在线播放| 欧美区日韩区| 992kp免费看片| 国产精品免费免费| 无码人妻久久一区二区三区 | 91亚洲国产成人精品性色| 国产不卡一二三区| 日本三级免费网站| 成人av综合一区| 欧美爱爱小视频| 制服丝袜激情欧洲亚洲| 欧美尤物美女在线| 国产精品专区一| 成人av国产| 亚洲黄色a v| 国产人成亚洲第一网站在线播放| 成人免费区一区二区三区| 精品伦理精品一区| 欧美理论片在线播放| 97se国产在线视频| 自拍欧美日韩| 人妻体体内射精一区二区| 亚洲人吸女人奶水| 国产成人av免费看| 欧美黑人性猛交| jizz性欧美23| 僵尸世界大战2 在线播放| 成人av电影免费在线播放| www.av视频在线观看| 精品sm在线观看| 岛国在线视频网站| 免费在线观看一区二区| 久久精品伊人| 欧美老女人性生活视频| 欧美三级日韩在线| 老司机福利在线视频| 91精品视频在线| 亚洲欧美文学| 无码国产精品一区二区免费式直播| 亚洲一区二区三区三| 神马久久久久久久久久| 欧美一级免费视频| 精品视频国产| 中文字幕一区二区在线观看视频| 亚洲色图都市小说| 超碰在线人人干| 97**国产露脸精品国产| 久久综合欧美| 亚洲 国产 图片| 亚洲成av人片www| 精品三级久久久久久久电影聊斋| 国产精品日日摸夜夜添夜夜av| 久久精品免费一区二区三区| 国产精品99精品无码视亚| 欧美日韩免费一区| 成人高清网站| 91传媒视频在线观看| 一本色道久久精品| 亚洲天堂最新地址| 日韩免费成人网| 精品91久久| 男人的天堂成人| 91丨porny丨蝌蚪视频| 中文字幕在线观看国产| 欧美大片在线看免费观看| 亚洲精品蜜桃乱晃| 中文字幕久久av| 精品久久久久久久久国产字幕| 精品99又大又爽又硬少妇毛片 | 国产巨乳在线观看| 国外视频精品毛片| 日韩精品一区二区久久| youjizz.com日本| 欧美色精品天天在线观看视频| 亚洲丝袜精品| 日韩欧美亚洲日产国产| 国产成人欧美日韩在线电影| 欧美日韩一级黄色片| 欧美成人精品激情在线观看| 免费观看久久av| 伊人影院在线观看视频| 欧美天天综合网| 免费h在线看| 日韩一级特黄毛片| 欧美激情综合网|