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

ThreadLocal:線程專屬的變量

開發 后端
ThreadLocal是 java 提供的一個方便對象在本線程內不同方法中傳遞和獲取的類。用它定義的變量,僅在本線程中可見和維護,不受其他線程的影響,與其他線程相互隔離。

[[390097]]

一、ThreadLocal 簡介

ThreadLocal是 java 提供的一個方便對象在本線程內不同方法中傳遞和獲取的類。用它定義的變量,僅在本線程中可見和維護,不受其他線程的影響,與其他線程相互隔離。

那 ThreadLocal 到底解決了什么問題,又適用于什么樣的場景?

  • This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID). Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the ThreadLocal instance is accessible; after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).

核心意思是

ThreadLocal 提供了線程本地的實例。它與普通變量的區別在于,每個使用該變量的線程都會初始化一個完全獨立的實例副本。ThreadLocal 變量通常被private static修飾。當一個線程結束時,它所使用的所有 ThreadLocal 相對的實例副本都可被回收。

總的來說,ThreadLocal 適用于每個線程需要自己獨立的實例且該實例需要在多個方法中被使用,也即變量在線程間隔離而在方法或類間共享的場景。后文會通過實例詳細闡述該觀點。另外,該場景下,并非必須使用 ThreadLocal ,其它方式完全可以實現同樣的效果,只是 ThreadLocal 使得實現更簡潔。

二、ThreadLocal 使用

ThreadLocal 通過 set 方法可以給變量賦值,通過 get 方法獲取變量的值。當然,也可以在定義變量時通過 ThreadLocal.withInitial 方法給變量賦初始值,或者定義一個繼承 ThreadLocal 的類,然后重寫 initialValue 方法。

下面通過如下代碼說明 ThreadLocal 的使用方式:

  1. public class TestThreadLocal 
  2.     private static ThreadLocal<StringBuilder> builder = ThreadLocal.withInitial(StringBuilder::new); 
  3.  
  4.     public static void main(String[] args) 
  5.     { 
  6.         for (int i = 0; i < 5; i++) 
  7.         { 
  8.             new Thread(() -> { 
  9.                 String threadName = Thread.currentThread().getName(); 
  10.                 for (int j = 0; j < 3; j++) 
  11.                 { 
  12.                     append(j); 
  13.                     System.out.printf("%s append %d, now builder value is %s, ThreadLocal instance hashcode is %d, ThreadLocal instance mapping value hashcode is %d\n", threadName, j, builder.get().toString(), builder.hashCode(), builder.get().hashCode()); 
  14.                 } 
  15.  
  16.                 change(); 
  17.                 System.out.printf("%s set new stringbuilder, now builder value is %s, ThreadLocal instance hashcode is %d, ThreadLocal instance mapping value hashcode is %d\n", threadName, builder.get().toString(), builder.hashCode(), builder.get().hashCode()); 
  18.             }, "thread-" + i).start(); 
  19.         } 
  20.     } 
  21.  
  22.     private static void append(int num) { 
  23.         builder.get().append(num); 
  24.     } 
  25.  
  26.     private static void change() { 
  27.         StringBuilder newStringBuilder = new StringBuilder("HelloWorld"); 
  28.         builder.set(newStringBuilder); 
  29.     } 

在例子中,定義了一個 builder 的 ThreadLocal 對象,然后啟動 5 個線程,分別對 builder 對象進行訪問和修改操作,這兩個操作放在兩個不同的函數 append、change 中進行,兩個函數訪問 builder 對象也是直接獲取,而不是放入函數的入參中傳遞進來。

