在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

volatile的實(shí)現(xiàn)原理分析

jf_78858299 ? 來(lái)源:路人zhang ? 作者:路人zhang ? 2023-05-11 17:33 ? 次閱讀

volatile的作用是什么?

volatile是一個(gè)輕量級(jí)的synchronized,一般作用于 變量 ,在多處理器開(kāi)發(fā)的過(guò)程中保證了內(nèi)存的可見(jiàn)性。相比于synchronized關(guān)鍵字,volatile關(guān)鍵字的執(zhí)行成本更低,效率更高。

volatile的特性有哪些?

并發(fā)編程的三大特性為可見(jiàn)性、有序性和原子性。通常來(lái)講volatile可以保證可見(jiàn)性和有序性。

  • 可見(jiàn)性:volatile可以保證不同線程對(duì)共享變量進(jìn)行操作時(shí)的可見(jiàn)性。即當(dāng)一個(gè)線程修改了共享變量時(shí),另一個(gè)線程可以讀取到共享變量被修改后的值。
  • 有序性:volatile會(huì)通過(guò)禁止指令重排序進(jìn)而保證有序性。
  • 原子性:對(duì)于單個(gè)的volatile修飾的變量的讀寫是可以保證原子性的,但對(duì)于i++這種復(fù)合操作并不能保證原子性。這句話的意思基本上就是說(shuō)volatile不具備原子性了。

Java內(nèi)存的可見(jiàn)性問(wèn)題

Java的內(nèi)存模型如下圖所示。

圖片

這里的本地內(nèi)存并不是真實(shí)存在的,只是Java內(nèi)存模型的一個(gè)抽象概念,它包含了控制器、運(yùn)算器、緩存等。同時(shí)Java內(nèi)存模型規(guī)定,線程對(duì)共享變量的操作必須在自己的本地內(nèi)存中進(jìn)行,不能直接在主內(nèi)存中操作共享變量。這種內(nèi)存模型會(huì)出現(xiàn)什么問(wèn)題呢?,

  1. 線程A獲取到共享變量X的值,此時(shí)本地內(nèi)存A中沒(méi)有X的值,所以加載主內(nèi)存中的X值并緩存到本地內(nèi)存A中,線程A修改X的值為1,并將X的值刷新到主內(nèi)存中,這時(shí)主內(nèi)存及本地內(nèi)存A中的X的值都為1。
  2. 線程B需要獲取共享變量X的值,此時(shí)本地內(nèi)存B中沒(méi)有X的值,加載主內(nèi)存中的X值并緩存到本地內(nèi)存B中,此時(shí)X的值為1。線程B修改X的值為2,并刷新到主內(nèi)存中,此時(shí)主內(nèi)存及本地內(nèi)存B中的X值為2,本地內(nèi)存A中的X值為1。
  3. 線程A再次獲取共享變量X的值,此時(shí)本地內(nèi)存中存在X的值,所以直接從本地內(nèi)存中A獲取到了X為1的值,但此時(shí)主內(nèi)存中X的值為2,到此出現(xiàn)了所謂內(nèi)存不可見(jiàn)的問(wèn)題。

該問(wèn)題Java內(nèi)存模型是通過(guò)synchronized關(guān)鍵字和volatile關(guān)鍵字就可以解決。

為什么代碼會(huì)重排序?

計(jì)算機(jī)在執(zhí)行程序的過(guò)程中,編譯器和處理器通常會(huì)對(duì)指令進(jìn)行重排序,這樣做的目的是為了提高性能。具體可以看下面這個(gè)例子。

int a = 1;
int b = 2;
int a1 = a;
int b1 = b;
int a2 = a + a;
int b2 = b + b;
......

像這段代碼,不斷地交替讀取a和b,會(huì)導(dǎo)致寄存器頻繁交替存儲(chǔ)a和b,使得代碼性能下降,可對(duì)其進(jìn)入如下重排序。

int a = 1;
int b = 2;
int a1 = a;
int a2 = a + a;
int b1 = b;
int b2 = b + b;
......

按照這樣的順序執(zhí)行代碼便可以避免交替讀取a和b,這就是重排序的意義。

