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

亚洲国产精品大全| 亚洲成人免费在线| 5g国产欧美日韩视频| 日韩免费av片| 日韩大片在线观看| 欧美videos中文字幕| 老熟妇仑乱视频一区二区| aaa大片在线观看| 26uuu国产日韩综合| 91久久国产婷婷一区二区| 亚洲欧美在线视频免费| 亚洲成人一区| 亚洲热线99精品视频| 中文字幕人妻无码系列第三区| 国产精品xx| 亚洲蜜桃精久久久久久久| 蜜桃视频在线观看成人| 99久久久无码国产精品免费| 日日夜夜一区二区| 欧美极品在线视频| 97在线观看免费高| 欧美一二区在线观看| 精品国产一区二区三区av性色| 国产原创精品在线| 黄色亚洲网站| 精品日本高清在线播放| 今天免费高清在线观看国语| 日本在线看片免费人成视1000| 91麻豆福利精品推荐| 粉嫩av四季av绯色av第一区 | 亚洲国产欧美在线| 在线观看亚洲视频啊啊啊啊| 精品视频二区| 91亚洲永久精品| 99c视频在线| 国产精品久久久久久久久久久久久久久久久久| 免费久久99精品国产自在现线| 欧美丰满少妇xxxx| 永久免费看黄网站| 一本一道久久a久久精品蜜桃 | 老牛影视免费一区二区| 欧美熟妇另类久久久久久不卡 | 在线视频一区二区三区| 337p粉嫩大胆噜噜噜鲁| 麻豆视频在线看| 亚洲成人av一区二区三区| 激情五月婷婷六月| 三级福利片在线观看| 一区二区三区四区不卡视频| 国产成人三级视频| 182tv在线播放| 亚洲精品videosex极品| 国产成人一二三区| 日本三级在线观看网站| 亚洲综合精品自拍| 久久99久久久久久| 草草视频在线观看| 欧美性猛交xxxx乱大交| 久久久久久久久久福利| 久久久人成影片一区二区三区在哪下载 | 一级一片免费看| 日韩中文字幕亚洲一区二区va在线| 奇米四色中文综合久久| 国产精品免费无遮挡无码永久视频| 久久最新视频| 91精品久久久久久久久久入口| 国产又粗又猛又爽又黄的| 国产一区二区伦理| 国产精品一 二 三| 日韩av视屏| 欧美精彩视频一区二区三区| 偷拍盗摄高潮叫床对白清晰| 99热国产在线| 欧美日韩国产一区在线| 成年人免费大片| 亚洲91在线| 精品久久久久久久久久久久包黑料 | 国产孕妇孕交大片孕| 国产传媒一区在线| 精品在线视频一区二区| 爱爱爱免费视频在线观看| 亚洲欧洲www| 欧美国产视频一区| 国模套图日韩精品一区二区| 777久久久精品| 日韩精品人妻中文字幕有码 | 在线视频一二三区| а√在线中文网新版地址在线| 日本精品一级二级| 又黄又爽又色的视频| 亚洲综合图色| 成人97在线观看视频| 欧美三级一区二区三区| 老汉av免费一区二区三区| 不卡一区二区三区视频| 黄色av免费在线看| 一区二区在线免费观看| 国产免费视频传媒| 成人激情久久| 亚洲人成77777在线观看网| 美女的奶胸大爽爽大片| 琪琪一区二区三区| 国产69精品久久久久9999apgf| 国产系列电影在线播放网址| 亚洲综合清纯丝袜自拍| 一本色道久久亚洲综合精品蜜桃| 国内精品偷拍| 久久国产精品久久精品| 日韩欧美在线观看免费| 成人丝袜18视频在线观看| 亚洲电影网站| 筱崎爱全乳无删减在线观看| 欧美一级欧美三级| 天天操天天干天天操天天干| 影音先锋中文字幕一区| 91最新国产视频| 国产中文在线观看| 欧美日韩免费在线观看| 激情av中文字幕| 亚洲成人av| 国产精品久久久久久网站| 婷婷在线免费视频| 亚洲精品成人少妇| 中文字幕第22页| 999久久久国产精品| 国产成人精品网站| 亚洲日本香蕉视频| 午夜伦欧美伦电影理论片| 亚洲精品鲁一鲁一区二区三区| 成人羞羞网站入口| 国产精品久久久久av免费| 色中色在线视频| 亚洲超丰满肉感bbw| 欧美日韩一区二区区别是什么| 91久久夜色精品国产按摩| 国产精品高潮呻吟久久av黑人| 暖暖视频在线免费观看| 亚洲成av人片在线观看无码| 国产精品二区视频| 欧美国产三区| 99视频网站| 亚洲无线看天堂av| 日韩欧美高清一区| 国产亚洲第一页| 国产v日产∨综合v精品视频| 国产黄色激情视频| 成人自拍在线| 97超碰蝌蚪网人人做人人爽| 天天干,夜夜操| 精品久久久久久国产| 精品一区二区视频在线观看| 国产日韩精品视频一区二区三区| 精品一区二区三区自拍图片区 | 中文字幕在线看高清电影| 亚洲人www| 久久精品美女| 久久人体大尺度| 尤物yw午夜国产精品视频明星| 国产成人精品一区二区色戒| 国产精品久久久一本精品| 三区视频在线观看| 欧美精选一区| 精品国产一区二区三区免费| av日韩电影| 日韩中文字幕网| 国产91视频在线| 亚洲成人你懂的| 无码少妇精品一区二区免费动态| 免费美女久久99| 水蜜桃在线免费观看| 国产精品毛片视频| 人妖精品videosex性欧美| 国产福利在线| 欧美一卡二卡在线观看| 日本中文字幕免费| 国产亚洲一区二区三区| 欧美激情第3页| 亚洲精品1区| 日本免费高清一区二区| 精品麻豆剧传媒av国产九九九| 欧美激情一二区| 国产视频二区在线观看| 欧美一区二区三区四区在线观看| 亚洲精品国产精品乱码| 国产精品三级电影| jjzz黄色片| 日本一不卡视频| 青草视频在线观看视频| 日产精品一区二区| 国产精品亚洲综合| 亚洲精品一区二区在线播放∴| 欧美激情小视频| 97超碰人人在线| 亚洲精品在线电影| 在线观看不卡的av| 亚洲福利一区二区| 精品在线观看一区| 99久久99久久综合| 九九热视频免费| 日日欢夜夜爽一区| 日韩精品在线视频免费观看| 日韩综合一区| 久久精品国产精品国产精品污| 麻豆一二三区精品蜜桃| 国产成人一区二区三区| √天堂8资源中文在线| 日韩在线观看精品| 欧美一区二区少妇| 精品av综合导航| 91精品视频免费在线观看 | 99热这里只有精品在线观看| 91九色02白丝porn| 精品成人久久久| 亚洲综合一区二区三区| 日本女人性生活视频| 久久久www成人免费毛片麻豆| 久久久久99人妻一区二区三区 | 国产麻豆xxxvideo实拍| 国产一区二区看久久| 中文字幕第38页| 日本在线播放一区二区三区| 青青青在线播放| 9色精品在线| 亚洲国产精品无码av| 亚洲九九视频| 国产精品h视频| 日韩.com| 亚洲精品久久区二区三区蜜桃臀 | 亚洲丝袜一区在线| 深夜福利在线看| 精品日韩在线一区| 亚洲第一成年人网站| 日韩一级黄色大片| 99精品视频在线播放免费| 911精品产国品一二三产区| 在线观看中文字幕码| 欧美午夜精品一区二区蜜桃| 亚洲无码精品一区二区三区| 日韩欧美中文在线| 黄色片视频免费| 欧美性极品xxxx做受| 亚洲高清毛片一区二区| 欧美丝袜美女中出在线| 午夜婷婷在线观看| 日本精品免费观看高清观看| 亚洲综合久久网| 欧美亚洲愉拍一区二区| 特级西西444www高清大视频| 欧美日韩一区二区电影| 亚洲午夜激情视频| 91精选在线观看| 国产成人毛毛毛片| 精品乱人伦小说| 天天色综合久久| 亚洲精品一区av在线播放| 国产在线一二| 色偷偷av一区二区三区乱| 毛片在线不卡| 久久99久久99精品免观看粉嫩 | 日本在线免费网| 欧美精品一二区| www成人免费观看| 国产成人精彩在线视频九色| 欧美美女福利视频| 91精品久久久久久蜜桃| 大桥未久女教师av一区二区| 蜜桃成人在线| 久久免费大视频| 少妇一晚三次一区二区三区| 亚洲精选在线| 美女网站色免费| 国产成人无遮挡在线视频| 国产精品无码网站| 中文字幕国产一区| 国产一级理论片| 狠狠色狠狠色综合日日五| 中文在线最新版天堂| 日韩欧美在线影院| 日韩电影在线观看完整版| 日日噜噜噜夜夜爽亚洲精品| 精灵使的剑舞无删减版在线观看| 日本不卡高字幕在线2019| 日本黄色成人| 久久国产精品 国产精品| 色喇叭免费久久综合网| 欧美乱大交xxxxx潮喷l头像| 人人精品人人爱| 男人添女人荫蒂国产| 久久久久久麻豆| 国产67194| 色婷婷av一区二区三区gif | 亚洲片在线观看| 青青在线视频| 国产精品美女主播在线观看纯欲| 亚洲欧洲国产精品一区| 亚洲精品在线观看免费| 亚洲成人直播| theporn国产精品| 久久伊人蜜桃av一区二区| 欧美日韩在线视频免费| 欧美最猛黑人xxxxx猛交| 亚洲精品久久久狠狠狠爱| 在线性视频日韩欧美| 理论不卡电影大全神| 91精品视频网站| 成人高清av| 欧美日韩在线中文| 国产 欧美在线| 国产第一页浮力| 在线免费观看日本欧美| 视频一区 中文字幕| 久久国产精品久久精品| 欧美亚洲人成在线| 色噜噜狠狠一区二区三区| 99精品国产福利在线观看免费| 国产在线视频三区| 中文字幕乱码日本亚洲一区二区| 国产午夜免费福利| 精品99999| 少女频道在线观看免费播放电视剧| 国产精品露脸av在线| 中文字幕av一区二区三区人| 日日摸日日碰夜夜爽无码| 成人一级片在线观看| 国产精品久久久久久久精| 欧美精品在线观看一区二区| yourporn在线观看视频| 日韩免费在线视频| 竹菊久久久久久久| 免费在线a视频| youjizz久久| 好吊操这里只有精品| 亚洲精品720p| 蜜桃av在线播放| 久久99精品久久久久久久久久| 99精品99| 黄瓜视频污在线观看| 色综合色综合色综合 | 九九久久国产精品| 日本99精品| wwwwww欧美| 波多野结衣在线一区| 福利一区二区三区四区| 亚洲国产精品va| 中国色在线日|韩| 欧美一区二区影视| 日韩—二三区免费观看av| 国产黄色大片免费看| 欧美日韩精品三区| 免费av在线网站| 91久久久久久久一区二区| 欧美.www| 国产麻豆剧传媒精品国产av| 午夜精品福利一区二区三区av| 在线观看xxx| 国产精品va在线| 五月开心六月丁香综合色啪| 日本黄色www| 欧美日韩色婷婷| 国产在线观看高清视频| 成人激情视频网| 亚洲无线视频| 成人乱码一区二区三区av| 欧美色综合久久| 欧美人与牲禽动交com| 国产一区二区黄色| 日韩精品高清不卡| 永久免费看片直接| 精品国产a毛片| 久久人体大尺度| 欧美xxxx吸乳| 99精品欧美一区二区三区小说| 中文天堂在线视频| 欧美大尺度激情区在线播放| 全球av集中精品导航福利| 欧美三级理论片| 夜夜嗨av一区二区三区网页| 日漫免费在线观看网站| 成人国产亚洲精品a区天堂华泰| 欧美成人一品| 免费黄色在线视频| 欧美高清一级片在线| 麻豆视频在线看| 伊人av成人| 91在线视频观看| 国产又黄又大又粗的视频| 久久久欧美一区二区| 欧美色图激情小说| 东京热av一区| 欧美日韩国产综合视频在线观看| 牛牛电影国产一区二区| 日日夜夜精品网站| 成人听书哪个软件好| 91精品人妻一区二区三区果冻| 欧美一二三视频| 欧美激情性爽国产精品17p| 国产免费一区二区三区网站免费| 精品国一区二区三区| 日本免费一区二区三区等视频| www国产精品内射老熟女|