精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产区精品在线观看| 亚洲精品视频播放| 免费不卡av在线| 台湾av在线二三区观看| 奇米影视一区二区三区| 啊v视频在线一区二区三区 | 九色porny丨首页入口在线| 91日韩精品一区| 国产精品视频永久免费播放| 九九热视频精品| 亚洲宅男一区| 欧美一级日韩一级| 国产综合免费视频| 日日夜夜天天综合入口| 国产欧美一区二区精品性| 97人人干人人| 中文字幕免费视频观看| 日本女优一区| 精品丝袜一区二区三区| 天天操夜夜操很很操| 亚洲成av在线| 欧美日韩激情美女| 国产成人亚洲综合无码| 91社区在线| 久久无码av三级| 国产a一区二区| 国产有码在线观看| 日韩国产精品久久久| 78色国产精品| 久久午夜无码鲁丝片午夜精品| 日韩午夜电影网| 亚洲视频国产视频| 亚洲狠狠婷婷综合久久久久图片| 麻豆视频久久| 欧美人伦禁忌dvd放荡欲情| 国产免费视频传媒| 伊人网在线播放| 亚洲va韩国va欧美va| 日韩视频一二三| 国产一区久久精品| 国产精品福利影院| 日韩aⅴ视频一区二区三区| 三级在线观看| www一区二区| 国产视色精品亚洲一区二区| 好吊色一区二区| 国产69精品久久99不卡| 成人免费视频观看视频| 亚洲男人第一天堂| 粉嫩高潮美女一区二区三区| 亚洲综合色av| 亚洲精品久久久久久久久久久久久久 | 男女男精品视频站| 99久久综合国产精品二区| 色视频成人在线观看免| 黄色a级片免费| 欧美日韩大片| 欧美色中文字幕| 国产精品一区二区小说| 亚洲欧洲二区| 91精品国产色综合久久| 337p日本欧洲亚洲大胆张筱雨| 人人爱人人干婷婷丁香亚洲| 欧美va亚洲va在线观看蝴蝶网| 日韩黄色一区二区| 青青草这里只有精品| 亚洲精品自拍偷拍| 亚洲天堂岛国片| 99视频精品全国免费| 久久久精品国产| 国产无遮无挡120秒| 国产日韩一区| 国产精品稀缺呦系列在线| 一级片aaaa| 国产91丝袜在线播放九色| 久久精品99久久| 高清在线观看av| 亚洲色图欧洲色图| 成人免费性视频| 欧美在线极品| 欧美三区在线观看| jjzz黄色片| 免费成人网www| 日韩中文字幕免费看| 国产在线视频你懂的| 久久九九免费| 99电影网电视剧在线观看| 手机福利小视频在线播放| 国产精品午夜春色av| 日韩精品一区二区三区四| 国内激情视频在线观看| 欧美特级限制片免费在线观看| 国产精欧美一区二区三区白种人| 超碰cao国产精品一区二区| 亚洲人a成www在线影院| 日本妇女毛茸茸| 噜噜噜在线观看免费视频日韩| 国产在线拍偷自揄拍精品| 搡老岳熟女国产熟妇| 国产精品久线在线观看| 国产精品久久中文字幕| 亚洲国产一区二区久久| 亚洲精品美女免费| 97成人资源站| 久久久久久夜| 懂色av一区二区三区在线播放| 成黄免费在线| 亚洲高清免费视频| 在线能看的av网站| 亚洲桃色综合影院| 久久久久久91| 国产又黄又粗又猛又爽| 久久亚洲免费视频| 中文字幕の友人北条麻妃| 久久人体大尺度| 精品国产青草久久久久福利| 天堂网中文在线观看| 性感少妇一区| 国产乱码一区| 日本乱理伦在线| 欧美人与z0zoxxxx视频| 精品无人区无码乱码毛片国产| 韩日精品在线| 91麻豆精品秘密入口| 嫩草香蕉在线91一二三区| 日本久久精品电影| 免费a在线观看播放| 国产精品99免费看| 91亚洲精品一区二区| 欧美性猛交xxx乱大交3蜜桃| 欧美日在线观看| 国模私拍在线观看| 亚洲人www| 高清不卡日本v二区在线| 国产最新在线| 制服.丝袜.亚洲.中文.综合| 在线视频第一页| 日韩在线a电影| 日韩电影天堂视频一区二区| 欧美gay视频| 亚洲欧美一区二区三区四区| 全部毛片永久免费看| av电影在线观看不卡| 黄色一级视频在线播放| 久久夜色电影| 911国产网站尤物在线观看| 少妇av一区二区| 午夜精品成人在线视频| 一级欧美一级日韩片| 亚洲作爱视频| 欧美成人免费在线| 台湾佬成人网| 国产亚洲人成网站在线观看 | 在线不卡一区二区| 国产午夜精品理论片在线| 精品一区在线看| 四虎永久免费网站| 视频一区日韩精品| 久久噜噜噜精品国产亚洲综合| 成人午夜精品福利免费| 婷婷开心激情综合| 黄色工厂在线观看| 美国一区二区三区在线播放| 一区二区精品免费视频| 国产精品亚洲欧美一级在线| 欧美激情一级精品国产| 日韩一区免费视频| 欧美日韩一区免费| 亚洲精品国产精品国自| 国产一区91精品张津瑜| 国产黄色片免费在线观看| 台湾色综合娱乐中文网| 国产精品天天狠天天看| 中文字幕有码在线视频| 亚洲黄在线观看| 中文在线字幕免费观| 亚洲欧美区自拍先锋| 艳妇乳肉亭妇荡乳av| 日韩精品国产欧美| 九一免费在线观看| 玖玖玖免费嫩草在线影院一区| 国产成人精品免高潮在线观看| 日本最新在线视频| 欧美精品一区二区三区很污很色的| 中文字幕激情小说| 国产日韩影视精品| 美女日批在线观看| 久热精品视频| 人人妻人人澡人人爽欧美一区| 天堂综合网久久| 91久久久久久久久久| 中文字幕色婷婷在线视频| 日韩中文有码在线视频| 日韩永久免费视频| 91精品国产麻豆国产自产在线 | 国产综合精品在线| 国产盗摄女厕一区二区三区| 日本熟妇人妻xxxxx| 欧美成人69av| 日本在线一区| 精品素人av| 成人午夜在线观看| 深夜成人福利| 97在线观看视频国产| 求av网址在线观看| 亚洲色图第三页| 人妻一区二区三区四区| 欧美日韩国产欧美日美国产精品| 丰满少妇乱子伦精品看片| 亚洲日本欧美天堂| 日本性高潮视频| 26uuu久久天堂性欧美| 欧美日韩一区二区区别是什么 | 西西大胆午夜视频| 国产在线精品一区在线观看麻豆| aaaaaa亚洲| 亚洲伦理精品| www.亚洲视频.com| 亚洲一本二本| 一区二区国产日产| 日本女优一区| 日产精品一线二线三线芒果| 外国成人在线视频| 国产精品加勒比| 日韩成人视屏| 91av一区二区三区| 日韩在线激情| 国产欧美精品va在线观看| 免费观看欧美大片| 欧洲成人性视频| 日韩脚交footjobhdboots| 欧美激情伊人电影| 天堂亚洲精品| 欧美理论片在线观看| 中文字幕在线观看网站| 九九热这里只有精品6| 黄视频网站在线| 日韩性生活视频| 免费av在线网址| 日韩中文第一页| 欧美成人三区| 深夜福利亚洲导航| 日韩网站在线播放| 亚洲专区**| 欧美一区二区三区在线看| 国产又粗又猛又黄视频| 欧美性极品少妇精品网站| 日韩欧美中文字幕一区二区| 亚洲国产中文字幕| 亚洲精品在线观看av| 亚洲一区二区精品久久av| 国产亚洲精品久久久久久无几年桃| 亚洲欧美另类久久久精品| 欧美三级日本三级| 亚洲图片欧美综合| 毛片基地在线观看| 色偷偷久久一区二区三区| 在线免费观看av网址| 91成人网在线| 一区二区三区免费在线视频| 欧美二区在线观看| 亚洲国产精品suv| 欧美精品一区二区三区在线播放| 深夜福利免费在线观看| 亚洲人成伊人成综合网久久久| 成年女人的天堂在线| 久久中文字幕在线视频| 黑人极品ⅴideos精品欧美棵| 久久人人97超碰精品888 | 欧洲一区二区视频| 国产第一精品| 91传媒免费看| 香蕉国产成人午夜av影院| 日本一区二区三不卡| 欧美电影免费| 屁屁影院ccyy国产第一页| 久久国产99| 日本中文字幕观看| 成人丝袜视频网| 男人天堂av电影| 一区二区三区在线观看国产| 在线观看 中文字幕| 在线观看91视频| 超碰免费在线97| 亚洲人成在线一二| 黄色成人在线观看| 555www成人网| 国产精品xnxxcom| 另类欧美小说| 91精品国产视频| aa在线免费观看| 韩国三级电影一区二区| 三级男人添奶爽爽爽视频 | 亚洲另类图片色| 欧美日韩视频在线播放| 91精品国产91久久久久久不卡| 国产一区影院| 精品网站在线看| 久久久久久美女精品 | 三级在线观看视频| 国产日韩欧美自拍| 婷婷激情久久| 免费的av在线| 日本不卡高清视频| 午夜av免费看| 日韩美女啊v在线免费观看| 亚洲免费在线观看av| 欧美一级片在线看| 91精品专区| 国产精品999999| 欧美91在线| 欧美在线观看视频免费| 免费观看30秒视频久久| 欧美成人三级伦在线观看| 亚洲精品视频自拍| 一级黄色免费片| 亚洲天堂久久av| 一个人看的www视频在线免费观看| 99九九视频| 欧美精选在线| 中文字幕第36页| 久久久久国产精品免费免费搜索| 日本中文字幕免费观看| 欧美一二三四在线| 欧美激情二区| 国产精品香蕉国产| 欧美中文一区二区| 欧美黄色一级片视频| 91污片在线观看| 国产一级做a爱片久久毛片a| 精品精品国产高清一毛片一天堂| 黄色在线免费网站| 91久久国产精品91久久性色| 成人网18免费网站| 免费看又黄又无码的网站| 高清成人免费视频| 精品无码av在线| 精品国产凹凸成av人网站| 天堂av在线电影| 亚洲一区制服诱惑| 综合色一区二区| 一区二区三区人妻| 亚洲一区二区在线观看视频| 性欧美videos另类hd| 欧美夫妻性生活xx| youjizz亚洲| 国产日韩欧美精品在线观看| 91在线视频播放| 青青青国产在线| 国产亚洲xxx| 999国产精品亚洲77777| 偷拍盗摄高潮叫床对白清晰| 狠狠网亚洲精品| 国产黄在线免费观看| 精品日韩一区二区三区| wwww亚洲| 欧美日本亚洲| 日本亚洲视频在线| a一级免费视频| 欧美一级在线视频| 丰满诱人av在线播放| 久久精品ww人人做人人爽| 日韩国产一区二| 欧美日韩午夜视频| 亚洲成人网在线观看| 中文字幕这里只有精品| 午夜老司机精品| 国产老妇另类xxxxx| 日韩av女优在线观看| 亚洲欧美中文日韩在线| 老司机精品视频网| 国产精品69久久久| 国产午夜精品一区二区三区嫩草 | 在线观看日韩欧美| 爱情电影网av一区二区| 青草青青在线视频| 国产日产欧美一区二区视频| 国产精品毛片久久久久久久av| 欧美日本高清一区| 九九视频精品全部免费播放| 亚洲人视频在线| 婷婷六月综合亚洲| 五月天婷婷在线视频| 国产精品区一区| 青草国产精品久久久久久| 欧美成欧美va| 亚洲色图17p| 欧美日本三级| 久久久久狠狠高潮亚洲精品| 亚洲视频 欧洲视频| 色婷婷av一区二区三区之e本道| 国产精品青草久久久久福利99| 欧美1区免费| 神马久久久久久久久久久| 日韩精品一区二区三区视频在线观看| 成人免费看黄| 欧美国产综合在线| 国产精品理论片在线观看| 亚洲欧洲视频在线观看| 亚洲综合大片69999|