指令重排序一般分為編譯器優(yōu)化重排、指令并行重排和內(nèi)存系統(tǒng)重排三種。

  • 編譯器優(yōu)化重排:編譯器在不改變單線程程序語(yǔ)義的情況下,可以對(duì)語(yǔ)句的執(zhí)行順序進(jìn)行重新排序。
  • 指令并行重排:現(xiàn)代處理器多采用指令級(jí)并行技術(shù)來(lái)將多條指令重疊執(zhí)行。對(duì)于不存在數(shù)據(jù)依賴的程序,處理器可以對(duì)機(jī)器指令的執(zhí)行順序進(jìn)行重新排列。
  • 內(nèi)存系統(tǒng)重排:因?yàn)樘幚砥魇褂镁彺婧妥x/寫緩沖區(qū),使得加載(load)和存儲(chǔ)(store)看上去像是在亂序執(zhí)行。

注:簡(jiǎn)單解釋下數(shù)據(jù)依賴性:如果兩個(gè)操作訪問(wèn)了同一個(gè)變量,并且這兩個(gè)操作有一個(gè)是寫操作,這兩個(gè)操作之間就會(huì)存在數(shù)據(jù)依賴性,例如:

a = 1;
b = a;

如果對(duì)這兩個(gè)操作的執(zhí)行順序進(jìn)行重排序的話,那么結(jié)果就會(huì)出現(xiàn)問(wèn)題。

其實(shí),這三種指令重排說(shuō)明了一個(gè)問(wèn)題,就是指令重排在單線程下可以提高代碼的性能,但在多線程下可以會(huì)出現(xiàn)一些問(wèn)題。

重排序會(huì)引發(fā)什么問(wèn)題?

前面已經(jīng)說(shuō)過(guò)了,在單線程程序中,重排序并不會(huì)影響程序的運(yùn)行結(jié)果,而在多線程場(chǎng)景下就不一定了。可以看下面這個(gè)經(jīng)典的例子,該示例出自《Java并發(fā)編程的藝術(shù)》。

class ReorderExample{
    int a = 0;
    boolean flag = false;
    public void writer(){
        a = 1;              // 操作1
        flag = true;        // 操作2
    }
    public void reader(){
        if(flag){          // 操作3
            int i = a + a; // 操作4
        }
    }
}

假設(shè)線程1先執(zhí)行writer()方法,隨后線程2執(zhí)行reader()方法,最后程序一定會(huì)得到正確的結(jié)果嗎?

答案是不一定的,如果代碼按照下圖的執(zhí)行順序執(zhí)行代碼則會(huì)出現(xiàn)問(wèn)題。

圖片

操作1和操作2進(jìn)行了重排序,線程1先執(zhí)行flag=true,然后線程2執(zhí)行操作3和操作4,線程2執(zhí)行操作4時(shí)不能正確讀取到a的值,導(dǎo)致最終程序運(yùn)行結(jié)果出問(wèn)題。這也說(shuō)明了在多線程代碼中,重排序會(huì)破壞多線程程序的語(yǔ)義。

as-if-serial規(guī)則和happens-before規(guī)則的區(qū)別?

區(qū)別:

  • as-if-serial定義:無(wú)論編譯器和處理器如何進(jìn)行重排序,單線程程序的執(zhí)行結(jié)果不會(huì)改變。
  • happens-before定義:一個(gè)操作happens-before另一個(gè)操作,表示第一個(gè)的操作結(jié)果對(duì)第二個(gè)操作可見(jiàn),并且第一個(gè)操作的執(zhí)行順序也在第二個(gè)操作之前。但這并不意味著Java虛擬機(jī)必須按照這個(gè)順序來(lái)執(zhí)行程序。如果重排序的后的執(zhí)行結(jié)果與按happens-before關(guān)系執(zhí)行的結(jié)果一致,Java虛擬機(jī)也會(huì)允許重排序的發(fā)生。
  • happens-before關(guān)系保證了同步的多線程程序的執(zhí)行結(jié)果不被改變,as-if-serial保證了單線程內(nèi)程序的執(zhí)行結(jié)果不被改變。

相同點(diǎn):happens-before和as-if-serial的作用都是在不改變程序執(zhí)行結(jié)果的前提下,提高程序執(zhí)行的并行度。