代碼輸出如下:

  1. thread-0 append 0, now builder value is 0, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 566157654 
  2. thread-0 append 1, now builder value is 01, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 566157654 
  3. thread-4 append 0, now builder value is 0, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 654647086 
  4. thread-3 append 0, now builder value is 0, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 1803363945 
  5. thread-2 append 0, now builder value is 0, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 1535812498 
  6. thread-1 append 0, now builder value is 0, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 2075237830 
  7. thread-2 append 1, now builder value is 01, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 1535812498 
  8. thread-3 append 1, now builder value is 01, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 1803363945 
  9. thread-4 append 1, now builder value is 01, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 654647086 
  10. thread-0 append 2, now builder value is 012, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 566157654 
  11. thread-0 set new stringbuilder, now builder value is HelloWorld, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 1773033190 
  12. thread-4 append 2, now builder value is 012, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 654647086 
  13. thread-4 set new stringbuilder, now builder value is HelloWorld, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 700642750 
  14. thread-3 append 2, now builder value is 012, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 1803363945 
  15. thread-3 set new stringbuilder, now builder value is HelloWorld, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 1706743158 
  16. thread-2 append 2, now builder value is 012, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 1535812498 
  17. thread-2 set new stringbuilder, now builder value is HelloWorld, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 1431127699 
  18. thread-1 append 1, now builder value is 01, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 2075237830 
  19. thread-1 append 2, now builder value is 012, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 2075237830 
  20. thread-1 set new stringbuilder, now builder value is HelloWorld, ThreadLocal instance hashcode is 796465865, ThreadLocal instance mapping value hashcode is 1970695360 
  • 從輸出中 1~6 行可以看出,不同線程訪問的是同一個 builder 對象(不同線程輸出的 ThreadLocal instance hashcode 值相同),但是每個線程獲得的 builder 對象存儲的實例 StringBuilder 不同(不同線程輸出的 ThreadLocal instance mapping value hashcode值不相同)。
  • 從輸出中1~2、9~10 行可以看出,同一個線程中修改 builder 對象存儲的實例的值時,并不會影響到其他線程的 builder 對象存儲的實例(thread-4 線程改變存儲的 StringBuilder 的值并不會引起 thread-0 線程的 ThreadLocal instance mapping value hashcode 值發生改變)
  • 從輸出中 9~13 行可以看出,一個線程對 ThreadLocal 對象存儲的值發生改變時,并不會影響其他的線程(thread-0 線程調用 set 方法改變本線程 ThreadLocal 存儲的對象值,本線程的 ThreadLocal instance mapping value hashcode 發生改變,但是 thread-4 的 ThreadLocal instance mapping value hashcode 并沒有因此改變)。

三、ThreadLocal 原理

ThreadLocal 能在每個線程間進行隔離,其主要是靠在每個 Thread 對象中維護一個 ThreadLocalMap 來實現的。因為是線程中的對象,所以對其他線程不可見,從而達到隔離的目的。那為什么是一個 Map 結構呢。主要是因為一個線程中可能有多個 ThreadLocal 對象,這就需要一個集合來進行存儲區分,而用 Map 可以更快地查找到相關的對象。ThreadLocalMap 是 ThreadLocal 對象的一個靜態內部類,內部維護一個 Entry 數組,實現類似 Map 的 get 和 put 等操作,為簡單起見,可以將其看做是一個 Map,其中 key 是 ThreadLocal 實例,value 是 ThreadLocal 實例對象存儲的值。

ThreadLocalMap

 

四、ThreadLocal 適用場景

如上文所述,ThreadLocal 適用于如下場景:

每個線程需要有自己單獨的實例,如實現每個線程單例類或每個線程上下文信息(例如事務ID)。

ThreadLocal 適用于變量在線程間隔離且在方法間共享的場景,提供了另一種擴展 Thread 的方法。如果要保留信息或將信息從一個方法調用傳遞到另一個方法,則可以使用 ThreadLocal 進行傳遞。

由于不需要修改任何方法,因此可以提供極大的靈活性。

1、案例一

