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

并發情況下,你還在用Random生成隨機數?

開發 前端
在代碼中生成隨機數,是一個非常常用的功能,并且JDK已經提供了一個現成的Random類來實現它,并且Random類是線程安全的。

[[391305]]

前言

在代碼中生成隨機數,是一個非常常用的功能,并且JDK已經提供了一個現成的Random類來實現它,并且Random類是線程安全的。

下面是Random.next()生成一個隨機整數的實現:

  1. protected int next(int bits) { 
  2.     long oldseed, nextseed; 
  3.     AtomicLong seed = this.seed; 
  4.     do { 
  5.         oldseed = seed.get(); 
  6.         nextseed = (oldseed * multiplier + addend) & mask; 
  7.       //CAS 有競爭是效率低下 
  8.     } while (!seed.compareAndSet(oldseed, nextseed)); 
  9.     return (int)(nextseed >>> (48 - bits)); 

不難看到,上面的方法中使用CAS操作更新seed,在大量線程競爭的場景下,這個CAS操作很可能失敗,失敗了就會重試,而這個重試又會消耗CPU運算,從而使得性能大大下降了。

因此,雖然Random是線程安全的,但是并不是“高并發”的。

為了改進這個問題,增強隨機數生成器在高并發環境中的性能,于是乎,就有了ThreadLocalRandom——一個性能強悍的高并發隨機數生成器。

ThreadLocalRandom繼承自Random,根據里氏代換原則,這說明ThreadLocalRandom提供了和Random相同的隨機數生成功能,只是實現算法略有不同。

在Thread中的變量

為了應對線程競爭,Java中有一個ThreadLocal類,為每一個線程分配了一個獨立的,互不相干的存儲空間。

ThreadLocal的實現依賴于Thread對象中的ThreadLocal.ThreadLocalMap threadLocals成員字段。

與之類似,為了讓隨機數生成器只訪問本地線程數據,從而避免競爭,在Thread中,又增加了3個成員:

  1. /** The current seed for a ThreadLocalRandom */ 
  2.  @sun.misc.Contended("tlr"
  3.  long threadLocalRandomSeed; 
  4.  /** Probe hash value; nonzero if threadLocalRandomSeed initialized */ 
  5.  @sun.misc.Contended("tlr"
  6.  int threadLocalRandomProbe; 
  7.  /** Secondary seed isolated from public ThreadLocalRandom sequence */ 
  8.  @sun.misc.Contended("tlr"
  9.  int threadLocalRandomSecondarySeed; 

這3個字段作為Thread類的成員,便自然和每一個Thread對象牢牢得捆綁在一起,因此成為了名副其實的ThreadLocal變量,而依賴這幾個變量實現的隨機數生成器,也就成為了ThreadLocalRandom。

消除偽共享

不知道大家有沒有注意到, 在這些變量上面,都帶有一個注解@sun.misc.Contended,這個注解是干什么用的呢?要了解這個,大家得先知道一下并發編程中的一個重要問題——偽共享

我們知道,CPU是不直接訪問內存的,數據都是從高速緩存中加載到寄存器的,高速緩存又有L1,L2,L3等層級。在這里,我們先簡化這些負責的層級關系,假設只有一級緩存和一個主內存。

CPU讀取和更新緩存的時候,是以行為單位進行的,也叫一個cache line,一行一般64字節,也就是8個long的長度。

因此,問題就來了,一個緩存行可以放多個變量,如果多個線程同時訪問的不同的變量,而這些不同的變量又恰好位于同一個緩存行,那會發生什么呢?

 

如上圖所示,X,Y為相鄰2個變量,位于同一個緩存行,兩個CPU core1 core2都加載了他們,core1更新X,同時,core2更新Y,由于數據的讀取和更新是以緩存行為單位的,這就意味著當這2件事同時發生時,就產生了競爭,導致core1和core2有可能需要重新刷新自己的數據(緩存行被對方更新了),這就導致系統的性能大大折扣,這就是偽共享問題。

那怎么改進呢?如下圖:


上圖中,我們把X單獨占用一個緩存行,Y單獨占用一個緩存行,這樣各自更新和讀取,都不會有任何影響了。

而上述代碼中的@sun.misc.Contended("tlr")就會在虛擬機層面,幫助我們在變量的前后生成一些padding,使得被標注的變量位于同一個緩存行,不與其它變量沖突。

在Thread對象中,成員變量threadLocalRandomSeed,threadLocalRandomProbe,threadLocalRandomSecondarySeed被標記為同一個組tlr,使得這3個變量放置于一個單獨的緩存行,而不與其它變量發生沖突,從而提高在并發環境中的訪問速度。

反射的高效替代方案

隨機數的產生需要訪問Thread的threadLocalRandomSeed等成員,但是考慮到類的封裝性,這些成員卻是包內可見的。

很不幸,ThreadLocalRandom位于java.util.concurrent包,而Thread則位于java.lang包,因此,ThreadLocalRandom并沒有辦法訪問Thread的threadLocalRandomSeed等變量。

這時,Java老鳥們可能就會跳出來說:這算什么,看我的反射大法,不管啥都能摳出來訪問一下。

說的不錯,反射是一種可以繞過封裝,直接訪問對象內部數據的方法,但是,反射的性能不太好,并不適合作為一個高性能的解決方案。

有沒有什么辦法可以讓ThreadLocalRandom訪問Thread的內部成員,同時又具有遠超于反射的,且無限接近于直接變量訪問的方法呢?答案是肯定的,這就是使用Unsafe類。

這里,就簡單介紹一下用的兩個Unsafe的方法:

  1. public native long    getLong(Object o, long offset); 
  2. public native void    putLong(Object o, long offset, long x); 

其中getLong()方法,會讀取對象o的第offset字節偏移量的一個long型數據;putLong()則會將x寫入對象o的第offset個字節的偏移量中。

這類類似C的操作方法,帶來了極大的性能提升,更重要的是,由于它避開了字段名,直接使用偏移量,就可以輕松繞過成員的可見性限制了。

性能問題解決了,那下一個問題是,我怎么知道threadLocalRandomSeed成員在Thread中的偏移位置呢,這就需要用unsafe的objectFieldOffset()方法了,請看下面的代碼:


上述這段static代碼,在ThreadLocalRandom類初始化的時候,就取得了Thread成員變量threadLocalRandomSeed,threadLocalRandomProbe,threadLocalRandomSecondarySeed在對象偏移中的位置。

因此,只要ThreadLocalRandom需要使用這些變量,都可以通過unsafe的getLong()和putLong()來進行訪問(也可能是getInt()和putInt())。

比如在生成一個隨機數的時候:

  1. protected int next(int bits) { 
  2.      return (int)(mix64(nextSeed()) >>> (64 - bits)); 
  3.  } 
  4.  final long nextSeed() { 
  5.      Thread t; long r; // read and update per-thread seed 
  6.      //在ThreadLocalRandom中,訪問了Thread的threadLocalRandomSeed變量 
  7.      UNSAFE.putLong(t = Thread.currentThread(), SEED, 
  8.                     r = UNSAFE.getLong(t, SEED) + GAMMA); 
  9.      return r; 
  10.  } 

這種Unsafe的方法掉地能有多快呢,讓我們一起看做個試驗看看:

這里,我們自己寫一個ThreadTest類,使用反射和unsafe兩種方法,來不停讀寫threadLocalRandomSeed成員變量,比較它們的性能差異,代碼如下:


上述代碼中,分別使用反射方式byReflection() 和Unsafe的方式byUnsafe()來讀寫threadLocalRandomSeed變量1億次,得到的測試結果如下:

  1. byUnsafe spend :171ms 
  2. byReflection spend :645ms 

不難看到,使用Unsafe的方法遠遠優于反射的方法,這也是JDK內部,大量使用Unsafe來替代反射的原因之一。

隨機數種子

我們知道,偽隨機數生成都需要一個種子,threadLocalRandomSeed和threadLocalRandomSecondarySeed就是這里的種子。其中threadLocalRandomSeed是long型的,threadLocalRandomSecondarySeed是int。

threadLocalRandomSeed是使用最廣泛的大量的隨機數其實都是基于threadLocalRandomSeed的。而threadLocalRandomSecondarySeed只是某些特定的JDK內部實現中有使用,使用并不廣泛。

初始種子默認使用的是系統時間:


上述代碼中完成了種子的初始化,并將初始化的種子通過UNSAFE存在SEED的位置(即threadLocalRandomSeed)。

接著就可以使用nextInt()方法獲得隨機整數了:

  1. public int nextInt() { 
  2.     return mix32(nextSeed()); 
  3. }     
  4. final long nextSeed() { 
  5.     Thread t; long r; // read and update per-thread seed 
  6.     UNSAFE.putLong(t = Thread.currentThread(), SEED, 
  7.                    r = UNSAFE.getLong(t, SEED) + GAMMA); 
  8.     return r; 

每一次調用nextInt()都會使用nextSeed()更新threadLocalRandomSeed。由于這是一個線程獨有的變量,因此完全不會有競爭,也不會有CAS的重試,性能也就大大提高了。

探針Probe的作用

除了種子外,還有一個threadLocalRandomProbe探針變量,這個變量是用來做什么的呢?

我們可以把threadLocalRandomProbe 理解為一個針對每個Thread的Hash值(不為0),它可以用來作為一個線程的特征值,基于這個值可以為線程在數組中找到一個特定的位置。

  1. static final int getProbe() { 
  2.     return UNSAFE.getInt(Thread.currentThread(), PROBE); 

來看一個代碼片段:

  1. CounterCell[] as; long b, s; 
  2. if ((as = counterCells) != null || 
  3.     !U.compareAndSwapLong(this, BASECOUNT, b = baseCount, s = b + x)) { 
  4.     CounterCell a; long v; int m; 
  5.     boolean uncontended = true
  6.     if (as == null || (m = as.length - 1) < 0 || 
  7.         // 使用probe,為每個線程找到一個在數組as中的位置 
  8.         // 由于每個線程的probe值不一樣,因此大概率 每個線程對應的數組中的元素也是不一樣的 
  9.         // 每個線程對應了不同的元素,就可以沒有沖突的進行完全的并發操作 
  10.         // 因此探針probe在這里 就起到了防止沖突的作用 
  11.         (a = as[ThreadLocalRandom.getProbe() & m]) == null || 
  12.         !(uncontended = 
  13.           U.compareAndSwapLong(a, CELLVALUE, v = a.value, v + x))) { 

在具體的實現中,如果上述代碼發生了沖突,那么,還可以使用ThreadLocalRandom.advanceProbe()方法來修改一個線程的探針值,這樣可以進一步避免未來可能得沖突,從而減少競爭,提高并發性能。

  1. static final int advanceProbe(int probe) { 
  2.     //根據當前探針值,計算一個更新的探針值 
  3.     probe ^= probe << 13;   // xorshift 
  4.     probe ^= probe >>> 17; 
  5.     probe ^= probe << 5; 
  6.     //更新探針值到線程對象中 即修改了threadLocalRandomProbe變量 
  7.     UNSAFE.putInt(Thread.currentThread(), PROBE, probe); 
  8.     return probe; 

總結

今天,我們介紹了ThreadLocalRandom對象,這是一個高并發環境中的,高性能的隨機數生成器。

我們不但介紹了ThreadLocalRandom的功能和內部實現原理,還介紹介紹了ThreadLocalRandom對象是如何達到高性能的(比如通過偽共享,Unsafe等手段),希望大家可以將這些技術靈活運用到自己的工程中。

小傻瓜們對這個冷門類是否有深一步的理解了?理解了可以在評論區來一波:變得更強

我是敖丙,你知道的越多,不知道的越多,我們下期見。

 

責任編輯:姜華 來源: 三太子敖丙
相關推薦

2020-04-02 11:16:28

Linux進程高并發

2020-09-18 06:36:21

Linuxkernel高并發

2022-12-15 08:54:28

JAVA性能JDK

2019-12-26 14:07:19

隨機數偽隨機多線程

2024-05-15 09:09:49

2024-11-01 15:51:06

2022-09-16 08:42:23

JavaAPI變量

2009-12-02 17:01:01

PHP隨機數rand()

2012-07-19 10:03:32

2022-04-18 07:56:43

分段鎖多線程嵌入式開發

2023-09-14 09:27:19

Java系統

2021-06-15 07:59:01

Java生成隨機數Java編程

2024-11-12 16:28:34

2010-03-22 19:41:31

2019-09-11 10:09:00

Java虛擬機算法

2017-05-29 09:56:25

2010-03-11 12:48:25

Python生成隨機數

2020-03-04 14:05:35

戴爾

2014-07-23 10:07:34

2025-04-02 08:47:23

DOM文檔結構API
點贊
收藏

51CTO技術棧公眾號

国产va免费精品高清在线| 欧美大片在线观看| 国产又大又长又粗又黄| www.午夜激情| 久久这里只有| 欧美大尺度在线观看| 中文字幕xxx| 日本免费一区二区三区视频| 激情亚洲一区二区三区四区| 亚洲日本精品一区| 欧美一级视频免费| 国内精品写真在线观看| 57pao精品| 中文字幕五月天| 欧美男gay| 亚洲精品在线免费播放| 亚欧激情乱码久久久久久久久| 爱情岛论坛亚洲品质自拍视频网站 | 欧美成人合集magnet| 亚洲熟妇无码av| 一区二区免费| 欧美精品v日韩精品v韩国精品v| 国产91xxx| 在线观看免费视频你懂的| 久久久久久日产精品| 成人毛片网站| 99er热精品视频| 久久久久久久欧美精品| 久久久久久亚洲精品中文字幕| 日韩欧美在线视频播放| 国产欧美一区| 亚洲精品国产精品久久清纯直播| 亚洲一区二区三区三州| 日韩一级特黄| 欧美少妇xxx| 任你操这里只有精品| 不卡av免费观看| 亚洲午夜在线电影| 中文字幕免费高| 日本福利在线| 欧美国产一区二区在线观看| 欧美久久久久久久| 青青草av免费在线观看| 91亚洲精华国产精华精华液| 成人片在线免费看| 黑人精品一区二区三区| 丰满放荡岳乱妇91ww| 7777奇米亚洲综合久久| a级片免费观看| 国产一区二区三区国产| 成人欧美一区二区三区在线湿哒哒| 五月激情丁香网| 蜜桃视频在线观看一区| 国产精品免费视频xxxx| 中文字幕在线观看1| 日本成人中文字幕| 国产欧美精品一区二区| 亚洲系列在线观看| 国内成人精品2018免费看| 91亚洲精华国产精华| 国产手机av在线| 国产91富婆露脸刺激对白| aaa级精品久久久国产片| 亚洲不卡免费视频| 成人高清av在线| 久久综合给合久久狠狠色| 国产在线观看网站| 中文无字幕一区二区三区| 三年中文高清在线观看第6集| 欧美另类极品| 一区二区三区精品久久久| 欧洲精品一区二区三区久久| 伊人久久精品一区二区三区| 欧美亚洲国产一区二区三区| 热久久久久久久久| 久久99精品久久久久久欧洲站| 亚洲国产第一页| 无码一区二区三区在线| 99re66热这里只有精品8| 欧美大尺度激情区在线播放| 亚洲 欧美 日韩 综合| 日韩激情一区二区| 成人福利网站在线观看| 免费观看的毛片| 国产清纯在线一区二区www| 在线观看福利一区| 成人性生交大片免费看网站| 欧美系列日韩一区| 国产a√精品区二区三区四区| 一区二区小说| 欧美成aaa人片在线观看蜜臀| 日产欧产va高清| 蜜桃精品视频在线| 国产三区精品| 欧美被日视频| 欧美日韩国产综合视频在线观看中文| 99视频精品免费| 红杏成人性视频免费看| 自拍视频国产精品| 九九热在线视频播放| 激情深爱一区二区| 欧美一区二区视频17c| av网站在线免费看推荐| 日本精品视频一区二区| 又大又长粗又爽又黄少妇视频| 精品国产一区二区三区香蕉沈先生 | 国内精品嫩模av私拍在线观看| 日本欧美精品在线| 空姐吹箫视频大全| 国产精品久久久久久亚洲伦| 成熟丰满熟妇高潮xxxxx视频| 福利一区三区| 中文字幕亚洲一区二区三区| 日韩av片在线播放| 国产一区二区三区国产| 日韩妆和欧美的一区二区| 91色在线看| 欧美一区二区三区色| 久操视频在线观看免费| 亚洲毛片网站| 97久草视频| 黄色在线免费网站| 在线观看精品一区| 丰满少妇在线观看资源站| 好看的亚洲午夜视频在线| 成人网欧美在线视频| jizz在线观看视频| 色94色欧美sute亚洲线路一ni| 中文字幕在线永久| 国产精品v日韩精品v欧美精品网站 | 久久久久久久久久久亚洲| 国产三级精品在线观看| 国产精品久久久久久久岛一牛影视| 欧美 日韩 激情| 香蕉久久精品日日躁夜夜躁| 高清视频欧美一级| 黄色一级大片在线免费看国产| 亚洲欧美电影一区二区| 天天综合天天添夜夜添狠狠添| 久久在线播放| 国产女精品视频网站免费| 自拍视频在线免费观看| 欧美三级日韩在线| 国产一区二区三区视频播放| 美国一区二区三区在线播放| 午夜精品亚洲一区二区三区嫩草 | 亚洲二区在线播放| 精品一区二区三区视频| 在线观看免费91| 日韩福利影视| 九九热这里只有精品免费看| 99久久精品无免国产免费| 亚洲精品水蜜桃| 一二三区视频在线观看| 影音国产精品| 免费看成人午夜电影| 日韩欧美看国产| 中文字幕日韩综合av| 亚洲天堂免费av| 亚洲日本在线看| 亚洲美女精品视频| 一道本一区二区| 色吧亚洲视频| 成人51免费| 久久免费视频网| 精品欧美不卡一区二区在线观看| 欧美怡红院视频| 杨钰莹一级淫片aaaaaa播放| 国产iv一区二区三区| 男女视频网站在线观看| 国产探花一区在线观看| 成人观看高清在线观看免费| 污视频网站在线免费| 亚洲精品久久视频| 日本熟妇一区二区三区| 国产精品久久久久久久久免费相片 | 中文字幕一区电影| 亚洲春色一区二区三区| 欧美日韩亚洲一区二| 亚洲色图 激情小说| 国产精品一区二区免费不卡| 浮妇高潮喷白浆视频| 欧美日韩国产传媒| 波多野结衣久草一区| 欧美电影免费观看| 久久69精品久久久久久久电影好| 国产又爽又黄网站亚洲视频123| 欧美日韩在线三区| 日韩xxxxxxxxx| 中文字幕日韩一区| 菠萝菠萝蜜网站| 国内精品视频666| 亚洲爆乳无码专区| 亚洲综合色站| 日本一区二区三区在线视频 | 久草精品在线观看| 免费一级特黄特色毛片久久看| 欧美色婷婷久久99精品红桃| 9a蜜桃久久久久久免费| 国产福利亚洲| 2021国产精品视频| а√天堂资源地址在线下载| 亚洲丝袜av一区| 亚洲免费黄色片| 欧美日韩黄色一区二区| 色播视频在线播放| 亚洲美女视频一区| 成人小视频免费看| 久久这里只有精品首页| 欧美日韩一区二区区| 日本91福利区| av免费在线播放网站| 亚洲大胆av| 永久免费网站视频在线观看| 精品国产一区二区三区香蕉沈先生| 极品尤物一区二区三区| 欧美激情三级| 91老司机在线| 成人在线观看免费视频| 人人爽久久涩噜噜噜网站| 国产一线二线在线观看| 久久亚洲精品国产亚洲老地址| 丁香在线视频| 夜夜嗨av一区二区三区四区| 五月天激情婷婷| 日韩欧美一区二区在线视频| 在线观看国产精品视频| 91国内精品野花午夜精品| 日韩精品1区2区| 亚洲一级片在线观看| 丁香花五月激情| 亚洲免费观看在线视频| 日本成人精品视频| 欧美国产综合色视频| 国产又粗又黄又猛| 久久久久久久久久久黄色| 色天使在线视频| 91免费版在线| 在线观看av中文字幕| 成人国产精品免费观看视频| 日本少妇xxxx软件| 高清av一区二区| 美女久久久久久久久| 丁香一区二区三区| 中国av免费看| 久久综合五月天婷婷伊人| 精品人妻一区二区三区视频| 国产视频视频一区| jizz日本在线播放| 综合久久国产九一剧情麻豆| 国产精品视频一区二区三| 亚洲欧美日韩在线不卡| 欧美黄色免费观看| 五月婷婷久久综合| 天堂中文在线网| 欧洲一区二区av| 国产精品露脸视频| 欧美福利视频一区| 亚洲av无码一区二区三区dv| 精品国产三级电影在线观看| 四虎精品成人免费网站| 亚洲人成免费电影| 麻豆影院在线观看| 欧美激情按摩在线| 无遮挡在线观看| 国产精品美女久久| 涩爱av色老久久精品偷偷鲁| 精品一卡二卡三卡四卡日本乱码 | 成年在线观看视频| 国产日韩亚洲| 亚洲三级视频网站| 国产寡妇亲子伦一区二区| 99久久人妻精品免费二区| 久久蜜臀精品av| 一区二区国产精品精华液| 亚洲成人www| 中国一级片黄色一级片黄| 欧美一级在线观看| 欧美巨乳在线| 日韩有码在线观看| 日韩电影免费看| 国产日韩亚洲欧美| 久久悠悠精品综合网| 午夜精品一区二区在线观看| 欧美日韩视频| 亚洲人成无码www久久久| 国产麻豆精品在线| 久操视频免费看| 亚洲制服欧美中文字幕中文字幕| 无码一区二区三区| 精品国产三级电影在线观看| 成人免费在线观看| 国语自产在线不卡| 亚洲精品毛片| 蜜桃视频在线观看成人| 自拍偷拍欧美专区| 五月天婷婷激情视频| 成人高清视频免费观看| 中日韩一级黄色片| 一本一道综合狠狠老| 亚洲精品911| 日韩在线一区二区三区免费视频| av中文字幕在线看| 91久热免费在线视频| 精品视频网站| 欧美a在线视频| 国产成人精品三级麻豆| 人成免费在线视频| 色悠悠久久综合| 日韩有码第一页| 九九热最新视频//这里只有精品| 日本在线中文字幕一区二区三区| 国产丝袜不卡| 国语自产精品视频在线看8查询8| 岛国av在线免费| 国产欧美视频一区二区三区| 亚洲男人的天堂在线视频| 欧美α欧美αv大片| 国产激情小视频在线| 国产精品久久中文| 国产成人精品999在线观看| 欧美日韩一道本| 成人精品高清在线| 久久久一区二区三区四区| 91精品福利在线一区二区三区| 91福利在线视频| 国产精品电影观看| 国产成人久久| 99久久激情视频| 久久久久九九视频| 九一国产在线观看| 国产视频精品一区二区三区| av男人的天堂在线观看| 福利精品视频| 国产精品草草| 亚洲精品成人无码毛片| 亚洲最大成人网4388xx| www.国产免费| 欧美激情国产精品| 成人自拍在线| 日本中文字幕网址| 97久久精品人人爽人人爽蜜臀| 亚洲国产精一区二区三区性色| 亚洲精品在线一区二区| 超碰资源在线| 精品免费二区三区三区高中清不卡 | 日韩中文字幕国产| 91精品网站在线观看| 穿情趣内衣被c到高潮视频| 国产精品一区二区无线| 久久久久性色av无码一区二区| 欧美va亚洲va香蕉在线| √最新版天堂资源网在线| 久久综合中文色婷婷| 久久在线精品| 久久人妻无码aⅴ毛片a片app| 91精品福利在线一区二区三区 | 亚洲一级电影视频| 五月婷婷狠狠干| 国产999精品久久久| 成人羞羞动漫| 中文字幕人妻无码系列第三区| 亚洲一区二区中文在线| 头脑特工队2免费完整版在线观看| 国产97免费视| 亚洲理论电影网| 国产高潮视频在线观看| 色老综合老女人久久久| 91精品专区| 国产免费一区二区| 日韩电影在线免费观看| 91精品国产闺蜜国产在线闺蜜| 精品伦理精品一区| 婷婷六月国产精品久久不卡| 婷婷久久青草热一区二区 | 性色av一区二区怡红| 亚洲一级黄色录像| 日韩欧美久久久| 韩国美女久久| 五月天激情图片| 久久精品男人天堂av| 国产suv精品一区二区69| 91av在线播放视频| 欧美顶级大胆免费视频| 国产51自产区| 欧美色图在线观看| av中文字幕在线看| 在线观看成人av| 久久一区二区视频| 国产a级免费视频| 日韩免费观看高清| 黑丝一区二区三区| 国产第一页精品| 亚洲精品动漫久久久久| 激情久久一区二区| 成人在线免费观看av| 亚洲精品视频免费观看| 精品三级久久久久久久电影聊斋| 成人在线观看网址| 麻豆精品国产传媒mv男同|