voliatile的實(shí)現(xiàn)原理?

前面已經(jīng)講述volatile具備可見(jiàn)性和有序性兩大特性,所以volatile的實(shí)現(xiàn)原理也是圍繞如何實(shí)現(xiàn)可見(jiàn)性和有序性展開(kāi)的。

volatile實(shí)現(xiàn)內(nèi)存可見(jiàn)性原理

導(dǎo)致內(nèi)存不可見(jiàn)的主要原因就是Java內(nèi)存模型中的本地內(nèi)存和主內(nèi)存之間的值不一致所導(dǎo)致,例如上面所說(shuō)線程A訪問(wèn)自己本地內(nèi)存A的X值時(shí),但此時(shí)主內(nèi)存的X值已經(jīng)被線程B所修改,所以線程A所訪問(wèn)到的值是一個(gè)臟數(shù)據(jù)。那如何解決這種問(wèn)題呢?

volatile可以保證內(nèi)存可見(jiàn)性的關(guān)鍵是volatile的讀/寫實(shí)現(xiàn)了緩存一致性,緩存一致性的主要內(nèi)容為:

  • 每個(gè)處理器會(huì)通過(guò)嗅探總線上的數(shù)據(jù)來(lái)查看自己的數(shù)據(jù)是否過(guò)期,一旦處理器發(fā)現(xiàn)自己緩存對(duì)應(yīng)的內(nèi)存地址被修改,就會(huì)將當(dāng)前處理器的緩存設(shè)為無(wú)效狀態(tài)。此時(shí),如果處理器需要獲取這個(gè)數(shù)據(jù)需重新從主內(nèi)存將其讀取到本地內(nèi)存。
  • 當(dāng)處理器寫數(shù)據(jù)時(shí),如果發(fā)現(xiàn)操作的是共享變量,會(huì)通知其他處理器將該變量的緩存設(shè)為無(wú)效狀態(tài)。

那緩存一致性是如何實(shí)現(xiàn)的呢?可以發(fā)現(xiàn)通過(guò)volatile修飾的變量,生成匯編指令時(shí)會(huì)比普通的變量多出一個(gè)Lock指令,這個(gè)Lock指令就是volatile關(guān)鍵字可以保證內(nèi)存可見(jiàn)性的關(guān)鍵,它主要有兩個(gè)作用:

  • 將當(dāng)前處理器緩存的數(shù)據(jù)刷新到主內(nèi)存。
  • 刷新到主內(nèi)存時(shí)會(huì)使得其他處理器緩存的該內(nèi)存地址的數(shù)據(jù)無(wú)效。

volatile實(shí)現(xiàn)有序性原理

前面提到重排序可以提高代碼的執(zhí)行效率,但在多線程程序中可以導(dǎo)致程序的運(yùn)行結(jié)果不正確,那volatile是如何解決這一問(wèn)題的呢?

為了實(shí)現(xiàn)volatile的內(nèi)存語(yǔ)義,編譯器在生成字節(jié)碼時(shí)會(huì)通過(guò)插入內(nèi)存屏障來(lái)禁止指令重排序。

內(nèi)存屏障:內(nèi)存屏障是一種CPU指令,它的作用是對(duì)該指令前和指令后的一些操作產(chǎn)生一定的約束,保證一些操作按順序執(zhí)行。

Java虛擬機(jī)插入內(nèi)存屏障的策略

Java內(nèi)存模型把內(nèi)存屏障分為4類,如下表所示:

屏障類型 指令示例 說(shuō)明
LoadLoad Barriers Load1;LoadLoad;Load2 保證Load1數(shù)據(jù)的讀取先于Load2及后續(xù)所有讀取指令的執(zhí)行
StoreStore Barriers Store1;StoreStore;Store2 保證Store1數(shù)據(jù)刷新到主內(nèi)存先于Store2及后續(xù)所有存儲(chǔ)指令
LoadStore Barriers Load1;LoadStore;Store2 保證Load1數(shù)據(jù)的讀取先于Store2及后續(xù)的所有存儲(chǔ)指令刷新到主內(nèi)存
StoreLoad Barriers Store1;StoreLoad;Load2 保證Store1數(shù)據(jù)刷新到主內(nèi)存先于Load2及后續(xù)所有讀取指令的執(zhí)行