這里一個處理 flag 的類,通過 ThreadLocal 使用,可以保證每個請求都擁有唯一的一個追蹤標記。

  1. public class TestFlagHolder { 
  2.  
  3.   private final static ThreadLocal<String> TEST_FLAG = new ThreadLocal<>(); 
  4.  
  5.   public static void set(String value) { 
  6.     TEST_FLAG.set(value); 
  7.   } 
  8.  
  9.   public static String get() { 
  10.     return TEST_FLAG.get(); 
  11.   } 
  12.  
  13.   public static String get4log() { 
  14.     if (TEST_FLAG.get() == null) { 
  15.       return "-"
  16.     } 
  17.     return TEST_FLAG.get(); 
  18.   } 
  19.  
  20.   public static void remove() { 
  21.     TEST_FLAG.remove(); 
  22.   } 
  23.  

2、案例二

在同一線程中 trace 信息的傳遞:

  1. ThreadLocal<String> traceContext = new ThreadLocal<>(); 
  2.  
  3. String traceId = Tracer.startServer(); 
  4. traceContext.set(traceId) //生成trace信息 傳入threadlocal 
  5. ... 
  6. Tracer.startClient(traceContext.get()); //從threadlocal獲取trace信息 
  7. Tracer.endClient(); 
  8. ... 
  9. Tracer.endServer(); 

3、案例三

給同一個請求的每一行日志增加一個相同的標記。這樣,只要拿到這個標記就可以查詢到這個請求鏈路上所有步驟的耗時了,我們把這個標記叫做 requestId,我們可以在程序的入口處生成一個 requestId,然后把它放在線程的上下文中,這樣就可以在需要時隨時從線程上下文中獲取到 requestId 了。

簡單的代碼實現就像下面這樣:

  1. String requestId = UUID.randomUUID().toString(); 
  2. ThreadLocal<String> tl = new ThreadLocal<String>(){ 
  3.     @Override 
  4.     protected String initialValue() { 
  5.         return requestId; 
  6.     } 
  7. }; //requestId存儲在線程上下文中 
  8. long start = System.currentTimeMillis(); 
  9. processA(); 
  10. Logs.info("rid : " + tl.get() + ", process A cost " + (System.currentTimeMillis() - start)); // 日志中增加requestId 
  11. start = System.currentTimeMillis(); 
  12. processB(); 
  13. Logs.info("rid : " + tl.get() + ", process B cost " + (System.currentTimeMillis() - start)); 
  14. start = System.currentTimeMillis(); 
  15. processC(); 
  16. Logs.info("rid : " + tl.get() + ", process C cost " + (System.currentTimeMillis() - start)); 

有了 requestId,你就可以清晰地了解一個調用鏈路上的耗時分布情況了。

五、小結

無論是單體系統還是微服務化架構,無論是鏈路打標還是服務追蹤,你都需要在系統中增加 TraceId,這樣可以將你的鏈路串起來,給你呈現一個完整的問題場景。如果 TraceId 可以在客戶端上生成,在請求業務接口的時候傳遞給服務端,那么就可以把客戶端的日志體系也整合進來,對于問題的排查幫助更大。

同時,在全鏈路壓測框架中,Trace 信息的傳遞功能是基于 ThreadLocal 的。但實際業務中可能會使用異步調用,這樣就會丟失 Trace 信息,破壞了鏈路的完整性。所以在實際的項目建議大家不要輕意使用 ThreadLocal。

參考資料:

[1]:《高并發系統設計40問》

[2]:https://juejin.cn/post/6844904016288317448#heading-6

本文轉載自微信公眾號「7DGroup」,可以通過以下二維碼關注。轉載本文請聯系7DGroup公眾號。

 

責任編輯:武曉燕 來源: 7DGroup
相關推薦

2023-10-19 08:30:58

線程源碼thread

2016-08-31 15:50:50

PythonThreadLocal變量

2016-11-07 21:59:52

threadpython

2016-08-31 15:41:19

PythonThreadLoca變量

2024-04-08 10:09:37

TTLJava框架

2023-02-15 09:34:20

公共字段mybatis變量

2022-07-26 07:14:20

線程隔離Thread

2024-11-11 10:40:19

Java變量副本

2024-08-26 08:29:55

2024-08-13 08:48:50

2020-11-09 09:03:35

高并發多線程ThreadLocal

2022-08-01 07:42:17

線程安全場景

2024-10-28 08:15:32

2022-09-22 13:56:56

線程Java

2023-09-08 08:20:46

ThreadLoca多線程工具

2018-10-25 15:24:10

ThreadLocal內存泄漏Java

2022-10-25 10:20:31

線程變量原理

2011-07-14 13:50:09

ThreadLocal

2025-04-01 05:22:00

JavaThread變量

2020-07-20 15:20:44

ThreadLocalJava多線程
點贊
收藏

51CTO技術棧公眾號

国产jzjzjz丝袜老师水多| 全网免费在线播放视频入口 | 欧美成人免费va影院高清| 91亚洲一区二区| 日韩av影片| 亚洲日本在线天堂| 免费在线观看91| 国产精品怡红院| 西西人体一区二区| 美女少妇精品视频| 精品无码国产污污污免费网站 | 欧美喷水一区二区| 亚洲 欧美 日韩 国产综合 在线| 香蕉视频在线免费看| 不卡的av在线播放| 成人免费在线网址| 看黄色一级大片| 悠悠资源网久久精品| 国产精品夫妻自拍| 精品九九九九| 伊人久久成人网| 国产精品五区| 欧美激情精品久久久久久黑人| 日韩女同一区二区三区| 9999久久久久| 91精品国产综合久久久久久久 | h片在线观看视频免费免费| 国产精品丝袜91| 欧美午夜精品久久久久久蜜| 成人精品在线播放| 国产麻豆午夜三级精品| 国产精品视频一区二区三区四| 日韩免费黄色片| 欧美激情第二页| 久久精品2019中文字幕| 波多野在线播放| 亚洲电影男人天堂| 亚洲护士老师的毛茸茸最新章节| 亚洲av毛片在线观看| 欧美日韩视频免费看| 欧美在线啊v一区| 日本黄网站免费| 日韩在线伦理| 日韩欧美国产网站| 国模吧无码一区二区三区| 99riav视频在线观看| 一区二区激情小说| 精品人妻大屁股白浆无码| 亚洲资源一区| 一区二区三区在线影院| 国产性生活免费视频| 日本一本在线免费福利| 一区二区三区日本| 国产乱子伦精品无码专区| 日本伦理一区二区| 亚洲成人久久影院| 欧美日韩二三区| 自拍在线观看| 日本韩国精品在线| 欧美色图另类小说| www成人在线视频| 在线观看av一区二区| 亚洲黄色a v| 欧美激情三区| 欧美成人vps| 人妻 日韩 欧美 综合 制服| 久久激情av| 亚洲欧美国产精品| 天天操天天干天天操天天干| 日韩在线综合| 色阁综合伊人av| 日韩欧美中文视频| 亚洲一区二区三区四区电影| 亚洲精品在线电影| 大又大又粗又硬又爽少妇毛片| 欧美色就是色| 美女av一区二区| 日本熟妇毛耸耸xxxxxx| 久久亚洲欧美| 亚洲一区二区自拍| 日本午夜在线视频| 中文字幕中文字幕一区| 国产精品无码免费专区午夜| 在线观看v片| 欧美嫩在线观看| 国产人妻黑人一区二区三区| 欧美一级精品片在线看| 九九久久久久99精品| 国产成人无码一区二区在线播放| 欧美a级一区二区| 翡翠波斯猫1977年美国| 国产香蕉在线| 亚洲综合视频在线观看| 91香蕉视频污版| 91综合久久爱com| 国产午夜一区二区| 久久婷婷综合国产| 麻豆91在线播放| 精品一卡二卡三卡四卡日本乱码| 日韩精品黄色| 色综合色综合色综合色综合色综合 | 日日夜夜免费精品| 99久久精品久久久久久ai换脸| 免费在线观看一级毛片| 亚洲一区二区三区美女| 天堂中文视频在线| 美女视频亚洲色图| 伦理中文字幕亚洲| 蜜臀99久久精品久久久久小说| 国产精品白丝jk白祙喷水网站| 欧美在线视频一区二区三区| 七七成人影院| 欧美精品高清视频| 国产手机在线观看| 国产日产高清欧美一区二区三区| 国产综合久久久久| 国产精品视频一区二区久久| 香蕉加勒比综合久久| 一级 黄 色 片一| 日韩在线二区| 国产不卡在线观看| 东京干手机福利视频| 亚洲天堂2016| 中国黄色片免费看| 狠狠操综合网| 欧美一区二粉嫩精品国产一线天| www.国产免费| 亚洲码国产岛国毛片在线| 美女网站色免费| 国内亚洲精品| 国产精品xxxxx| 国产资源在线播放| 日韩欧美在线网址| 人妻无码一区二区三区| 红桃视频欧美| 成人91视频| 污污在线观看| 日韩精品一区二区三区视频播放 | 老司机一区二区三区| 精品视频第一区| 国产精品一区二区日韩| 亚洲高清色综合| 国产无码精品在线播放| 成人av在线资源网站| 国产美女主播在线播放| 国产精品久久久网站| 久久久欧美一区二区| 精品久久久久中文慕人妻 | 久草国产精品视频| av电影天堂一区二区在线观看| 97在线国产视频| 老司机精品在线| 日本成人免费在线| 酒色婷婷桃色成人免费av网| 在线视频欧美精品| 天美传媒免费在线观看| 精品一区在线看| 日本精品免费视频| 99久久香蕉| 2023亚洲男人天堂| 浮生影视网在线观看免费| 欧美日韩一级片在线观看| 潮喷失禁大喷水aⅴ无码| 激情五月播播久久久精品| 国产av不卡一区二区| 这里视频有精品| 欧美亚洲在线视频| 高清性色生活片在线观看| 8v天堂国产在线一区二区| 久久久精品99| 久久影院视频免费| 美女在线视频一区二区| 欧美日韩一区二区国产| 久久大片网站| 成人自拍视频网| 欧美乱大交xxxxx| 神马电影在线观看| 国产精品日日摸夜夜摸av| 99re精彩视频| 激情久久婷婷| 日本黑人久久| 国产亚洲字幕| 欧美一级电影久久| 精品国产99久久久久久| 精品国产伦一区二区三区观看方式 | 国精产品一区一区三区mba下载| 亚洲国产精品久久| 中文字幕+乱码+中文乱码91| 夜夜精品视频一区二区| 一道本在线观看| 国产精品亚洲视频| 欧美韩国日本在线| 欧美91视频| 欧美亚洲精品日韩| 欧美经典影片视频网站| 日本成熟性欧美| av毛片在线看| 亚洲香蕉成人av网站在线观看| 国产老女人乱淫免费| 欧美日韩国产影院| 一区二区成人免费视频| 久久精品视频免费| 精品人妻二区中文字幕| 日本在线不卡一区| 日本中文字幕网址| 亚洲色图二区| 午夜欧美性电影| 欧美18免费视频| 99热99热| 亚洲伊人精品酒店| 日韩免费观看网站| av成人 com a| 欧美男插女视频| 幼a在线观看| 亚洲欧洲在线播放| 全国男人的天堂网| 日韩一区二区精品在线观看| 亚洲天堂视频在线播放| 欧美日韩亚洲成人| 99视频在线看| 有码一区二区三区| 亚洲欧美卡通动漫| 国产欧美va欧美不卡在线| 中文精品在线观看| 成人av综合在线| 在线观看亚洲免费视频| 国产精品一区二区在线观看不卡| 香蕉视频999| 免费成人在线视频观看| 国产精品亚洲二区在线观看| 亚洲日本欧美| 久久久久久久9| 国产一区日韩欧美| a级黄色片免费| 中文一区一区三区免费在线观看| 五月天国产一区| 欧美日韩在线二区| 欧美亚洲免费在线| 美女久久99| 欧美一区二区福利| 精品久久国产| 亚洲国产一区二区精品视频 | 69sex久久精品国产麻豆| 欧美激情第10页| avav在线播放| 99精品国产福利在线观看免费 | 国产一区二区三区免费看 | 久久国产精品电影| 91麻豆免费在线视频| 美女精品视频一区| 欧美24videosex性欧美| 久久久久久有精品国产| 黄色在线网站噜噜噜| 欧美亚洲第一页| 精品国模一区二区三区| 国产日韩av高清| 高清一区二区中文字幕| 亚洲bt天天射| 国产精品一区二区中文字幕| 久久99欧美| 国内成人精品| 影音先锋男人的网站| 国产综合久久| 丰满人妻中伦妇伦精品app| 日韩在线一二三区| www.色就是色.com| 粉嫩aⅴ一区二区三区四区 | 999久久久久| 亚洲二区中文字幕| 久草视频在线看| 中文字幕日韩有码| 欧美xxxxhdvideosex| 欧美一区二区.| 91麻豆精品| 国产在线精品一区二区三区》 | 无码国模国产在线观看| 国产一区二区三区无遮挡| 国产成人精品一区二区免费看京 | 91桃色在线| 国产福利精品av综合导导航| 精品999日本久久久影院| 国产一区二区中文字幕免费看| 国模精品一区| 黄色片免费在线观看视频| 久久天堂精品| 黑人巨大猛交丰满少妇| 久久综合av免费| 岛国毛片在线观看| 日本韩国一区二区| 亚洲成人第一区| 中文字幕日韩精品在线| www.youjizz.com在线| 国产精品视频一| 日本成人a网站| 九九久久九九久久| 久久天堂成人| 中文字幕天堂av| 亚洲国产成人午夜在线一区| 国产一级中文字幕| 欧美日韩和欧美的一区二区| 天堂中文字幕av| 美女撒尿一区二区三区| 日韩精品三区| 精品不卡在线| 欧美.日韩.国产.一区.二区| 99视频在线视频| av在线免费不卡| 亚洲最大的黄色网址| 在线亚洲人成电影网站色www| 亚洲国产av一区二区| 中文字幕欧美精品在线| 亚洲优女在线| 国产伦精品一区二区三区视频黑人| 91综合久久一区二区| 99蜜桃臀久久久欧美精品网站| 国产电影一区在线| 色哟哟一一国产精品| 欧美中文一区二区三区| 日韩美女一级视频| 久久频这里精品99香蕉| chinese国产精品| 日韩欧美ww| 国产成人福利视频| 亚洲五码在线| 国产日本欧美在线| 日韩高清一区二区| 国产肉体xxxx裸体784大胆| 日韩毛片一二三区| 亚洲一区二区人妻| 国产一区二区三区在线视频| 黄色软件视频在线观看| 国产欧美亚洲日本| 红桃视频欧美| 风韵丰满熟妇啪啪区老熟熟女| 亚洲欧美偷拍卡通变态| 国产精品日韩无码| 久久亚洲综合国产精品99麻豆精品福利| 手机看片久久| 日韩一本精品| 免费观看30秒视频久久| 我不卡一区二区| 欧美在线一二三| 成人av毛片| 国产精品一区二区久久国产| 日韩在线视屏| 99日在线视频| 亚洲精品美腿丝袜| 性色av蜜臀av| 久久久久国产精品免费网站| 999国产精品一区| 日本www在线视频| ww亚洲ww在线观看国产| 四虎影院在线免费播放| 综合久久五月天| **国产精品| 日韩精品一区二区免费| 99re66热这里只有精品3直播| 在线观看 中文字幕| 日韩成人av一区| 国产一区一一区高清不卡| 亚洲乱码一区二区三区| 国产一区二区三区久久悠悠色av| 色在线观看视频| 欧美精品一区二| 欧美xoxoxo| 一区二区三区四区视频在线| 国产一区日韩二区欧美三区| 久久久久久免费观看| 亚洲精品99久久久久中文字幕| 午夜影院一区| 亚洲毛片aa| 国产成a人亚洲| 麻豆精品久久久久久久99蜜桃| 伊人久久大香线蕉av一区二区| 亚洲精品自拍| 成年人看的毛片| 国产日韩av一区二区| www.日韩在线观看| 国产98色在线| 欧美激情亚洲| 国产又粗又猛又爽视频| 欧美一区二区三区电影| 涩涩在线视频| 26uuu成人| 91一区二区在线观看| 一级淫片免费看| 456国产精品| 国产精品成人a在线观看| 免费a v网站| 欧美精品123区| 在线观看爽视频| 日韩不卡一二区| 国产亚洲制服色| 好吊视频一区二区三区| 国产噜噜噜噜久久久久久久久| 亚洲精选91| 国产成人综合在线视频| 亚洲免费伊人电影在线观看av| 久久69av| 狠狠操狠狠干视频|