久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java并發(fā)工具類(lèi)LongAdder原理實(shí)例解析

瀏覽:129日期:2022-09-01 14:35:43

LongAdder實(shí)現(xiàn)原理圖

Java并發(fā)工具類(lèi)LongAdder原理實(shí)例解析

Java并發(fā)工具類(lèi)LongAdder原理實(shí)例解析

高并發(fā)下N多線程同時(shí)去操作一個(gè)變量會(huì)造成大量線程CAS失敗,然后處于自旋狀態(tài),導(dǎo)致嚴(yán)重浪費(fèi)CPU資源,降低了并發(fā)性。既然AtomicLong性能問(wèn)題是由于過(guò)多線程同時(shí)去競(jìng)爭(zhēng)同一個(gè)變量的更新而降低的,那么如果把一個(gè)變量分解為多個(gè)變量,讓同樣多的線程去競(jìng)爭(zhēng)多個(gè)資源。

LongAdder則是內(nèi)部維護(hù)一個(gè)Cells數(shù)組,每個(gè)Cell里面有一個(gè)初始值為0的long型變量,在同等并發(fā)量的情況下,爭(zhēng)奪單個(gè)變量的線程會(huì)減少,這是變相的減少了爭(zhēng)奪共享資源的并發(fā)量,另外多個(gè)線程在爭(zhēng)奪同一個(gè)原子變量時(shí)候,如果失敗并不是自旋CAS重試,而是嘗試獲取其他原子變量的鎖,最后當(dāng)獲取當(dāng)前值時(shí)候是把所有變量的值累加后再加上base的值返回的。

LongAdder維護(hù)了要給延遲初始化的原子性更新數(shù)組和一個(gè)基值變量base數(shù)組的大小保持是2的N次方大小,數(shù)組表的下標(biāo)使用每個(gè)線程的hashcode值的掩碼表示,數(shù)組里面的變量實(shí)體是Cell類(lèi)型。

Cell 類(lèi)型是Atomic的一個(gè)改進(jìn),用來(lái)減少緩存的爭(zhēng)用,對(duì)于大多數(shù)原子操作字節(jié)填充是浪費(fèi)的,因?yàn)樵硬僮鞫际菬o(wú)規(guī)律的分散在內(nèi)存中進(jìn)行的,多個(gè)原子性操作彼此之間是沒(méi)有接觸的,但是原子性數(shù)組元素彼此相鄰存放將能經(jīng)常共享緩存行,也就是偽共享。所以這在性能上是一個(gè)提升。

另外由于Cells占用內(nèi)存是相對(duì)比較大的,所以一開(kāi)始并不創(chuàng)建,而是在需要時(shí)候再創(chuàng)建,也就是惰性加載,當(dāng)一開(kāi)始沒(méi)有空間時(shí)候,所有的更新都是操作base變量。

java.util.concurrency.atomic.LongAdder是Java8新增的一個(gè)類(lèi),提供了原子累計(jì)值的方法。根據(jù)文檔的描述其性能要優(yōu)于AtomicLong

這里測(cè)試時(shí)基于JDK1.8進(jìn)行的,AtomicLong 從Java8開(kāi)始針對(duì)x86平臺(tái)進(jìn)行了優(yōu)化,使用XADD替換了CAS操作,我們知道JUC下面提供的原子類(lèi)都是基于Unsafe類(lèi)實(shí)現(xiàn)的,并由Unsafe來(lái)提供CAS的能力。CAS (compare-and-swap)本質(zhì)上是由現(xiàn)代CPU在硬件級(jí)實(shí)現(xiàn)的原子指令,允許進(jìn)行無(wú)阻塞,多線程的數(shù)據(jù)操作同時(shí)兼顧了安全性以及效率。大部分情況下,CAS都能夠提供不錯(cuò)的性能,但是在高競(jìng)爭(zhēng)的情況下開(kāi)銷(xiāo)可能會(huì)成倍增長(zhǎng),具體的研究可以參考這篇文章, 我們直接看下代碼:

public class AtomicLong {public final long incrementAndGet() { return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L; }}public final class Unsafe {public final long getAndAddLong(Object var1, long var2, long var4) { long var6; do { var6 = this.getLongVolatile(var1, var2); } while(!this.compareAndSwapLong(var1, var2, var6, var6 + var4)); return var6; }}

getAndAddLong方法會(huì)以volatile的語(yǔ)義去讀需要自增的域的最新值,然后通過(guò)CAS去嘗試更新,正常情況下會(huì)直接成功后返回,但是在高并發(fā)下可能會(huì)同時(shí)有很多線程同時(shí)嘗試這個(gè)過(guò)程,也就是說(shuō)線程A讀到的最新值可能實(shí)際已經(jīng)過(guò)期了,因此需要在while循環(huán)中不斷的重試,造成很多不必要的開(kāi)銷(xiāo),而xadd的相對(duì)來(lái)說(shuō)會(huì)更高效一點(diǎn),偽碼如下,最重要的是下面這段代碼是原子的,也就是說(shuō)其他線程不能打斷它的執(zhí)行或者看到中間值,這條指令是在硬件級(jí)直接支持的:

function FetchAndAdd(address location, int inc) { int value := *location *location := value + inc return value}

而LongAdder的性能比上面那種還要好很多,于是就研究了一下。首先它有一個(gè)基礎(chǔ)的值base,在發(fā)生競(jìng)爭(zhēng)的情況下,會(huì)有一個(gè)Cell數(shù)組用于將不同線程的操作離散到不同的節(jié)點(diǎn)上去(會(huì)根據(jù)需要擴(kuò)容,最大為CPU核數(shù)),sum()會(huì)將所有Cell數(shù)組中的value和base累加作為返回值。核心的思想就是將AtomicLong一個(gè)value的更新壓力分散到多個(gè)value中去,從而降低更新熱點(diǎn)。

Java并發(fā)工具類(lèi)LongAdder原理實(shí)例解析

public class LongAdder extends Striped64 implements Serializable {//...}

LongAdder繼承自Striped64,Striped64內(nèi)部維護(hù)了一個(gè)懶加載的數(shù)組以及一個(gè)額外的base實(shí)例域,數(shù)組的大小是2的N次方,使用每個(gè)線程Thread內(nèi)部的哈希值訪問(wèn)。

abstract class Striped64 extends Number {/** Number of CPUS, to place bound on table size */ static final int NCPU = Runtime.getRuntime().availableProcessors(); /** * Table of cells. When non-null, size is a power of 2. */ transient volatile Cell[] cells; @sun.misc.Contended static final class Cell { volatile long value; Cell(long x) { value = x; } final boolean cas(long cmp, long val) { return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val); } // Unsafe mechanics private static final sun.misc.Unsafe UNSAFE; private static final long valueOffset; static { try {UNSAFE = sun.misc.Unsafe.getUnsafe();Class<?> ak = Cell.class;valueOffset = UNSAFE.objectFieldOffset (ak.getDeclaredField('value')); } catch (Exception e) {throw new Error(e); } } }}

數(shù)組的元素是Cell類(lèi),可以看到Cell類(lèi)用Contended注解修飾,這里主要是解決false sharing(偽共享的問(wèn)題),不過(guò)個(gè)人認(rèn)為偽共享翻譯的不是很好,或者應(yīng)該是錯(cuò)誤的共享,比如兩個(gè)volatile變量被分配到了同一個(gè)緩存行,但是這兩個(gè)的更新在高并發(fā)下會(huì)競(jìng)爭(zhēng),比如線程A去更新變量a,線程B去更新變量b,但是這兩個(gè)變量被分配到了同一個(gè)緩存行,因此會(huì)造成每個(gè)線程都去爭(zhēng)搶緩存行的所有權(quán),例如A獲取了所有權(quán)然后執(zhí)行更新這時(shí)由于volatile的語(yǔ)義會(huì)造成其刷新到主存,但是由于變量b也被緩存到同一個(gè)緩存行,因此就會(huì)造成cache miss,這樣就會(huì)造成極大的性能損失,因此有一些類(lèi)庫(kù)的作者,例如JUC下面的、Disruptor等都利用了插入dummy 變量的方式,使得緩存行被其獨(dú)占,比如下面這種代碼:

static final class Cell { volatile long p0, p1, p2, p3, p4, p5, p6; volatile long value; volatile long q0, q1, q2, q3, q4, q5, q6; Cell(long x) { value = x; } final boolean cas(long cmp, long val) { return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val); } // Unsafe mechanics private static final sun.misc.Unsafe UNSAFE; private static final long valueOffset; static { try {UNSAFE = getUnsafe();Class<?> ak = Cell.class;valueOffset = UNSAFE.objectFieldOffset (ak.getDeclaredField('value')); } catch (Exception e) {throw new Error(e); } } }

但是這種方式畢竟不通用,例如32、64位操作系統(tǒng)的緩存行大小不一樣,因此JAVA8中就增加了一個(gè)注@sun.misc.Contended解用于解決這個(gè)問(wèn)題,由JVM去插入這些變量,具體可以參考o(jì)penjdk.java.net/jeps/142 ,但是通常來(lái)說(shuō)對(duì)象是不規(guī)則的分配到內(nèi)存中的,但是數(shù)組由于是連續(xù)的內(nèi)存,因此可能會(huì)共享緩存行,因此這里加一個(gè)Contended注解以防cells數(shù)組發(fā)生偽共享的情況。

/** * 底競(jìng)爭(zhēng)下直接更新base,類(lèi)似AtomicLong * 高并發(fā)下,會(huì)將每個(gè)線程的操作hash到不同的 * cells數(shù)組中,從而將AtomicLong中更新 * 一個(gè)value的行為優(yōu)化之后,分散到多個(gè)value中 * 從而降低更新熱點(diǎn),而需要得到當(dāng)前值的時(shí)候,直接 * 將所有cell中的value與base相加即可,但是跟 * AtomicLong(compare and change -> xadd)的CAS不同, * incrementAndGet操作及其變種 * 可以返回更新后的值,而LongAdder返回的是void */public class LongAdder { public void add(long x) { Cell[] as; long b, v; int m; Cell a; /** * 如果是第一次執(zhí)行,則直接case操作base */ if ((as = cells) != null || !casBase(b = base, b + x)) { boolean uncontended = true; /** * as數(shù)組為空(null或者size為0) * 或者當(dāng)前線程取模as數(shù)組大小為空 * 或者cas更新Cell失敗 */ if (as == null || (m = as.length - 1) < 0 ||(a = as[getProbe() & m]) == null ||!(uncontended = a.cas(v = a.value, v + x)))longAccumulate(x, null, uncontended); } } public long sum() { //通過(guò)累加base與cells數(shù)組中的value從而獲得sum Cell[] as = cells; Cell a; long sum = base; if (as != null) { for (int i = 0; i < as.length; ++i) {if ((a = as[i]) != null) sum += a.value; } } return sum; }}/** * openjdk.java.net/jeps/142 */@sun.misc.Contended static final class Cell { volatile long value; Cell(long x) { value = x; } final boolean cas(long cmp, long val) { return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val); } // Unsafe mechanics private static final sun.misc.Unsafe UNSAFE; private static final long valueOffset; static { try { UNSAFE = sun.misc.Unsafe.getUnsafe(); Class<?> ak = Cell.class; valueOffset = UNSAFE.objectFieldOffset(ak.getDeclaredField('value')); } catch (Exception e) { throw new Error(e); } }}abstract class Striped64 extends Number { final void longAccumulate(long x, LongBinaryOperator fn, boolean wasUncontended) { int h; if ((h = getProbe()) == 0) { /** * 若getProbe為0,說(shuō)明需要初始化 */ ThreadLocalRandom.current(); // force initialization h = getProbe(); wasUncontended = true; } boolean collide = false;// True if last slot nonempty /** * 失敗重試 */ for (;;) { Cell[] as; Cell a; int n; long v; if ((as = cells) != null && (n = as.length) > 0) {/** * 若as數(shù)組已經(jīng)初始化,(n-1) & h 即為取模操作,相對(duì) % 效率要更高 */if ((a = as[(n - 1) & h]) == null) { if (cellsBusy == 0) { // Try to attach new Cell Cell r = new Cell(x); // Optimistically create if (cellsBusy == 0 && casCellsBusy()) {//這里casCellsBusy的作用其實(shí)就是一個(gè)spin lock //可能會(huì)有多個(gè)線程執(zhí)行了`Cell r = new Cell(x);`, //因此這里進(jìn)行cas操作,避免線程安全的問(wèn)題,同時(shí)前面在判斷一次 //避免正在初始化的時(shí)其他線程再進(jìn)行額外的cas操作 boolean created = false; try {// Recheck under lockCell[] rs; int m, j;//重新檢查一下是否已經(jīng)創(chuàng)建成功了if ((rs = cells) != null && (m = rs.length) > 0 && rs[j = (m - 1) & h] == null) { rs[j] = r; created = true;} } finally {cellsBusy = 0; } if (created)break; continue; // Slot 現(xiàn)在是非空了,continue到下次循環(huán)重試 } } collide = false;}else if (!wasUncontended) // CAS already known to fail wasUncontended = true; // Continue after rehashelse if (a.cas(v = a.value, ((fn == null) ? v + x : fn.applyAsLong(v, x)))) break;//若cas更新成功則跳出循環(huán),否則繼續(xù)重試else if (n >= NCPU || cells != as) // 最大只能擴(kuò)容到CPU數(shù)目, 或者是已經(jīng)擴(kuò)容成功,這里只有的本地引用as已經(jīng)過(guò)期了 collide = false; // At max size or staleelse if (!collide) collide = true;else if (cellsBusy == 0 && casCellsBusy()) { try { if (cells == as) { // 擴(kuò)容 Cell[] rs = new Cell[n << 1]; for (int i = 0; i < n; ++i)rs[i] = as[i]; cells = rs; } } finally { cellsBusy = 0; } collide = false; continue; // Retry with expanded table}//重新計(jì)算hash(異或)從而嘗試找到下一個(gè)空的sloth = advanceProbe(h); } else if (cellsBusy == 0 && cells == as && casCellsBusy()) {boolean init = false;try { // Initialize table if (cells == as) { /** * 默認(rèn)size為2 */ Cell[] rs = new Cell[2]; rs[h & 1] = new Cell(x); cells = rs; init = true; }} finally { cellsBusy = 0;}if (init) break; } else if (casBase(v = base, ((fn == null) ? v + x : // 若已經(jīng)有另一個(gè)線程在初始化,那么嘗試直接更新base fn.applyAsLong(v, x))))break; // Fall back on using base } } final boolean casCellsBusy() { return UNSAFE.compareAndSwapInt(this, CELLSBUSY, 0, 1); } static final int getProbe() { /** * 通過(guò)Unsafe獲取Thread中threadLocalRandomProbe的值 */ return UNSAFE.getInt(Thread.currentThread(), PROBE); } // Unsafe mechanics private static final sun.misc.Unsafe UNSAFE; private static final long BASE; private static final long CELLSBUSY; private static final long PROBE; static { try {UNSAFE = sun.misc.Unsafe.getUnsafe();Class<?> sk = Striped64.class;BASE = UNSAFE.objectFieldOffset (sk.getDeclaredField('base'));CELLSBUSY = UNSAFE.objectFieldOffset (sk.getDeclaredField('cellsBusy'));Class<?> tk = Thread.class;//返回Field在內(nèi)存中相對(duì)于對(duì)象內(nèi)存地址的偏移量PROBE = UNSAFE.objectFieldOffset (tk.getDeclaredField('threadLocalRandomProbe')); } catch (Exception e) {throw new Error(e); } }}

由于Cell相對(duì)來(lái)說(shuō)比較占內(nèi)存,因此這里采用懶加載的方式,在無(wú)競(jìng)爭(zhēng)的情況下直接更新base域,在第一次發(fā)生競(jìng)爭(zhēng)的時(shí)候(CAS失敗)就會(huì)創(chuàng)建一個(gè)大小為2的cells數(shù)組,每次擴(kuò)容都是加倍,只到達(dá)到CPU核數(shù)。同時(shí)我們知道擴(kuò)容數(shù)組等行為需要只能有一個(gè)線程同時(shí)執(zhí)行,因此需要一個(gè)鎖,這里通過(guò)CAS更新cellsBusy來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的spin lock。

數(shù)組訪問(wèn)索引是通過(guò)Thread里的threadLocalRandomProbe域取模實(shí)現(xiàn)的,這個(gè)域是ThreadLocalRandom更新的,cells的數(shù)組大小被限制為CPU的核數(shù),因?yàn)榧词褂谐^(guò)核數(shù)個(gè)線程去更新,但是每個(gè)線程也只會(huì)和一個(gè)CPU綁定,更新的時(shí)候頂多會(huì)有cpu核數(shù)個(gè)線程,因此我們只需要通過(guò)hash將不同線程的更新行為離散到不同的slot即可。

我們知道線程、線程池會(huì)被關(guān)閉或銷(xiāo)毀,這個(gè)時(shí)候可能這個(gè)線程之前占用的slot就會(huì)變成沒(méi)人用的,但我們也不能清除掉,因?yàn)橐话鉾eb應(yīng)用都是長(zhǎng)時(shí)間運(yùn)行的,線程通常也會(huì)動(dòng)態(tài)創(chuàng)建、銷(xiāo)毀,很可能一段時(shí)間后又會(huì)被其他線程占用,而對(duì)于短時(shí)間運(yùn)行的,例如單元測(cè)試,清除掉有啥意義呢?

總結(jié)

總的來(lái)說(shuō),LongAdder從性能上來(lái)說(shuō)要遠(yuǎn)遠(yuǎn)好于AtomicLong,一般情況下是可以直接替代AtomicLong使用的,Netty也通過(guò)一個(gè)接口封裝了這兩個(gè)類(lèi),在Java8下直接采用LongAdder,但是AtomicLong的一系列方法不僅僅可以自增,還可以獲取更新后的值,如果是例如獲取一個(gè)全局唯一的ID還是采用AtomicLong會(huì)方便一點(diǎn)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 久久久www成人免费精品 | 人人干人人干 | 久久亚洲一区二区三区四区 | 一级特黄aaa大片在线观看 | 九九九在线 | av在线国产精品 | 国产成年人小视频 | www.久久久久久久久久久久 | 亚洲一区二区三区四区五区中文 | 九九九在线 | 在线中文字幕视频 | 99影视 | 国产一区久久精品 | 蜜桃av一区二区三区 | 一区二区三区欧美在线 | 国产精品一区二 | 精品国产乱码久久久久夜 | 国产美女高潮视频 | 精品一二三区 | 久久久久久久一区 | 欧美国产一区二区 | av成人在线观看 | 成人亚洲一区二区 | 91精品视频在线播放 | 亚洲欧美日韩另类精品一区二区三区 | 国产精品第一区 | 亚洲国产日韩a在线播放性色 | 久久久久国产精品免费免费搜索 | 国产成人久久 | 欧美成人一区二区三区片免费 | 狠狠视频 | 成人看片在线观看 | 女人久久久久久久 | 国产精品一卡二卡三卡 | 精品国产91亚洲一区二区三区www | 九九久久久 | 国厂毛片 | 国产日韩精品视频 | 特级毛片在线大全免费播放 | 91久久精品国产91久久 | 国产乡下妇女做爰视频 | 亚洲国产精品一区 | 久久久久久久久久久久久久久久久久久 | 国产精品久久久久久久久久免费 | 欧美精品一区二区三区四区 | 欧美黄 片免费观看 | 成人精品国产 | 免费av播放 | 国产精品99久久久久久动医院 | 国产午夜一区二区三区 | 精品久久久久久亚洲综合网 | 99热国产在线观看 | 亚洲久久在线 | 国产精品久久国产精品 | 日韩欧美视频 | 久久99国产精一区二区三区 | 亚洲欧洲精品视频 | 2019天天干夜夜操 | 秋霞电影院午夜伦 | 免费看黄视频网站 | 国产精品777一区二区 | 精品国产一区二区三区久久 | 亚洲www啪成人一区二区 | 欧美一级黄色片免费看 | 四虎免费在线播放 | 国产精品国产a级 | 欧美午夜在线观看 | 日韩一区二区三区四区五区 | 日韩视频国产 | 欧美激情小视频 | 99久久久国产精品 | 亚洲看片网站 | 欧美精品91 | 久久亚洲一区二区三区四区 | 欧美8一10sex性hd | 96久久久久久 | 一区二区亚洲 | 国产精品久久久久久中文字 | 亚洲欧洲日韩 | 国产精品久久久久久久福利院 | 成人免费在线电影 | 欧美精品一区视频 | 一级免费黄色免费片 | 美女视频一区二区三区 | 狠狠天天 | 在线观看亚洲一区二区三区 | 日本三级黄色录像 | 天天操天天碰 | 久久成人国产精品 | 欧美日韩精品 | 天天艹逼 | 日本三级在线观看网站 | 成人免费视频网 | 一级免费av | 一区二区三区四区免费观看 | 欧美在线视频不卡 | 国产福利一区二区 | 国产一区二区免费视频 | 好姑娘影视在线观看高清 | 亚洲不卡免费视频 | 成人av一区二区三区 | 日韩欧美一区二区三区视频 | 亚洲成人福利在线观看 | 久久av在线 | 一区二区免费 | 欧美日日| 成人在线免费观看 | 日韩亚洲在线 | 国产xxxx精品 | 精国产品一区二区三区四季综 | 欧美日韩专区 | 精品日韩欧美一区二区三区在线播放 | 国产成人精品一区二区 | 精品国产乱码久久久久久1区2区 | 日本黄色三级网站 | 欧美日韩电影一区二区 | 国产精品日本一区二区在线播放 | 国产激情影院 | 日本成人高清视频 | 成人久久久精品乱码一区二区三区 | 成人一区二区三区 | 伊人亚洲 | 国产一区精品视频 | 亚洲第一性理论片 | 欧美激情一区二区三区 | 欧美男人的天堂 | 一二三四在线视频观看社区 | 久热九九| 久久久久久成人 | 久久久蜜桃一区二区人 | 播放毛片 | 成人av免费在线观看 | 国产成人高清 | 精品国产乱码久久久久久闺蜜 | 精品亚洲国产成av人片传媒 | 国产一区二区三区四区三区 | 成人欧美一区二区三区 | 一区二区在线视频 | 二区在线视频 | 在线涩涩 | 日本美女一区二区 | 免费黄色毛片视频 | 国产黄色大片免费观看 | 日韩精品一区二区三区在线播放 | 国产精彩视频 | 欧美精品网站 | 国产精品乱码一区二区三区 | av在线日韩 | 国内久久精品视频 | 日本福利网站 | v888av成人| 97色在线观看免费视频 | 精品久久久久久久 | 久久久精品免费观看 | 天天操天天干天天爽 | 国产精品成人国产乱一区 | 一级毛片久久久 | 天天艹综合 | 久久久99精品免费观看 | 中文字幕亚洲一区 | 一本一道久久a久久精品综合 | 成人av网站在线观看 | 亚洲精品自拍 | 午夜国产视频 | 欧美中文字幕一区 | 在线高清av | av网站网址| 国产一区二区三区久久久 | 播放毛片 | 91av免费在线观看 | 亚洲中字在线 | 国产亲子乱弄免费视频 | 国产一在线 | 自拍视频在线 | 成人久久久精品国产乱码一区二区 | 久久99精品国产99久久6尤 | 免费观看视频毛片 | 免费av一区二区三区 | 国产精品亚洲一区二区三区 | 久草免费在线 | 午夜精品网站 | 国内久久精品 | 久草久草 | 久久草草影视免费网 | 中文字幕av网 | 日韩欧美高清视频 | www.久久99| 亚洲国产精品成人 | 北条麻妃一区二区三区在线观看 | 国产亚洲一区二区三区在线观看 | 91九色porny首页最多播放 | 免费看h | 日韩成人免费电影 | 操操操操操 | 欧美视频亚洲视频 | 亚洲国产精品人人爽夜夜爽 | 日韩欧美在线视频免费观看 | 二区在线观看 | 久久国产精品一区 | 国产一区二区三区在线看 | 欧美日韩国产一区二区三区不卡 | av在线日韩 | 91欧美| 黄色大片观看 | 欧美成年黄网站色视频 | 成人黄页在线观看 | 亚洲成人免费在线 | 国产成人精品免高潮在线观看 | 久久久久久久久中文字幕 | 97影院在线午夜 | 日韩素人在线 | 成人在线免费观看 | 亚洲精品一区二三区不卡 | 男人的天堂在线视频 | 欧美二三区| 嫩草影院懂你的 | 久久999视频 | 在线观看精品自拍私拍 | 亚洲欧美高清 | 亚洲精品久久久久久一区二区 | 亚洲精品一区二区三区99 | 精品免费视频 | 久久人人爽人人爽人人片av软件 | 成人精品视频在线观看 | 国产欧美综合视频 | 欧美日韩免费 | 韩国久久精品 | 久久精品国产91精品亚洲高清 | 日韩在线播放视频 | 欧美精品久久久久久久久久丰满 | 久久久久久亚洲一区二区三区蜜臀 | 亚洲精品乱码久久久久久久 | 国产精品视频免费 | 国产91亚洲精品 | 91丝袜| 久久久美女| 白浆视频在线观看 | avsex国产| www.44181com| 国产激情性色视频在线观看 | 99国产精品99久久久久久 | 亚洲一区二区三区免费视频 | 欧美大片网站 | 玖玖精品视频 | 日韩国产欧美精品 | 91精产国品一二三区在线观看 | 国产视频久久久久久久 | 国产成人激情 | 日韩成人在线一区 | 成人亚洲精品久久久久软件 | 青草成人免费视频 | 欧美成人一区二区三区片免费 | 久久久久久久久久久久99 | 午夜欧美精品久久久久 | 欧美激情综合五月色丁香小说 | 亚洲第一免费看片 | 国产精品一区二区三区四区五区 | 韩国毛片在线观看 | 日本综合久久 | 欧美大片一区二区 | 国产精品美女久久久 | 久久久国产视频 | 午夜精品久久久久久久久 | 国产一区二区欧美 | 久久久久久久一区二区 | 免费福利视频一区 | 在线观看国产一区 | 黄a免费看 | 激情网在线观看 | 亚洲视频在线一区 | 成人免费福利视频 | 国产精品成人国产乱一区 | 色www精品视频在线观看 | 欧美亚洲免费 | 欧美日韩亚洲三区 | 真实国产露脸乱 | 国产精品综合 | 秋霞电影院午夜伦 | 99久草| 午夜视频 | 久久精品一区视频 | 中文字幕66页 | 日韩欧美视频 | 精品国产一区二区三区四区 | 99riav在线| 日韩成人在线网站 | 色综合国产| 四虎最新影视 | 成人免毛片| 中文精品一区二区三区 | 一区二区三区回区在观看免费视频 | 国产成人免费视频网站高清观看视频 | 蜜月久综合久久综合国产 | 日本videos18高清hd下 | 色综合久久伊人 | 欧美午夜精品一区二区三区电影 | 国内久久精品 | 欧美成人精品 | 国产一区二区三区在线免费观看 | 国产目拍亚洲精品99久久精品 | 成人精品 | 中文字幕第一页在线 | 日本欧美大片 | 久久久久久久国产精品 | 日本久久久久久久 | jlzzjlzz亚洲日本少妇 | 成人在线观看中文字幕 | 欧美一区永久视频免费观看 | 亚洲aaaaaa特级 | 精品在线一区二区 | 日韩人体在线 | 蜜桃av中文字幕 | 韩日免费视频 | 在线精品国产 | 久久久久久久9 | 国产裸体永久免费视频网站 | 精品成人av| 欧美精品理论片大全 | 亚洲精品久久久一区二区三区 | 色综合国产 | 国产免费自拍 | 成人影院av| 欧美a在线| 毛片免费在线观看 | 日韩一级在线免费观看 | 亚洲第一福利视频 | 国产精品久久久久久中文字 | 日韩欧美在线观看一区二区三区 | 欲色av| 国产婷婷精品av在线 | 一区二区三区精品视频 | 亚洲免费一区二区 | 国产精品精品视频一区二区三区 | 欧美日韩国产一区二区三区不卡 | 免费看毛片的网站 | 狠狠干天天干 | a在线看 | 久久精品色欧美aⅴ一区二区 | 午夜免费电影 | 亚洲第一av | 中文字幕av一区二区三区 | 亚洲www视频 | 综合久久久久 | 国产欧美日韩一区 | 日韩一区二区在线观看 | 超碰97免费在线 | 色先锋影音 | 91精品久久久久久久久久入口 | 91精品国产乱码久久久久久久久 | 亚洲欧美国产一区二区 | 日日操av| 精品日韩欧美一区二区在线播放 | 亚洲视频久久久 | 亚洲精品一区二三区不卡 | 欧美日本亚洲 | 国产综合视频在线观看 | 欧美男人天堂 | 骚黄视频 | 在线观看一区二区三区四区 | 欧美日韩在线免费观看 | 亚洲在线视频 | 99国产精品| 亚洲一区二区av | 欧美大成色www永久网站婷 | 日精品| 成人在线播放 | 日韩欧美~中文字幕 | 黄色免费视频 | 日日摸天天爽天天爽视频 | 欧美白人做受xxxx视频 | 国产精品日产欧美久久久久 | 成人在线一区二区 | 日韩国产欧美亚洲 | 97在线免费视频 | 国产激情偷乱视频一区二区三区 | 国产精品久久一区二区三区 | 一级毛片久久久 | 亚洲视频中文字幕 | 国产一区二区三区久久久久久久久 | 亚洲国产一区二区三区四区 | 欧美自拍视频 | 成人无遮挡毛片免费看 | 亚洲一区二区三区免费在线 | 日韩成人高清 | 91小视频网站 | 99久久综合 | ririsao亚洲国产中文 | 亚洲男人天堂2023 | 亚洲国产欧美在线 | 一级毛片观看 | 日本精品一区二区三区在线观看 | 日产精品久久久一区二区 | 欧美精品在线一区 | 国产午夜精品久久久久久久 | 日日干夜夜操 | 青青操天天干 | 亚洲精品福利网站 | 国产一区国产二区在线观看 | 五月天婷婷综合 | 色综合久久久久 | www.xxxx在线观看| 国产一区亚洲 | 黄色电影在线免费观看 | 欧美一级欧美三级在线观看 | 精品国产31久久久久久 | 国产午夜精品在线 | 最新日韩在线观看视频 | 99精品欧美一区二区蜜桃免费 | 精品久久久一区二区 | 国产精品久久久久久久久久久久久久 | 成人a网| 欧美黄色激情 | av影片在线播放 | 久久草 | 日韩精品1区 | 精品国产污网站污在线观看15 | 天天干天天操 | 可以在线观看的av网站 | 91一区二区 | 欧美成人一区二区 | 免费观看一级黄色片 | 国产精品婷婷午夜在线观看 | 9久久婷婷国产综合精品性色 | 中文字幕在线观看视频一区 | 日韩亚洲 | 国产亚洲欧美一区 | 日韩成人一区二区 | 日韩精品视频在线观看一区二区 | 亚洲一区中文字幕永久在线 | 午夜视频网站 | 人妖 丝袜 另类 亚洲 | 久久久久国产一区 | 久久国产精品久久 | 午夜视频网站 | 日韩国产欧美精品 | 青青草久久久 | 欧美一区二区三区在线观看视频 | 国产精品久久国产愉拍 | 久久久久久久99精品免费观看 | 91精品国产综合久久福利软件 | 午夜精品久久 | 日本高清视频在线播放 | 国产欧美综合一区二区三区 | 亚洲www啪成人一区二区 | 亚洲国产精品一区二区三区 | 欧美视频在线一区 | 香蕉视频91 | 噜噜噜视频在线观看 | 久久社区 | 日韩精品一区二区三区中文在线 | 日韩小视频在线播放 | 国产高清免费视频 | 日韩免费高清视频 | 国产精品久久久久一区二区三区共 | 欧美三级在线视频 | 99国产精品久久久久久久 | 国产羞羞视频免费在线观看 | caoporn免费 | 日韩精品免费观看 | 一级黄色录像毛片 | 特黄视频 | 欧美xxxx做受欧美 | zzzzyyyy精品国产| 91国内精品久久 | 亚洲免费人成在线视频观看 | 亚洲视频在线免费观看 | 成人一区视频 | 亚洲精品一区在线观看 | 日韩一区二区三区在线视频 | 欧美性猛片aaaaaaa做受 | 欧美日韩在线免费观看 | 男女全黄一级一级高潮免费看 | 日韩中文字幕在线免费 | 日韩成人在线播放 | 久久精彩| 荷兰欧美一级毛片 | 97超碰青青草| 中文字幕视频在线 | 国产一区二区自拍 | 亚洲精品亚洲人成人网 | 91.com在线 | 亚洲中国精品精华液 | 免费亚洲精品 | 奇米精品一区二区三区在线观看 | 亚洲国产精品自拍 | 日韩成人影视 | 国产成人在线免费观看 | 国产精品久久久久久一区二区三区 | 91高清在线观看 | 日韩欧美三级 | 久久99精品国产99久久6尤 | eeuss国产一区二区三区四区 | 久久久久亚洲美女啪啪 | 欧美精品久久久久久久久 | 日韩精品免费在线视频 | 久久久www | 中文字幕日韩欧美一区二区三区 | 久久久999精品视频 欧美老妇交乱视频 | a成人在线| 成人精品在线 | 综合网亚洲 | 欧美亚洲视频 | 日韩久久一区二区 | 免费高清一级毛片 | 亚州精品成人 | 久久中文字幕一区二区 | 亚洲一区二区三区高清 | 毛片站| 91精品久久久久久久 | 国产精品黄视频 | 亚州精品成人 | 一区二区三区影院 | 亚洲国产精品一区二区久久,亚洲午夜 | 99国内精品久久久久久久 | av在线第一页 | 国产一级一级毛片女人精品 | 国产综合亚洲精品一区二 | 男女羞羞羞视频午夜视频 | 亚洲国产精品视频 | 久久这里只有精品免费 | 日韩成年视频 | 国产综合精品视频 | 免费观看av电影 | 日韩一二三区 | 日韩精品中文字幕一区二区三区 | 亚洲高清在线 | 精品国产91久久久久久久 | 91色在线 | 欧美一级特黄aaaaaaa视频片 | 欧美精品一区二区三区四区 | 日韩在线视频一区 | 国产精品99在线观看 | 天天操天天操 | 亚洲福利一区二区 | 99视频在线免费观看 | 正在播放国产精品 | 精品91在线 | 毛片在线免费 | 黄色大片网站在线观看 | 草樱av | 最新av中文字幕 | www.伊人 | 国产视频网 | 国产精品久久久久久久久久久久午夜片 | 蜜桃精品在线观看 | 91在线免费视频 | 久久伊99综合婷婷久久伊 | 狠狠久久婷婷 | 国产91极品 | 国产精品日产欧美久久久久 | 国产一区二区在线视频 | 日韩福利在线 | 亚洲高清视频在线 | 综合久久综合久久 | 亚洲精品国产第一综合99久久 | 播放毛片| av国产精品 | 毛片a级片| 日日夜夜天天干干 | 久久免费精品视频 | 天天澡天天狠天天天做 | 久热中文在线 | 精品在线看| 欧美日韩亚洲国产综合 | 亚洲欧美日韩一区 | 国产二区免费 | 日韩中出| 九九热这里只有精 | 国产成人av一区二区 | 久久视频在线 | 在线色网站| 日韩在线视频中文字幕 | 国产精品永久在线观看 | 国产一级特黄aaa | 国产视频一区二区 | 一区二区三区国产 | 国产一区日韩欧美 | 久久精品国产亚洲一区二区三区 | 一区二区三区播放 | 国产精品一区二区三区四区五区 | 久久久久久国产 | 久草热8精品视频在线观看 亚洲区在线 | 91高清免费 | 免费观看一区二区三区毛片 | 奇米影视奇米色777欧美 | 看全黄大色黄大片老人做 | 精品国产一区二区三区久久影院 | 欧美日韩精品综合 | 中文字幕日韩一区二区三区 | 337p亚洲欧洲 | 国产主播福利 | 中文字幕1区 | 在线看一区 | www.久久伊人 | 欧美日韩国产在线看 | 久色视频| 国产在线精品一区二区三区 | 中文字幕精品一区二区三区精品 | 韩国精品免费视频 | 亚洲免费网站在线观看 | 国产色 | 夜夜操操 | 亚洲97视频| 欧美一区二区三区在线 | 免费av一区二区三区 | 久久69| 国产精品三级久久久久久电影 | 色婷婷久久 | 美女超碰| 91麻豆精品国产91久久久资源速度 | 伊人电影综合 | 成人国产精品久久 | 精品久久一区二区 | 精品国产乱码一区二区三区四区 | 亚洲第一区在线 |