注:StoreLoad Barriers同時(shí)具備其他三個(gè)屏障的作用,它會(huì)使得該屏障之前的所有內(nèi)存訪問(wèn)指令完成之后,才會(huì)執(zhí)行該屏障之后的內(nèi)存訪問(wèn)命令。

Java內(nèi)存模型對(duì)編譯器指定的volatile重排序規(guī)則為:

  • 當(dāng)?shù)谝粋€(gè)操作是volatile讀時(shí),無(wú)論第二個(gè)操作是什么都不能進(jìn)行重排序。
  • 當(dāng)?shù)诙€(gè)操作是volatile寫時(shí),無(wú)論第一個(gè)操作是什么都不能進(jìn)行重排序。
  • 當(dāng)?shù)谝粋€(gè)操作是volatile寫,第二個(gè)操作為volatile讀時(shí),不能進(jìn)行重排序。

根據(jù)volatile重排序規(guī)則,Java內(nèi)存模型采取的是保守的屏障插入策略,volatile寫是在前面和后面分別插入內(nèi)存屏障,volatile讀是在后面插入兩個(gè)內(nèi)存屏障,具體如下:

  • volatile讀:在每個(gè)volatile讀后面分別插入LoadLoad屏障及LoadStore屏障(根據(jù)volatile重排序規(guī)則第一條),如下圖所示

圖片

LoadLoad屏障的作用:禁止上面的所有普通讀操作和上面的volatile讀操作進(jìn)行重排序。

LoadStore屏障的作用:禁止下面的普通寫和上面的volatile讀進(jìn)行重排序。

  • volatile寫:在每個(gè)volatile寫前面插入一個(gè)StoreStore屏障(為滿足volatile重排序規(guī)則第二條),在每個(gè)volatile寫后面插入一個(gè)StoreLoad屏障(為滿足voaltile重排序規(guī)則第三條),如下圖所示
    圖片
    StoreStore屏障的作用:禁止上面的普通寫和下面的volatile寫重排序
    StoreLoad屏障的作用:防止上面的volatile寫與下面可能出現(xiàn)的volatile讀/寫重排序。

編譯器對(duì)內(nèi)存屏障插入策略的優(yōu)化

因?yàn)镴ava內(nèi)存模型所采用的屏障插入策略比較保守,所以在實(shí)際的執(zhí)行過(guò)程中,只要不改變volatile讀/寫的內(nèi)存語(yǔ)義,編譯器通常會(huì)省略一些不必要的內(nèi)存屏障。

代碼如下:

public class VolatileBarrierDemo{
    int a;
    volatile int b = 1;
    volatile int c = 2;
    
    public void test(){
        int i = b;  //volatile讀
        int j = c;  //volatile讀
        a = i + j;  //普通寫
        
    }
}

指令序列示意圖如下:

圖片

從上圖可以看出,通過(guò)指令優(yōu)化一共省略了兩個(gè)內(nèi)存屏障(虛線表示),省略第一個(gè)內(nèi)存屏障LoadStore的原因是最后的普通寫不可能越過(guò)第二個(gè)volatile讀,省略第二個(gè)內(nèi)存屏障LoadLoad的原因是下面沒(méi)有涉及到普通讀的操作。

volatile能使一個(gè)非原子操作變成一個(gè)原子操作嗎?

volatile只能保證可見(jiàn)性和有序性,但可以保證64位的long型和double型變量的原子性。

對(duì)于32位的虛擬機(jī)來(lái)說(shuō),每次原子讀寫都是32位的,會(huì)將longdouble型變量拆分成兩個(gè)32位的操作來(lái)執(zhí)行,這樣longdouble型變量的讀寫就不能保證原子性了,而通過(guò)volatile修飾的longdouble型變量則可以保證其原子性。

volatile、synchronized的區(qū)別?

  • volatile主要是保證內(nèi)存的可見(jiàn)性,即變量在寄存器中的內(nèi)存是不確定的,需要從主存中讀取。synchronized主要是解決多個(gè)線程訪問(wèn)資源的同步性。
  • volatile作用于變量,synchronized作用于代碼塊或者方法。
  • volatile僅可以保證數(shù)據(jù)的可見(jiàn)性,不能保證數(shù)據(jù)的原子性。synchronized可以保證數(shù)據(jù)的可見(jiàn)性和原子性。
  • volatile不會(huì)造成線程的阻塞,synchronized會(huì)造成線程的阻塞。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19811

    瀏覽量

    233586
  • 開(kāi)發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    373

    瀏覽量

    41348
  • volatile
    +關(guān)注

    關(guān)注

    0

    文章

    46

    瀏覽量

    13277
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Volatile變量的使用

    Java? 語(yǔ)言包含兩種內(nèi)在的同步機(jī)制:同步塊(或方法)和 volatile 變量。這兩種機(jī)制的提出都是為了實(shí)現(xiàn)代碼線程的安全性。其中 Volatile 變量的同步性較差(但有時(shí)它更簡(jiǎn)單并且開(kāi)銷更低),而且其使用也更容易出錯(cuò)。
    發(fā)表于 07-15 06:00

    什么是volatile

    00. 目錄文章目錄00. 目錄01. volatile概述02. volatile應(yīng)用場(chǎng)景03. volatile應(yīng)用示例04. 嵌入式系統(tǒng)中應(yīng)用05. volatile官方說(shuō)明
    發(fā)表于 10-28 09:23

    c語(yǔ)言volatile的作用

    volatile,則編譯器會(huì)逐一地進(jìn)行編譯并產(chǎn)生相應(yīng)的機(jī)器代碼(產(chǎn)生四條代碼)。volatile變量有兩個(gè)作用:一個(gè)是告訴編譯器不要進(jìn)行優(yōu)化;另一個(gè)是告訴系統(tǒng)始終從內(nèi)存中取變量的地址,而不是從緩存中取變量的值(加volatile
    發(fā)表于 11-03 09:13 ?2502次閱讀
    c語(yǔ)言<b class='flag-5'>volatile</b>的作用

    Volatile與多線程的認(rèn)識(shí)與理解

    volatile是一個(gè)類型修飾符(type specifier),就像大家更熟悉的const一樣,它是被設(shè)計(jì)用來(lái)修飾被不同線程訪問(wèn)和修改的變量。volatile的作用是作為指令關(guān)鍵字,確保本條指令
    發(fā)表于 12-01 10:31 ?1716次閱讀

    volatile修飾的變量的認(rèn)識(shí)和理解

     談到volatile,理解原子性和易變性是不同的概念這一點(diǎn)很重要,volatile是輕量級(jí)的鎖,它只具備可見(jiàn)性,但沒(méi)有原子特性。如果你將一個(gè)域聲明為volatile,那么只要對(duì)這個(gè)域產(chǎn)生了寫操作
    發(fā)表于 12-01 11:36 ?5878次閱讀
    <b class='flag-5'>volatile</b>修飾的變量的認(rèn)識(shí)和理解

    Java中volatile的作用以及用法

    Java 語(yǔ)言中的 volatile 變量可以被看作是一種 “程度較輕的 synchronized”;與 synchronized 塊相比,volatile 變量所需的編碼較少,并且運(yùn)行時(shí)開(kāi)銷也較少,但是它所能實(shí)現(xiàn)的功能也僅是
    發(fā)表于 12-01 12:14 ?7088次閱讀

    volatile變量定義的意義和該用在哪里

    volatile 影響編譯器編譯的結(jié)果,volatile指出 變量是隨時(shí)可能發(fā)生變化的,與volatile變量有關(guān)的運(yùn)算,不要進(jìn)行編譯優(yōu)化,以免出錯(cuò)
    發(fā)表于 03-07 15:29 ?3869次閱讀
    <b class='flag-5'>volatile</b>變量定義的意義和該用在哪里

    C語(yǔ)言類型修飾符Volatile的使用說(shuō)明

    C語(yǔ)言是我們經(jīng)常需要用到的語(yǔ)言,C語(yǔ)言中的類型修飾符Volatile大家知道怎么使用嗎? volatile是一個(gè)類型修飾符(type specifier).volatile的作用是作為指令關(guān)鍵字
    的頭像 發(fā)表于 09-19 10:54 ?3719次閱讀

    volatile有哪些使用誤區(qū)

    在建立編譯環(huán)境的時(shí)候用typedef定義了指向volatile 單元的指針,最后終于發(fā)現(xiàn)行不通。
    發(fā)表于 08-06 17:34 ?0次下載
    <b class='flag-5'>volatile</b>有哪些使用誤區(qū)

    如何使用C++語(yǔ)法中的volatile

    volatile volatile int i = 10; volatile 關(guān)鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素(操作系統(tǒng)、硬件、其它線程等)更改。所以
    的頭像 發(fā)表于 09-09 09:38 ?1651次閱讀

    C++基礎(chǔ)語(yǔ)法之volatile、assert()和sizeof()

    volatile volatile int i = 10; volatile 關(guān)鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素(操作系統(tǒng)、硬件、其它線程等)更改。所以
    的頭像 發(fā)表于 09-09 09:48 ?1457次閱讀

    【嵌入式】C語(yǔ)言中volatile關(guān)鍵字

    00. 目錄文章目錄00. 目錄01. volatile概述02. volatile應(yīng)用場(chǎng)景03. volatile應(yīng)用示例04. 嵌入式系統(tǒng)中應(yīng)用05. volatile官方說(shuō)明
    發(fā)表于 10-21 10:21 ?6次下載
    【嵌入式】C語(yǔ)言中<b class='flag-5'>volatile</b>關(guān)鍵字

    Volatile關(guān)鍵字在嵌入式開(kāi)發(fā)中的應(yīng)用

    ,而__IO只是volatile的一個(gè)別名,在程序中往往利用下面的方法實(shí)現(xiàn):typedef __IO volatile;既然如此,那么volatile到底是什么作用呢?其實(shí),在C語(yǔ)言,
    發(fā)表于 11-02 18:21 ?6次下載
    <b class='flag-5'>Volatile</b>關(guān)鍵字在嵌入式開(kāi)發(fā)中的應(yīng)用

    C語(yǔ)言中的volatile是什么

    學(xué)C語(yǔ)言時(shí)有一個(gè)奇怪的關(guān)鍵字volatile,這到底有什么用呢?
    的頭像 發(fā)表于 02-17 14:29 ?1425次閱讀
    C語(yǔ)言中的<b class='flag-5'>volatile</b>是什么

    volatile的原理

    今天來(lái)了解一下面試題:你對(duì) volatile 了解多少。要了解 volatile 關(guān)鍵字,就得從 Java 內(nèi)存模型開(kāi)始。最后到 volatile 的原理。 一、Java 內(nèi)存模型 (JMM) 大家
    的頭像 發(fā)表于 10-10 16:33 ?573次閱讀
    <b class='flag-5'>volatile</b>的原理
    主站蜘蛛池模板: 97人操| 午夜免费福利视频 | 18性夜影院午夜寂寞影院免费 | 美女视频一区二区三区在线 | 天天色天天射天天干 | 五月婷婷开心综合 | 四虎免费看黄 | 六月婷婷七月丁香 | 国产自产视频在线观看香蕉 | 国产精品国产午夜免费福利看 | 色婷婷久久综合中文久久蜜桃 | 亚洲国产精品综合久久久 | 国产又色又爽又黄的网站在线一级 | 欧美在线播放 | 2019天天操夜夜操 | 激情在线播放免费视频高清 | 黄 色 成 年人网站 黄 色 成 年人在线 | 亚洲伦理中文字幕一区 | 深爱五月激情五月 | 久久综合香蕉久久久久久久 | www.毛片.com| 婷婷九月 | 日韩欧美高清一区 | 一区二区三区精品视频 | 亚洲成色999久久网站 | 视频一本大道香蕉久在线播放 | 1024手机在线看永久免费 | 国产网站免费观看 | 亚洲成人黄色 | 操操综合网 | 欧美一级特黄啪啪片免费看 | 爱爱动态视频免费视频 | 色欲情狂 | 亚洲 欧美 日韩 在线 中文字幕 | 婷婷激情小说 | 免费国产高清精品一区在线 | 伦理一区二区三区 | 日本久久高清视频 | 毛片一区二区三区 | 永久网站色视频在线观看免费 | 日本黄色大全 |