免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Java并發(fā)編程核心知識詳解:線程、鎖與線程池實戰(zhàn)

Java并發(fā)編程核心知識詳解:線程、鎖與線程池實戰(zhàn) 1. 線程基礎(chǔ)先搞清楚線程到底是什么線程這塊內(nèi)容可以說是Java面試里出場率最高的知識點沒有之一。不管是校招還是社招只要是后端方向幾乎必問線程相關(guān)的概念。我這些年面試別人也被別人面試發(fā)現(xiàn)線程八股問來問去核心就那么幾個方向線程的創(chuàng)建方式、生命周期、狀態(tài)流轉(zhuǎn)、線程池、鎖機制、并發(fā)工具類。把這些吃透了基本就能應(yīng)對絕大部分面試場景。先聊線程的本質(zhì)。線程是操作系統(tǒng)能夠進行運算調(diào)度的最小單位它被包含在進程之中是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流一個進程中可以并發(fā)多個線程每條線程并行執(zhí)行不同的任務(wù)。打個比方進程就像一家餐廳線程就像餐廳里的服務(wù)員一個餐廳可以有多個服務(wù)員同時服務(wù)不同的顧客。Java天生支持多線程編程這也是Java能成為企業(yè)級開發(fā)主流語言的重要原因之一。很多初學(xué)者對線程和進程的關(guān)系搞不清楚這里我多說一句。進程是資源分配的基本單位線程是CPU調(diào)度的基本單位。進程之間相互獨立各有獨立的地址空間同一個進程內(nèi)的線程共享進程的地址空間和資源。所以多線程編程最大的優(yōu)勢就是可以共享數(shù)據(jù)、節(jié)省資源但同時也帶來了并發(fā)安全問題這也是后面所有鎖機制存在的根本原因。從面試角度來說線程基礎(chǔ)這塊經(jīng)常被問到的一個問題是Java里創(chuàng)建線程有哪幾種方式這個問題看起來簡單但其實有很多細節(jié)可以深挖。我遇到過很多候選人能說出繼承Thread類和實現(xiàn)Runnable接口但對Callable和FutureTask、以及線程池創(chuàng)建這幾種方式理解不夠深入。下面具體展開說。1.1 線程創(chuàng)建方式的演進與對比Java創(chuàng)建線程的方式從最初的繼承Thread類到實現(xiàn)Runnable接口再到JDK 5引入的Callable和FutureTask以及最終的線程池經(jīng)歷了一個逐步演進的過程。這個演進過程本質(zhì)上是在解決如何更好地管理和復(fù)用線程這個問題。繼承Thread類是最傳統(tǒng)的方式直接new一個Thread的子類重寫run方法。這種方式代碼簡單但缺點很明顯Java是單繼承的一旦繼承了Thread類就不能再繼承其他類了擴展性差。而且這種方式把任務(wù)和線程耦合在一起不符合任務(wù)與執(zhí)行分離的設(shè)計思想。實現(xiàn)Runnable接口是更推薦的方式它把任務(wù)邏輯和線程本身解耦了。Runnable接口只有一個run方法里面寫的是任務(wù)要執(zhí)行的內(nèi)容。使用時還是需要創(chuàng)建Thread對象把Runnable實現(xiàn)類傳進去調(diào)用start方法。這種方式的好處是任務(wù)類還可以繼承其他類也更符合面向接口編程的思想。到了JDK 5引入了Callable接口和Runnable相比最大的區(qū)別是Callable的call方法有返回值而且可以拋出異常。但Callable不能直接傳給Thread使用需要配合FutureTask來包裝一下。FutureTask實現(xiàn)了Runnable接口所以可以傳給Thread同時又實現(xiàn)了Future接口可以獲取異步計算結(jié)果。線程池是JDK 5同時推出的也是目前生產(chǎn)環(huán)境用的最多的方式。核心思想是復(fù)用線程避免頻繁創(chuàng)建和銷毀線程帶來的性能開銷。阿里開發(fā)手冊明確禁止使用Executors工具類創(chuàng)建線程池而是要求通過ThreadPoolExecutor的方式手動創(chuàng)建這樣可以更明確地控制線程池的運行規(guī)則避免資源耗盡的風(fēng)險。我個人的經(jīng)驗是面試中回答創(chuàng)建方式時不要只是干巴巴地羅列幾種方式可以主動說一下各自的適用場景和優(yōu)缺點對比這會讓面試官覺得你是有真實項目經(jīng)驗的而不是背八股。1.2 線程生命周期與狀態(tài)流轉(zhuǎn)線程的生命周期是所有線程知識的基石理解不透徹后面學(xué)什么都不順暢。Java線程在運行過程中有六種狀態(tài)定義在Thread.State這個枚舉類里。NEW狀態(tài)是線程被創(chuàng)建但還沒調(diào)用start方法時的狀態(tài)。RUNNABLE是調(diào)用了start方法之后的狀態(tài)這里要注意Java的RUNNABLE狀態(tài)其實包含了操作系統(tǒng)層面的運行中和就緒兩種狀態(tài)也就是線程可能正在CPU上執(zhí)行也可能在等待CPU時間片。BLOCKED是線程在等待獲取監(jiān)視器鎖也就是synchronized的鎖時的狀態(tài)比如一個線程進入了synchronized代碼塊另一個線程也想進入就會進入BLOCKED狀態(tài)。WAITING是線程正在等待另一個線程執(zhí)行特定動作時的狀態(tài)比如調(diào)用了Object.wait()、Thread.join()、LockSupport.park()都會進入這個狀態(tài)。TIMED_WAITING是帶超時時間的等待狀態(tài)比如Thread.sleep、Object.wait(long timeout)、Thread.join(long millis)等。TERMINATED是線程執(zhí)行完run方法后的最終狀態(tài)。狀態(tài)流轉(zhuǎn)是面試的重點尤其容易被問到sleep和wait有什么區(qū)別這里一定要說清楚。sleep是Thread類的靜態(tài)方法調(diào)用后線程進入TIMED_WAITING狀態(tài)但不會釋放任何鎖資源wait是Object類的方法調(diào)用后線程進入WAITING狀態(tài)并且會釋放持有的鎖。這也是為什么wait方法必須在synchronized代碼塊中調(diào)用因為它需要先持有鎖然后釋放鎖讓其他線程有機會獲取鎖。sleep則沒有這個限制任何地方都能調(diào)用。還有一個高頻考點是線程的start方法和run方法有什么區(qū)別很多新手會犯直接調(diào)用run方法的錯誤。start方法會啟動一個新線程由新線程去執(zhí)行run方法里的邏輯直接調(diào)用run方法就只是在當(dāng)前線程執(zhí)行一個普通的方法調(diào)用根本沒有創(chuàng)建新線程。判斷一個線程是否啟動過可以看thread.getState()是否不等于NEW。關(guān)于狀態(tài)流轉(zhuǎn)我建議畫一張狀態(tài)轉(zhuǎn)換圖幫助記憶。我自己當(dāng)年學(xué)的時候把六種狀態(tài)的觸發(fā)條件和轉(zhuǎn)換關(guān)系整理成了一張表格貼在電腦旁邊天天看很快就記住了。后面排查線上問題的時候用jstack工具查看線程棧信息看到線程停在什么狀態(tài)、等在哪把鎖上這都是一眼就能看出來的基本功。2. 線程安全的核心機制synchronized與volatile線程安全問題本質(zhì)上是因為多線程同時訪問共享數(shù)據(jù)時發(fā)生了競爭。Java解決線程安全的手段很多但synchronized和volatile是最基礎(chǔ)、最核心的兩個關(guān)鍵詞。面試中幾乎必問這兩個關(guān)鍵字的原理和區(qū)別所以這塊一定要深入理解。先理解什么是臨界區(qū)和競態(tài)條件。臨界區(qū)是訪問共享資源的代碼段同一時刻只允許一個線程進入。競態(tài)條件是指多個線程同時讀寫共享數(shù)據(jù)時最終結(jié)果取決于線程執(zhí)行的相對時序可能導(dǎo)致數(shù)據(jù)不一致。解決競態(tài)條件的思路就是讓臨界區(qū)的代碼原子執(zhí)行即不可分割要么全部執(zhí)行完要么不執(zhí)行。synchronized關(guān)鍵字就是Java提供的解決并發(fā)安全的經(jīng)典機制。它有三種用法修飾實例方法、修飾靜態(tài)方法、修飾代碼塊。修飾實例方法時鎖的是當(dāng)前實例對象修飾靜態(tài)方法時鎖的是類的Class對象修飾代碼塊時鎖的是括號里指定的對象。這里有一個細節(jié)很多人會搞混synchronized修飾靜態(tài)方法和修飾實例方法它們鎖的對象是不同的所以兩者之間并不會互斥。2.1 synchronized的底層實現(xiàn)與鎖升級synchronized在JDK 6之前是一把重量級鎖性能表現(xiàn)不佳因為它的底層依賴于操作系統(tǒng)的互斥量mutex線程阻塞和喚醒都需要從用戶態(tài)切換到內(nèi)核態(tài)這個切換代價很大。所以在早期很多高并發(fā)場景下會刻意避免使用synchronized轉(zhuǎn)而使用JDK 5推出的Lock接口。但JDK 6引入了鎖升級機制之后synchronized的性能得到了大幅提升很多場景下性能已經(jīng)和ReentrantLock相差無幾。鎖升級的方向是無鎖 - 偏向鎖 - 輕量級鎖 - 重量級鎖。這個升級方向是單向的不會降級。偏向鎖是鎖升級的第一級。它的設(shè)計思想是大多數(shù)情況下鎖不僅不存在多線程競爭而且總是由同一個線程多次獲得。所以當(dāng)一個線程第一次訪問同步代碼塊時會在對象頭中記錄持有鎖的線程ID后續(xù)這個線程再次進入時就不需要再做任何同步操作了。如果有其他線程來競爭這把鎖偏向鎖就會撤銷升級為輕量級鎖。輕量級鎖的獲取方式是CAS自旋。多個線程在無競爭的情況下交替執(zhí)行同步代碼塊時通過CAS操作嘗試把對象頭中的鎖標(biāo)記替換為自己的線程記錄。如果替換成功就獲得了鎖如果失敗說明有競爭就會自旋等待。自旋是占用CPU的所以如果競爭激烈、自旋次數(shù)過多就會升級為重量級鎖。JDK 6之后自旋是自適應(yīng)的JVM會根據(jù)上次自旋的結(jié)果動態(tài)調(diào)整自旋次數(shù)。重量級鎖就是傳統(tǒng)的互斥鎖依賴操作系統(tǒng)的mutex實現(xiàn)。當(dāng)競爭非常激烈時沒有獲取到鎖的線程會進入阻塞狀態(tài)由用戶態(tài)切換到內(nèi)核態(tài)這個切換涉及上下文切換開銷很大。理解了鎖升級機制之后再回頭分析synchronized的適用場景就清楚了鎖競爭不激烈的情況下用synchronized完全沒問題但是一旦高并發(fā)下競爭激烈synchronized會膨脹為重量級鎖性能急劇下降這時候就要考慮ReentrantLock或者讀寫鎖了。2.2 volatile的可見性與有序性volatile是Java提供的最輕量級的同步機制它有兩個核心作用保證可見性和有序性但不能保證原子性。可見性是指當(dāng)一個線程修改了volatile變量的值該值會立即被刷新到主內(nèi)存中其他線程讀取該變量時會從主內(nèi)存中重新讀取最新的值而不是使用自己工作內(nèi)存中的副本。這解決的是多線程之間的數(shù)據(jù)透明問題。有序性是指volatile會禁止指令重排序。編譯器和CPU為了優(yōu)化執(zhí)行效率可能會對代碼指令進行重排這在單線程環(huán)境下沒有問題但在多線程環(huán)境下可能導(dǎo)致意想不到的結(jié)果。volatile通過在讀寫操作前后插入內(nèi)存屏障阻止指令重排到屏障的另一側(cè)從而保證了程序執(zhí)行的順序符合編寫時的預(yù)期。但是volatile不保證原子性這也是面試中最容易考到的一個點。經(jīng)典的場景是i操作雖然i被聲明為volatile但i實際上是讀-改-寫三步操作不是一個原子操作。多個線程同時執(zhí)行i時還是可能出現(xiàn)數(shù)據(jù)覆蓋的問題。所以volatile適合修飾那些多個線程都會讀取、但只有少數(shù)線程會寫入、且寫入不依賴當(dāng)前值的場景典型的就是作為狀態(tài)標(biāo)志位。在并發(fā)編程中還有一個著名的happens-before原則需要了解。這個原則定義了多線程操作之間的內(nèi)存可見性規(guī)則是JMMJava內(nèi)存模型的核心內(nèi)容。happens-before規(guī)則包括程序順序規(guī)則、鎖規(guī)則、volatile變量規(guī)則、傳遞性規(guī)則等。其中volatile變量規(guī)則說的是對一個volatile變量的寫操作happens-before于后續(xù)對該變量的讀操作。理解這些規(guī)則能幫你判斷到底能不能用volatile解決當(dāng)前的問題。我面試時喜歡問一個問題synchronized和volatile有什么區(qū)別這個問題考察的是對并發(fā)基礎(chǔ)的理解深度。標(biāo)準(zhǔn)的回答應(yīng)該圍繞三方面一是volatile本質(zhì)是告訴JVM這個變量是共享且不穩(wěn)定的每次都要從主內(nèi)存中讀取synchronized則是讓多個線程互斥訪問臨界區(qū)。二是volatile只能修飾變量不能修飾方法synchronized可以修飾方法和代碼塊。三是volatile不保證原子性synchronized保證原子性volatile不會阻塞線程synchronized會讓未獲取鎖的線程阻塞。3. 線程通信wait/notify與LockSupport多線程之間除了互斥訪問共享資源還經(jīng)常需要互相協(xié)作配合。比如生產(chǎn)者-消費者模式中消費者要等生產(chǎn)者生產(chǎn)出數(shù)據(jù)之后才能消費這時候就需要線程通信機制。Java中線程通信最經(jīng)典的方式是wait/notify機制使用Object類的wait、notify、notifyAll方法。這三個方法都必須在synchronized代碼塊或者synchronized方法中調(diào)用因為它們操作的對象的監(jiān)視器鎖。調(diào)用wait方法后當(dāng)前線程會釋放持有的鎖并進入WAITING狀態(tài)直到其他線程調(diào)用同一個對象上的notify或notifyAll方法將它喚醒。這里有個非常重要的細節(jié)notify方法是隨機喚醒一個正在等待該對象鎖的線程notifyAll是喚醒所有等待的線程。如果需要精確喚醒某個特定的線程那就要用后面引入的Lock和Condition機制了。JDK 5之后引入了Lock接口和Condition接口Condition提供了await、signal、signalAll方法功能類似wait、notify、notifyAll但更加靈活。一個Lock可以創(chuàng)建多個Condition每個Condition維護一個獨立的等待隊列這樣就能實現(xiàn)精確喚醒某個或某類線程而不是像synchronized那樣只能使用一個隱式條件隊列。舉個例子在實現(xiàn)一個有界阻塞隊列時如果用synchronized實現(xiàn)只有一個等待隊列生產(chǎn)者生產(chǎn)滿時等待消費者消費空時等待notify時無法區(qū)分喚醒的是生產(chǎn)者還是消費者。而有了Condition之后可以創(chuàng)建兩個ConditionnotEmpty和notFull消費者等待notEmpty條件生產(chǎn)者等待notFull條件這樣就能精準(zhǔn)喚醒對應(yīng)類型的線程效率更高且邏輯更清晰。LockSupport是更底層的線程阻塞工具類基于Unsafe類的park和unpark方法實現(xiàn)。它的核心優(yōu)勢是不需要持有鎖就能使用且unpark可以先于park調(diào)用也就是許可機制使得線程可以先被叫醒再等待。AQS框架中大量使用了LockSupport來管理線程的阻塞與喚醒。我在實際項目中用Condition的場景還是蠻多的比如實現(xiàn)限流器、實現(xiàn)任務(wù)隊列的消費者調(diào)度。這套機制比單純用synchronized加wait/notify要優(yōu)雅得多代碼可讀性也更好。線程通信的常見面試題還包括wait方法為什么要放在while循環(huán)中答案是為了防止虛假喚醒。有些情況下線程被喚醒時等待的條件并不一定已經(jīng)滿足可能是被其他原因喚醒的所以被喚醒后要再次檢查條件是否滿足不滿足就繼續(xù)等待。這也是《Effective Java》里面明確的建議總是使用while循環(huán)來包圍wait方法調(diào)用。3.1 生產(chǎn)者消費者模型的兩種實現(xiàn)生產(chǎn)者-消費者模型是線程通信最經(jīng)典的應(yīng)用場景面試中經(jīng)常要求手寫實現(xiàn)。我用synchronized和Lock兩種方式各自實現(xiàn)了一遍這里分享下核心代碼和思路差異。用synchronized實現(xiàn)的核心邏輯是定義一個緩沖區(qū)列表和一個最大容量生產(chǎn)者和消費者都在synchronized代碼塊內(nèi)操作。緩沖區(qū)滿了就調(diào)用wait等待緩沖區(qū)空了也調(diào)用wait等待。每次生產(chǎn)或消費完一個數(shù)據(jù)后都調(diào)用notifyAll喚醒其他線程。class Buffer { private final ListInteger list new ArrayList(); private final int capacity 10; public synchronized void put(int value) throws InterruptedException { while (list.size() capacity) { wait(); } list.add(value); notifyAll(); } public synchronized int take() throws InterruptedException { while (list.isEmpty()) { wait(); } int value list.remove(0); notifyAll(); return value; } }用Lock和Condition實現(xiàn)的方式類似但可以區(qū)分生產(chǎn)者和消費者的喚醒。代碼結(jié)構(gòu)上synchronized是隱式獲取和釋放鎖Lock則要求手動加鎖和釋放鎖必須在finally中釋放鎖避免死鎖。class Buffer { private final ReentrantLock lock new ReentrantLock(); private final Condition notFull lock.newCondition(); private final Condition notEmpty lock.newCondition(); private final ListInteger list new ArrayList(); private final int capacity 10; public void put(int value) throws InterruptedException { lock.lock(); try { while (list.size() capacity) { notFull.await(); } list.add(value); notEmpty.signal(); } finally { lock.unlock(); } } public int take() throws InterruptedException { lock.lock(); try { while (list.isEmpty()) { notEmpty.await(); } int value list.remove(0); notFull.signal(); return value; } finally { lock.unlock(); } } }這兩種實現(xiàn)的性能差異在并發(fā)量不大的時候幾乎感覺不到但Lock版本的可擴展性明顯更好。面試時如果能同時寫出兩種實現(xiàn)并且分析出各自的特點這是一個加分項。4. 鎖的進階ReentrantLock、讀寫鎖與AQS前面反復(fù)提到Lock接口和AQS這一節(jié)重點展開講。JDK 5引入的java.util.concurrent并發(fā)包是Java并發(fā)編程的里程碑而AQSAbstractQueuedSynchronizer是這個并發(fā)包的靈魂。ReentrantLock是最常用的Lock實現(xiàn)類它和synchronized相比有以下幾個核心優(yōu)勢。一是支持公平鎖和非公平鎖兩種模式synchronized只能是非公平的。公平鎖按照線程請求鎖的順序來獲取鎖保證先來先得但吞吐量會低一些非公平鎖允許線程插隊吞吐量高但可能出現(xiàn)線程饑餓。二是支持可中斷獲取鎖調(diào)用lockInterruptibly方法后等待鎖的過程中可以被其他線程中斷而synchronized等待鎖時是不能響應(yīng)中斷的。三是支持超時獲取鎖調(diào)用tryLock(long timeout, TimeUnit unit)方法在指定時間內(nèi)獲取不到鎖就會返回false可以避免無限期等待。四是支持多個條件變量通過newCondition可以創(chuàng)建多個Condition實例。這里說一個面試高頻題ReentrantLock和synchronized的區(qū)別是什么除了上面說的四點還要補充底層的區(qū)別synchronized是JVM層面實現(xiàn)的基于監(jiān)視器鎖ReentrantLock是JDK層面實現(xiàn)的基于AQSsynchronized在JDK 6之后有鎖升級機制ReentrantLock從誕生起就使用CAS加自旋的方式實現(xiàn)。4.1 AQS的實現(xiàn)原理AQS是Java并發(fā)包的核心抽象它維護了一個volatile int類型的state變量和一個FIFO的等待隊列。state的含義由具體的子類去定義比如在ReentrantLock中state表示獲取鎖的次數(shù)在Semaphore中state表示剩余許可證的數(shù)量在CountDownLatch中state表示還需要等待的計數(shù)個數(shù)。AQS的基本思想是當(dāng)線程請求資源時通過CAS嘗試將state從期望值更新為新值如果成功就表示獲取資源成功如果失敗則將該線程封裝成Node節(jié)點插入到等待隊列的尾部然后通過LockSupport.park阻塞自己。當(dāng)前驅(qū)節(jié)點的線程釋放資源時會喚醒隊列中下一個節(jié)點對應(yīng)的線程。這里有幾個細節(jié)值得注意等待隊列中的Node節(jié)點每個節(jié)點都保存著線程引用和等待狀態(tài)。AQS在釋放資源時會從隊列頭部開始找第一個狀態(tài)有效的節(jié)點來喚醒。這個喚醒過程也是需要循環(huán)判斷的因為節(jié)點的等待狀態(tài)可能會有變化。ReentrantLock的加鎖過程本質(zhì)上就是通過CAS把state從0改成1。如果當(dāng)前線程已經(jīng)持有鎖了再次獲取鎖時state會繼續(xù)累加這就是可重入的含義。釋放鎖時state遞減直到state變?yōu)?鎖才真正被釋放。公平鎖和非公平鎖的區(qū)別在于非公平鎖在加鎖時會先嘗試一次CAS搶鎖搶不到再進入等待隊列公平鎖則直接進入等待隊列排隊。4.2 讀寫鎖與StampedLockReadWriteLock讀寫鎖是一種特殊類型的鎖它維護了一對鎖一個讀鎖和一個寫鎖。讀鎖之間可以共享多個線程可以同時持有讀鎖寫鎖是排他的一個線程持有寫鎖時其他線程既不能讀也不能寫。這種設(shè)計非常適用于讀多寫少的場景比如緩存系統(tǒng)、配置加載等。ReentrantReadWriteLock是ReadWriteLock的實現(xiàn)類但也存在一些問題。比如讀鎖和寫鎖之間會互相阻塞也就是所謂的寫?zhàn)囸I問題如果有大量線程在持續(xù)讀寫線程可能會長時間得不到執(zhí)行。它也不是完全公平的在非公平模式下寫線程插隊的機會是有限的。JDK 8引入了StampedLock它提供了一種更先進的鎖模型。StampedLock有三種模式寫鎖、讀鎖、樂觀讀。樂觀讀是一種完全不加鎖的讀操作它先獲取一個stamp標(biāo)記然后讀數(shù)據(jù)讀完后再次檢查stamp是否發(fā)生了變化。如果沒變說明讀的過程中沒有寫操作這次讀是可靠的如果變了則升級為普通的讀鎖重讀。樂觀讀非常適合讀多寫少的場景能夠大幅提升吞吐量。需要注意StampedLock不是可重入的而且不支持條件變量。使用樂觀讀時必須小心驗證stamp的有效性這個驗證過程要放在讀數(shù)據(jù)之后。5. 線程池參數(shù)配置與運行機制線程池是Java并發(fā)編程中應(yīng)用最廣的組件也是面試中的重頭戲。幾乎所有的Java后端服務(wù)都離不開線程池從Tomcat處理請求到RPC框架的異步調(diào)用都在使用線程池。理解線程池的運作機制不只是應(yīng)付面試更是日常開發(fā)的基本功。使用線程池的好處不需要多講降低資源消耗、提高響應(yīng)速度、提高線程的可管理性。JDK的線程池實現(xiàn)核心是ThreadPoolExecutor類它提供了非常豐富的構(gòu)造參數(shù)和靈活的擴展點。面試中考察線程池時幾乎必問的問題是ThreadPoolExecutor的核心參數(shù)有哪些分別代表什么含義核心參數(shù)包括corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。corePoolSize是核心線程數(shù)核心線程即使空閑也不會被銷毀maximumPoolSize是線程池允許的最大線程數(shù)keepAliveTime是非核心線程空閑存活時間超過這個時間就會被回收workQueue是任務(wù)隊列存儲等待執(zhí)行的任務(wù)threadFactory是線程工廠可以自定義線程命名等屬性handler是拒絕策略當(dāng)線程池和隊列都滿時如何處理新提交的任務(wù)。5.1 任務(wù)提交與執(zhí)行流程線程池執(zhí)行任務(wù)的流程是面試中必須掌握的。當(dāng)調(diào)用execute提交一個任務(wù)時ThreadPoolExecutor的執(zhí)行策略如下如果當(dāng)前線程數(shù)小于核心線程數(shù)corePoolSize則創(chuàng)建新線程來執(zhí)行任務(wù)如果當(dāng)前線程數(shù)大于等于核心線程數(shù)且隊列未滿則把任務(wù)放入隊列中等待執(zhí)行如果隊列已滿且當(dāng)前線程數(shù)小于最大線程數(shù)maximumPoolSize則創(chuàng)建非核心線程來執(zhí)行任務(wù)如果隊列已滿且線程數(shù)已達到最大線程數(shù)則根據(jù)拒絕策略執(zhí)行拒絕處理。這個流程可以用一句話總結(jié)先看核心線程是否夠用再看隊列是否能容納最后看最大線程數(shù)是否到頂。有一點要注意很多框架實際使用的線程池配置比如Dubbo這類RPC框架為了降低任務(wù)處理延遲會設(shè)置足夠大的核心線程數(shù)讓線程池不會因為隊列堆積而產(chǎn)生大量等待。這是典型的空間換時間的取舍。拒絕策略有四種實現(xiàn)分別是AbortPolicy拋出RejectedExecutionException異常阻止任務(wù)提交、CallerRunsPolicy調(diào)用提交任務(wù)的線程直接執(zhí)行被拒絕的任務(wù)、DiscardPolicy默默丟棄任務(wù)、DiscardOldestPolicy丟棄隊列中最早的任務(wù)然后嘗試重新提交。生產(chǎn)環(huán)境最常用的還是AbortPolicy和CallerRunsPolicy前者快速失敗后者能將壓力回傳給提交方起到背壓效果。如果一個系統(tǒng)對任務(wù)丟失不能接受那就要自定義拒絕策略比如把任務(wù)持久化到數(shù)據(jù)庫或消息隊列里。5.2 線程池參數(shù)配置的經(jīng)驗公式線程池參數(shù)并沒有一個萬能的配置公式具體要結(jié)合業(yè)務(wù)場景來定。但從經(jīng)驗來看可以根據(jù)任務(wù)類型是CPU密集型還是IO密集型來做初步估算。CPU密集型任務(wù)指的是計算量大、很少有IO等待的任務(wù)比如大量數(shù)學(xué)運算、圖像渲染。這類任務(wù)的瓶頸在CPU線程數(shù)和CPU核心數(shù)相當(dāng)即可。一般配置為CPU核心數(shù)1公式是Ncpu1。加1是為了避免CPU空轉(zhuǎn)當(dāng)某個線程因為缺頁或其他原因被暫停時多出的線程可以頂上。IO密集型任務(wù)指的是大量時間在等待IO操作的任務(wù)比如網(wǎng)絡(luò)請求、數(shù)據(jù)庫讀寫、文件操作。這類任務(wù)等待時間長CPU占用率低所以可以配置更多的線程。一般配置為CPU核心數(shù)的兩倍公式是2*Ncpu。更精細的估算方法是線程數(shù) CPU核心數(shù) * (1 平均等待時間 / 平均計算時間)。但這個公式對時間比的估計很難精確實踐中通常直接用2倍核數(shù)起步再通過壓測調(diào)整。拒絕策略的選擇和隊列類型也要配套考慮。比如使用有界隊列時隊列容量可以這樣估算期望的排隊等待時間乘以請求速率。如果平均請求速率為1000個每秒期望最大排隊時間為2秒那么隊列容量就可以設(shè)置為2000。當(dāng)然這只是理論參考實際還是以壓測為準(zhǔn)。我自己習(xí)慣的配置方法是先把核心線程數(shù)設(shè)置為系統(tǒng)的常駐請求并發(fā)數(shù)最大線程數(shù)設(shè)置為峰值并發(fā)數(shù)隊列容量設(shè)置為峰值和均值之間的緩沖量然后通過壓測逐步微調(diào)。線程池參數(shù)永遠不是一次配置就完成的而是在運行過程中持續(xù)監(jiān)控和調(diào)整的。5.3 手動創(chuàng)建線程池的正確姿勢前文提到阿里開發(fā)手冊禁止使用Executors創(chuàng)建線程池原因是Executors提供的幾個工廠方法都有隱患。newFixedThreadPool和newSingleThreadExecutor使用了無界隊列LinkedBlockingQueue當(dāng)任務(wù)提交速度超過處理速度時隊列會無限增長最終可能導(dǎo)致內(nèi)存溢出。newCachedThreadPool的最大線程數(shù)是Integer.MAX_VALUE如果任務(wù)提交過快而處理速度跟不上會創(chuàng)建大量線程耗盡系統(tǒng)資源。newScheduledThreadPool同樣存在隊列無界的問題。正確的方式是使用ThreadPoolExecutor的構(gòu)造方法手動創(chuàng)建。下面給一個參考配置ThreadPoolExecutor executor new ThreadPoolExecutor( corePoolSize, // 核心線程數(shù) maximumPoolSize, // 最大線程數(shù) keepAliveTime, // 非核心線程空閑存活時間 TimeUnit.SECONDS, // 時間單位 new ArrayBlockingQueue(queueCapacity), // 有界任務(wù)隊列 new ThreadFactory() { private final AtomicInteger counter new AtomicInteger(); Override public Thread newThread(Runnable r) { Thread thread new Thread(r, business-thread- counter.incrementAndGet()); thread.setDaemon(false); return thread; } }, new ThreadPoolExecutor.AbortPolicy() // 拒絕策略 );給線程命名是一個容易被忽視但很重要的細節(jié)。線上排查問題時如果線程名都是有業(yè)務(wù)含義的比如order-service-thread-1、mq-consumer-thread-2jstack輸出一眼就能看出是哪個業(yè)務(wù)模塊的線程出了問題。如果所有線程都叫pool-1-thread-1排查效率會低很多。線程池還需要關(guān)注動態(tài)調(diào)整。ThreadPoolExecutor提供了setCorePoolSize和setMaximumPoolSize方法可以在運行期調(diào)整參數(shù)。比較常見的做法是通過監(jiān)控系統(tǒng)度量指標(biāo)根據(jù)當(dāng)前的隊列長度和活躍線程數(shù)動態(tài)調(diào)整線程池參數(shù)來應(yīng)對流量波動。這在秒殺、大促這類場景特別有用。最后必須強調(diào)線程池在Spring容器中要作為單例Bean管理不要在每個業(yè)務(wù)方法里new一個線程池。我見過有同事在循環(huán)內(nèi)創(chuàng)建線程池直接把內(nèi)存打爆了。線程池是重資源必須復(fù)用量級實例。6. ThreadLocal與內(nèi)存泄漏陷阱ThreadLocal是一個很有意思的類它提供線程局部變量每個線程都有自己獨立的變量副本互不干擾。ThreadLocal的典型應(yīng)用場景包括存儲用戶會話信息、數(shù)據(jù)庫連接管理、SimpleDateFormat日期格式化工具的線程安全替換方案。ThreadLocal的原理說復(fù)雜也復(fù)雜說簡單也簡單。每個Thread對象內(nèi)部都有一個ThreadLocalMap這個Map的key是ThreadLocal對象本身的弱引用value是線程持有的變量值。當(dāng)線程訪問ThreadLocal時ThreadLocal內(nèi)部類會先從當(dāng)前線程中獲取ThreadLocalMap然后以自身為key去查找對應(yīng)的value。這里就引出了ThreadLocal最著名的內(nèi)存泄漏問題。ThreadLocalMap的key是弱引用WeakReferencevalue是強引用。當(dāng)外部沒有對ThreadLocal的強引用時GC回收時就會把key清掉但value仍然是強引用鏈Thread - ThreadLocalMap - Entry - value。如果線程生命周期很長而value一直不被清除就會造成內(nèi)存泄漏。規(guī)避這個問題的方法已經(jīng)成為一個共識使用完ThreadLocal后必須調(diào)用remove方法清除。尤其是在線程池場景下線程復(fù)用次數(shù)很多如果不顯式remove同一個線程處理不同請求時可能會讀取到上一個請求殘留的ThreadLocal值造成數(shù)據(jù)混亂。這個坑非常隱蔽線上偶發(fā)出現(xiàn)用戶串號這類問題很多就是ThreadLocal沒清理導(dǎo)致的。我習(xí)慣在finally塊里調(diào)用remove保證異常情況下也能清除。示例代碼如下try { threadLocal.set(userInfo); // 業(yè)務(wù)邏輯 } finally { threadLocal.remove(); }另外要提醒的是不要在靜態(tài)方法中跨線程使用ThreadLocal也不要把ThreadLocal的value設(shè)計成可變的共享對象。ThreadLocal解決的是線程間的變量隔離問題如果value本身是被多個線程共享的引用類型那線程隔離的效果就大打折扣了。6.1 子線程如何繼承父線程的ThreadLocal如果我們希望主線程設(shè)置的ThreadLocal值能被子線程讀取到直接使用ThreadLocal是做不到的因為子線程是獨立的新線程有自己的ThreadLocalMap。這時候可以使用InheritableThreadLocal。InheritableThreadLocal繼承了ThreadLocal它在線程創(chuàng)建時會把父線程的ThreadLocalMap中的值復(fù)制一份到子線程中。這樣子在子線程中就能讀取到父線程設(shè)置的值了。但是這里也有坑如果主線程在創(chuàng)建子線程之后修改了ThreadLocal的值子線程中的副本并不會自動更新。它只是創(chuàng)建時的一份快照之后兩者互不影響。如果需要實現(xiàn)父子線程間的全量傳遞比如鏈路追蹤需要把traceId傳遞到異步線程池中那就需要更強大的方案了。目前業(yè)內(nèi)常用的做法是使用TransmittableThreadLocalTTL這是阿里開源的一個庫能在線程池場景下實現(xiàn)上下文的無損傳遞。TTL會在任務(wù)提交時捕獲當(dāng)前線程的ThreadLocal值并在任務(wù)執(zhí)行時重新設(shè)置到執(zhí)行線程中執(zhí)行完再恢復(fù)原值。這個工具在分布式鏈路追蹤和異步并發(fā)場景中很有用如果簡歷上寫到了相關(guān)項目面試時提到TTL是一個不錯的加分項。7. 并發(fā)工具類CountDownLatch、CyclicBarrier、SemaphoreJDK 5在并發(fā)包中提供了幾個非常實用的同步工具類CountDownLatch、CyclicBarrier、Semaphore、Exchanger。它們基于AQS實現(xiàn)面試中考察概率很高尤其喜歡考CountDownLatch和CyclicBarrier的區(qū)別。CountDownLatch是一個倒計時器它允許一個或多個線程等待其他線程完成一組操作后再繼續(xù)執(zhí)行。典型場景是主線程啟動多個子線程并行執(zhí)行任務(wù)等所有子任務(wù)都完成后主線程再匯總結(jié)果。使用方法是先new CountDownLatch(n)指定計數(shù)數(shù)量每個子線程執(zhí)行完任務(wù)后調(diào)用countDown方法將計數(shù)減一主線程調(diào)用await方法阻塞等待直到計數(shù)變?yōu)?。CountDownLatch的計數(shù)是單向的減到0之后就無法重置了所以它只能使用一次。如果需要重復(fù)使用的場景應(yīng)該用CyclicBarrier。CyclicBarrier是循環(huán)屏障它允許多個線程在某個屏障點互相等待直到所有線程都到達該屏障點才繼續(xù)執(zhí)行。和CountDownLatch相比CyclicBarrier是所有線程互相等待而不是一個線程等待其他線程。它的計數(shù)可以重置所以可以循環(huán)使用。CyclicBarrier還支持一個可選的Runnable參數(shù)當(dāng)所有線程到達屏障點時會先執(zhí)行這個Runnable中的代碼。Semaphore是信號量它維護一組許可證線程在執(zhí)行前必須先acquire獲取許可證執(zhí)行完release歸還許可證。Semaphore常用于控制同時訪問特定資源的線程數(shù)比如連接池的連接數(shù)限制、限流控制。公平模式的Semaphore能保證先獲取許可證的線程先執(zhí)行避免饑餓問題。這三種工具類的適用場景很容易混淆我整理一個對比幫助記憶工具類核心用途使用次數(shù)等待關(guān)系CountDownLatch一個線程等待多個線程完成只能使用一次單向等待CyclicBarrier多個線程互相等待到達屏障可循環(huán)使用互相等待Semaphore控制同時執(zhí)行任務(wù)的最大線程數(shù)可重復(fù)使用獲取/釋放許可證它們?nèi)齻€在AQS中的實現(xiàn)方式也不同。CountDownLatch和Semaphore都是通過state字段來記錄計數(shù)或許可證數(shù)量獲取資源就是CAS遞減state釋放資源就是CAS遞增state。CyclicBarrier的實現(xiàn)更復(fù)雜一些它內(nèi)部使用了一個ReentrantLock和Condition來協(xié)調(diào)所有線程的等待和喚醒。7.1 實際項目中如何選用并發(fā)工具我做一個具體案例來演示這三個工具的實際選型思路。假設(shè)有一個數(shù)據(jù)統(tǒng)計任務(wù)要把10份數(shù)據(jù)文件分別統(tǒng)計再合并匯總出總結(jié)果。這個問題用CountDownLatch就很合適主線程開著10個子線程分別統(tǒng)計每個統(tǒng)計完countDown一次主線程await后做合并匯總。用CyclicBarrier也可以做但語義上不如CountDownLatch直接。再假設(shè)有這樣一個場景一個小組里的5個成員需要同時開始進行一個事務(wù)流程的各階段處理每個成員處理完自己的本階段工作后需要等所有成員都完成當(dāng)前階段才能進入下一階段。這個場景就是CyclicBarrier的經(jīng)典用例每輪階段結(jié)束就自動進入下一輪循環(huán)使用。而控制某個服務(wù)的最大并發(fā)調(diào)用數(shù)比如限定對第三方接口的調(diào)用并發(fā)不超過20則會用Semaphore。每次調(diào)用前acquire調(diào)用完release超出的請求就會阻塞等待。在真實的高并發(fā)項目中這三個工具經(jīng)常組合使用。比如用Semaphore限流用CountDownLatch做任務(wù)編排用CyclicBarrier做分階段并行計算。理解了每個工具的設(shè)計目標(biāo)和適用場景寫起來就自然順暢。8. 多線程問題排查與實戰(zhàn)技巧理論講了這么多最終還是要落到實戰(zhàn)。多線程開發(fā)中代碼層面的問題往往是隱蔽且難以復(fù)現(xiàn)的死鎖、線程泄漏、CPU飆高、內(nèi)存溢出每一類都讓人頭疼。這節(jié)分享一下我在實際項目中排查多線程問題的思路和方法。死鎖是最經(jīng)典的多線程問題。產(chǎn)生死鎖的四個條件是互斥條件、持有并等待條件、不可剝奪條件、循環(huán)等待條件。排查死鎖時最快的方式是使用jstack命令獲取當(dāng)前Java進程的線程快照它會自動檢測死鎖并打印出死鎖的線程和鎖的持有情況。先通過jps找到Java進程的PID然后執(zhí)行jstack PID輸出信息中如果包含F(xiàn)ound one Java-level deadlock這樣的字樣就說明死鎖了。隨后信息中會詳細展示兩個線程分別持有什么鎖、在等待什么鎖。根據(jù)這些信息就能定位到是哪段代碼導(dǎo)致的死鎖。線上遇到CPU飆高的問題排查思路是先通過top -H -p PID找到CPU占用率最高的線程ID把它轉(zhuǎn)成十六進制然后jstack PID | grep -A 20 nid0x十六進制值就能定位到具體線程的堆棧。如果堆棧停留在線程池的任務(wù)執(zhí)行方法上那大概率是某個業(yè)務(wù)方法出現(xiàn)了死循環(huán)或者大量的無效計算。對于線程池線程數(shù)量異常增長的問題多半是任務(wù)隊列容量設(shè)置不合理或者拒絕策略配置不當(dāng)。優(yōu)先檢查ThreadPoolExecutor的四個關(guān)鍵指標(biāo)當(dāng)前活躍線程數(shù)、核心線程數(shù)、最大線程數(shù)、隊列剩余容量??梢酝ㄟ^暴露metrics接口來定期采集這些狀態(tài)配合監(jiān)控告警在問題擴大前及時介入。我曾經(jīng)排查過一個典型的線程泄漏問題線上服務(wù)運行幾天后線程數(shù)線性增長最終內(nèi)存溢出。jstack后發(fā)現(xiàn)大量線程阻塞在數(shù)據(jù)庫連接獲取處。究其原因是某個線程池中的任務(wù)里調(diào)用了數(shù)據(jù)庫操作但因為事務(wù)配置錯誤導(dǎo)致連接沒有釋放后續(xù)任務(wù)全部積壓在等待連接的隊列中線程池不斷創(chuàng)建新的線程來承接新任務(wù)。最終定位到的是連接泄漏問題而不是線程池配置問題。所以排查線程問題時要跳出線程本身去看它依賴的資源和下游系統(tǒng)。多線程的調(diào)試也很特殊斷點調(diào)試多線程時往往會改變線程的執(zhí)行時序原來能復(fù)現(xiàn)的并發(fā)Bug可能一下子就不出現(xiàn)了。我建議多用日志來輔助排查在關(guān)鍵節(jié)點打印線程名、時間戳、關(guān)鍵數(shù)據(jù)狀態(tài)。給線程起好名字在這里就顯得特別重要了打印出來的日志里如果能直接看到是哪個業(yè)務(wù)的線程在活動排查效率能提升一大截。還有一個小技巧在開發(fā)階段可以通過設(shè)置JVM參數(shù)-XX:PrintConcurrentLocks來打印并發(fā)鎖的信息結(jié)合jstack使用能更清楚地看到鎖的競爭情況。另外如果項目用了Caffeine或者Redisson這類第三方庫它們在日志里也會有關(guān)鍵線索比如阻塞隊列深度、鎖等待時間等。9. 面試答題技巧與高頻八股速查最后這部分我結(jié)合自己面試和被面的經(jīng)驗整理一份高頻Java線程八股的快問快答順便聊一下怎么答才能從海量候選人中脫穎而出。先說答題思路。八股文的答案大多有個標(biāo)準(zhǔn)范式但面試官真正想看的是你有沒有自己的理解。所以回答任何概念題我建議按照是什么-為什么-怎么用-有什么坑的四段式結(jié)構(gòu)來展開。比如被問到synchronized鎖升級不要只背偏向鎖、輕量級鎖、重量級鎖三個名詞而要說清楚為什么需要鎖升級、JDK 6之前性能差的原因是什么、升級條件是什么、什么場景下會出現(xiàn)什么問題。這樣的回答會讓面試官覺得你是真的用過在真實項目中踩過坑有思考深度。常見問題速查如下線程創(chuàng)建方式有幾種四種繼承Thread、實現(xiàn)Runnable、實現(xiàn)Callable配合FutureTask、線程池。線程有哪些狀態(tài)六種NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。注意RUNNABLE是Java層概念實際可能處于運行中或者等待CPU調(diào)度。sleep和wait區(qū)別sleep不釋放鎖wait釋放鎖sleep是Thread方法wait是Object方法sleep需要指定時間wait可以不指定也可以指定時間sleep用于暫停執(zhí)行wait用于線程間通信。synchronized和ReentrantLock區(qū)別是否自動釋放鎖、是否可重入都可重入、是否支持公平鎖、是否可中斷、是否支持多個條件變量、底層實現(xiàn)JVM層面 vs JDK層面。volatile和synchronized的區(qū)別volatile不保證原子性、只能修飾變量、不會阻塞線程synchronized保證原子性、可修飾方法和代碼塊、未獲取鎖的線程會阻塞。ThreadLocal內(nèi)存泄漏的解決方案使用完調(diào)用remove或者在ThreadLocal的Entry中通過弱引用來輔助回收。線程池的拒絕策略有哪些AbortPolicy拋異常、CallerRunsPolicy調(diào)用者執(zhí)行、DiscardPolicy丟棄、DiscardOldestPolicy丟棄最老的。生產(chǎn)環(huán)境最常用AbortPolicy和CallerRunsPolicy。CountDownLatch和CyclicBarrier區(qū)別方向不同CountDownLatch是一個/多個線程等待其他線程CyclicBarrier是多個線程互相等待CountDownLatch只能使用一次CyclicBarrier可以循環(huán)使用CountDownLatch基于AQSCyclicBarrier基于ReentrantLock和Condition。CAS的優(yōu)缺點優(yōu)點是非阻塞、無需鎖和上下文切換缺點是只能保證一個變量的原子操作、循環(huán)時間長開銷大、存在ABA問題。ABA問題可以通過AtomicStampedReference加版本號解決。什么是線程安全多個線程訪問共享數(shù)據(jù)時無論線程如何交替執(zhí)行最終結(jié)果都符合預(yù)期且不產(chǎn)生數(shù)據(jù)破壞。有一個問題值得特別說一下為什么阿里規(guī)范強調(diào)不用Executors創(chuàng)建線程池除了前面說的無界隊列和最大線程數(shù)問題還有一個隱性問題Executors里創(chuàng)建的線程工廠基本都是默認的線程名毫無辨識度出問題排查起來很麻煩。使用自定義ThreadPoolExecutor加自定義ThreadFactory是最佳的實踐路徑。最后的最后想跟準(zhǔn)備面試的朋友說一句線程八股的知識點再多歸根結(jié)底是幫助你建立對并發(fā)編程的完整認知框架。不要只是死記硬背建議把文中的代碼都動手跑一遍改一改參數(shù)觀察現(xiàn)象遇到問題再回頭看理論印象會深刻得多。并發(fā)編程是一門實踐性很強的學(xué)問理論只是地圖真正踏過一遍坑才能成為自己手頭的能力。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
热思思九九| 国产人妻人伦精品一区二区| 97人人射| 丁香婷婷婷婷十二月在线观看视频| 99ri视频在线观看| 久久久这里都是精品| 婷婷五月丁香激情色情| 免费观看的av| 中文成人在线| 日本一毛片| 99热乎| 五月丁香六月婷婷综合网| 五月丁香六月婷婷的女人| 欧美日本国产欧美日本韩国99| 丁香五月成人网| 秋霞少妇AV网站| 五月天激情图片网| 777丁香六月青青草婷婷综合久月| 婷婷五月天电影在线| 性高潮久久久久久-九九九九九九九九九九热-成人AV | www.97干视频| 人人操Av| 中文在线成人| 偷拍九九热| 99在线精品视频| 丁香六月婷婷综合麻豆| 色综合久久44| 99视频啪啪| 欧美操人| 五月天激情视频| 成人在线99| 97亚洲精品| 五月天六月色| 五月天婷婷深深爱| 婷婷激情五月天小说校园| 天天舔天天摸天天射| 欧美久久婷婷| 久久免费精品小视频| 哇嘎成人久久| 美女黄频aⅴ视频| 五月天婷婷激情四射综合| 禁欲电影完整版在线播放| 综合色色婷婷| 色婷婷亚洲婷婷| 色婷婷www| 五月丁香六月婷婷操操操| 久久在线人妻| 五月天精品| 五月婷婷 激情五月| 99久久婷婷五月天| 五月亚洲| 亚洲性视频| 欧美美美女性色视频| 九九视频在线免费视频| 亚洲欧美999| 这里只有九九精品| 日本色五月婷婷| 精品成人a v无码内射| 五月的婷婷六月丁香| 26UUU成人网| 亚洲日韩人妻操逼| 五月丁香狠狠| 深爱五月婷婷| 26uuu精品一区二区| 99在线观看视频| 黄色成人网站在线播放| 六月色色| 老师高潮流白浆喷水的A片| 任你躁XXXXX麻豆精品| 男同91| 国产做爰视频免费播放| 五月天婷婷色色首页| 欧美日韩五月婷婷| 99er精品| 五月丁香基地| 337p大胆噜噜噜噜噜91Av| 五月天社区| 婷婷狠狠干| 99久久这里只有精品| 日本色色色| 亚洲超碰在线| 91久草五月天婷婷| 亚洲色五月| 日在线V视频在线播放| 精品综合久久久久久五月天| 色 色 色综合com| 久久9热| 色综合丁香| 亚洲综合激情五月久久| 五月婷久草| 久久婷婷国产| 六月色国内综合| 天天爽日日爽夜夜爽| 婷婷狠狠干| 色六月婷婷| 婷婷五月天激情网| 丁香五月天婷婷91| 婷婷精品在线| 久久xxxx| 99啪视频在线观看| 天天精品视频在线观看视频| 九九久久色| www.色五月天.com| 欧亚中文A V| 国产这里只有精品| 免费日本aⅴ中文字幕 | 野外99热| 激情婷| 婷婷五月天伊人网| 在线中文字幕免费视频| 色五月网址| 操操自拍| 色五月婷婷五月天激情综合| 黄色一极大片| 九九热中文| 拳交大逼| 亚洲岛国电影| 久久99综合网| 日本色婷婷| 亚洲亚洲人成综合网络| 久操福利| 婷婷五月花西瓜| 激情五月综合婷婷| 懂色av蜜臀av粉嫩av永陈冠希| 久久无码激情视频| 激情综合色播| 97人妻人人| 99热在线免费观看精品| 91九色|疯狂|高潮|对白|| 99无码视频| 踪合专区啪啪| 婷婷色综合av| 午夜日韩久久久网站| 婷婷五月天综合蜜桃| 丁香五月婷婷在线| 六月婷色| 色99在线观看| 亚洲综合色婷婷| 色色婷婷综合网| 婷婷五月天伊人| 五月婷婷色色爱| 五月婷婷成人网首页| 久久99热这里只有精品| 99热xx| 综合久久影院| 激情无码网| 亚洲狠狠婷婷| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 五月花婷婷| 少妇大叫太大太粗太爽了A片| 人五月天婷婷喷水| 好好干av| 久久婷青青草原| 99亚洲大片精品永久在线观看| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 这里只有精品1| 五月天丁香久久| 九九99视频精品| 婷婷五月天在线视频网站| 风流少妇A片一区二区蜜桃 | 五月天国产| 大香蕉75线| 天天干天天干天天干天天干天天干| 色五月婷婷在线观看第一页舔| 五月天激情网址| 男女啪啪做爰高潮无遮挡| 婷婷丁香六月天| 97超碰,人人舔,人人操,人人摸 | 五月婷婷丁香大陆免费| 色爱亚洲| 亚洲激情五月婷婷日日| 九月婷婷人人操人人舔人人爱| 激情婷婷内射| 日本欧美成人片AAAA| 超碰在线免费| 久久狠狠干| www.粉嫩av.com| 五月丁香成人网| 五月婷婷六月丁香色| 色开心五月丁香| 99色色网| 狠狠干夜夜干| 亚洲色优| 欧美精品熟女一区二区| 九九色色网| 99色精品| 91在线就要啪| 色婷久久| 深爱五月中文字幕| 九九狠狠干| 噼里啪啦完整版中文在线观看| 色综合色综合网| 中文字幕网站在线观看| 啪啪五月综合| 超碰婷婷色| 色吧综合网| 丁香社区婷婷五月| 午夜 外网 精品 在线| 五月丁香最新| 91精品视频男人的天堂| 九九热这里只有精品9| 婷婷操久久| 色色性爱视频| 草综合14| 亚洲熟妇无码乱子AV电影| 五月天精品视频| se色99| 91久久婷婷| 色婷| 国产六月婷婷| 五月婷婷六月奇米网丁香| 色色色精品无码区| 五月激情六月| 六月丁香婷婷色综合| 久er7久热| 天天色天天搡| 色色com| 欧美性猛交99久久久99| 久热99热| 欧美人与性动交CCOO| 五月天播播| 午夜五月天| 秋霞学生妹一二级| 婷婷久久精品| 少妇人妻人伦A片| 色97啪啪| 人妻久久久久| 亚洲人人操BD| 婷婷激情在线| 超碰免费在线| 思思久久精品| 国产又色又爽又黄又免费| 亚洲亚洲人成综合网络 | 婷婷激情五月天小说校园| 九九热视| 久久久久久久久久久久久9| 青青999| 91热手机在线| 五月婷丁香花| 五月激情久久综合网| 五月天婷婷爱| 婷婷基地成人五月天| 欧美天天干五月丁香| 99精品无码网站| 亚洲丁香五月天视频| 欧美婷婷日本| 综合九九中文字幕| 亚洲综合激情五月| 亚洲精品又粗又大又爽A片| 欧美A级成人婬片免费看理论| 亚洲午夜国产成人电影VA国产欧…| 九月激情网| 深爱激情五月婷婷| 99色天堂| 久久多色| 国产伦亲子伦亲子视频观看| 日韩在线五月天婷婷| 亚洲狠狠爱婷婷| 99综合久久| 五月婷婷在线综合| 综合婷| 手机AVAV天堂看网| 五月天色小说| www,久久久| 99亚洲天堂| 999九九九久久久99HD| www.五月婷| 岛国AV网| 男人操女人高潮91视频| 五月天婷婷丁香视频| 欧美69久成人做爰视频| 色五月无码| 丁香久久五月婷综合| 天堂成人A片永久免费网站| 婷婷的99视频网站| 久久思思热| 色五月视频无码播放| 欧美日韩精品人妻狠狠躁免费视频| 人人97碰| 9精品国产在热久久| 五月综合影院| 97婷婷在线| 亚洲操b| 夜夜人妻五月天| www.97视频| www.六月丁香看AV| 1024在线视频| 精品人妻一区| 亚洲丁香网| 丁香九月婷婷综合| 成人丁香五月天Av| 五月天久久久| 国产亚洲色婷婷久久99精品91| 9超碰在线| 天天在线XXX| 五月婷婷影院| 狠狠久综合| 99久久久国产精品免费蜜乳tv| 色婷婷激情| 激情五月婷婷综合| 性爱视频久久| 亚洲情欲久久| 久久这里只有国产| 五月丁香六月综合激情无码软件亮点| av在线资源| 五月婷丁香花| 99无码超碰| 亚洲不卡123| 婷婷五月天av| 久久婷婷成人综合色怡春院| 九九色播五月丁香| 色女伊人| 高清无码中文字幕aVDV| 色狠狠999综合| www.五月天性.com| 九九操综合网| 成人网页在线观看| 欧美激情-区二区三区| 婷婷五月天小说| 亚洲人人操BD| 91dy.av| www.99热在线| 成人va在线播放| 婷婷丁香一月| 人人色AV| 婷婷五月骚厕所| 久久思思精品| 九九久久视频| 久久丁香五月婷| 五月天激情网页| 丁香五月天视频在线播放| 丁香五月色网| 婷婷五月天美女| 性爱先锋AV| 五月丁香婷婷色| 成人精品视频99在线观看免费| 开心五月深爱五月| 五月天激情四射| 国外亚洲成AV人片在线观看| 六月婷婷日| 99九无网码| 亚洲啪啪啪啪| 色色网站免费在线视频| 五月婷人妻| 天天看夜夜看| 亚洲黄网在线| 在线免费视频caop| av在线中文| 色丁香综合影院| 人人妻久久妻| 97色碰| 影音先锋美国A| www91久久| 五月天日日操夜夜操 | 日本99视频| 综合 蜜月 婷婷| 色综合久久888| 91大屁股| 久久久27操| 五月天丁香婷婷久久九| 激情综合九月| 婷婷丁香97| 久久婷婷网址| 婷婷丁香五月av| 另类五月激情| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 蜜桃婷婷狠狠久久综合| 激情五月丁香六月婷婷| 人妻久久久| 97久久久久| 色五月婷婷五月天| 蜜臀av无码久久久久久久久| 操99| 99热人人| 97久久久久久久久久久| 九九色热视频| 五月婷色色| 色五月激情五月| 九九色情网五月天| 婷婷狠狠18禁久久| 五月色婷婷综合色| 久久综合久色欧美综合狠狠| 欧美丁香五月天| 九九精品碰| 综合色五月| 欧美激情五月综合| 色婷婷五月天无码视频| 丁香伊人激情| 婷婷五月综合啪| 91婷婷丁香五月| 久久婷五月婷| 92久久久| 99热在线精品观看| 六月色播| 淫荡家庭AV| 九九久99免费视频| 婷婷久月| 五月丁香香蕉| 狠狠狠狠免费| 欧洲综合视频| 91丨九色熟女丨首页| 五月综合色| 五月婷婷五月色| 五月开心婷婷| 97色色色色| 成人永久免费视频在线观看| 老师高潮流白浆喷水的A片| 最新av在线观看| 色婷婷五月亚洲| 狠狠艹狠狠艹| 91精品久久久久久| 国产精品色婷婷99久久精品| 国产精品男人AV不卡| 久久激情视频| 99综合| 金桔一区二区ab地址| 终合激情网| 丁香五月婷婷偷拍| 日日夜夜干| 超碰99在线观看| 婷婷五月天社区| 成人中文字幕在线| 婷婷成人五月天一区| 久久怡红院| 久草五月天电影网| 国产精产国品一二三在观看| www。狠狠干。com| 丁香婷婷婷五月| 婷婷五月天高清无码| 亚洲乱码精品久久久久..| 99色在线视频观看| 丁香九色不卡aaa| 99热这里有精品24| 狠狠爱丁香婷| www久久99| 五月婷婷开心综合| 激情五月色婷婷| 亚洲精品激情| 综合亚洲色色| 日韩不卡DvD| 九九热最新地址| 综合欧美五月婷婷| 97涩婷婷婷婷基地| 五月综合色| 五月丁香花伦理电影| 26uuu成人网| www.色婷婷| 久久在这里有精品| 亚洲av免费在线| 99re欧美精品| 色色a| 五月丁香综合网色欲| 岛国在线观看91| 日本色99| 亚洲色网址| 亚洲无码成人性爰网| 超碰无码318604| 99热个人在线| 99ER热精品视频| 久久九九爽| 九色啦蜜臀| 精品无码人妻一区| 丁香九月婷| 26uuu精品国产| 日韩啪| 五月婷婷和六月| 日本情色一区二区| 亚洲成人在线观看网址| 综合欧美五月婷婷| 成人龟情网丁香五月| 99热免| 一本综合丁香日日狠狠色| 丁香欧美| 99色热视频| 99久久66| 九玖视频这里只有精品| 色婷婷综合久久久久| 五月天婷婷综合久久| 婷婷在线播放av| 五月婷婷六月丁香激情综合网| 丁香五月色情av| 人妻AV在线观看| 天天操婷婷| 97五月天| 99欧美精品99日本精品| 欧美大片免费观看| 日日日日日| 五月丁香六月婷婷久久| 日日噜噜夜夜狠狠久久丁香六月| 五月天婷婷色色| 熟女少妇内射日韩亚洲| 国产99久| 国产精品VIDEOSSEX久久发布| 51精品国自产在线| 五月丁香综合色婷婷| 亚洲黄色av网站| 99热青青草| 婷婷五月天Av| 色色色热| 丁香婷婷五月| 欧美日韩国产成人在线| 亚洲人妻电影| 五月婷六月丁香| 黄色激情五月天| 久久天堂女人| 久久久五月天婷婷| 综合激情网五月激情| 香蕉综合在线| 日本熟妇精品99| 少妇高潮一区二区三区99欧美| 久久丁香| 婷婷五月天网址| 婷婷色操| 五月丁香六月婷婷综合免| 亚洲va在线∨a天堂va欧美va| 色久影院| 老师的粉嫩小又紧水又多A片视频| 五夜婷婷| 亚洲综合婷婷| 开心五月深爱婷婷| 色色色综合网| 第四色五月激情网| 超碰99在线| 国产精产国品一二三在观看| 天天爽天天弄| 日韩AAAAA| 亚洲精品V天堂中文字幕| 免费的日逼视频| 狼人狠狠操| 久久黄色片| 六月色色综合| 疯狂做受XXXX高潮A片动画| 任你日视频| 婷婷丁香色无五月| 五月婷婷精品视频| 色婷婷五月网| 激情 五月 婷婷 丁香| 天天影院色| 99综合网| 天天色综合图片| 99re思思久久| 免费的日逼视频| 五月天社区| PORNY九色9l自拍视频成人| 婷婷九月丁香| www.99日本| 99久久这里只有精品| 韩日AV片| 久热91| 九九精品亚洲| 国产成人网址| 激情综合网激情五月天| 超碰在线国产| 色婷婷丁香五月丁香| 五月丁香另类网| 五月丁香直播| 五月天啪啪视频| 五月婷婷综合社区| 国产精品涩涩涩视频网站| 狠狠干激情五月| 夜色热久| 国产午夜成人AV在线播放| 日本啪啪天堂| 久久久久久久91| 婷婷五月天奸女| 激情播丁香| 日韩AV免费电影在线播放| 丁香涩涩爱| 婷婷五月天成人动漫 | 狼人久草| 超碰成人av| 天天色,天天操,天天射| a九九热www| 亚洲精品字幕在线观看| 色五月激情五月开心五月| 五月婷婷久久开心网| 日本AAAAAAAAAAAAAA片| 亚洲精品国产setv| 五月婷婷很很色| 日本人妻A片成人免费看片| 婷婷五月天第三页| 开心婷婷五月激情网小说| 亚洲春色奇米影视| 激情五月丁香五月| 黄色五月婷婷| 久草视频一,二三四| 五日激情综合| 婷婷激情五月综合丁香社| 丁香五月性| 99久在线精品99re8| 超级碰91| 久久五月天丁香| 91 九色 入口| 超碰在线网站9| 五月天婷婷综合| 97干在线视频| 成人免费在线电影| 色婷婷在线播放| 亚洲九九夜夜| 久久天天| 天天日天天舔| 久久丁香婷| 五月婷av| 婷婷六久久| 99热欧美精品| 久久婷婷五月天激情四射| 丁香五月综合婷婷| 男女啪啪视频久 9| 日韩精品电影| 激情九月婷婷| 日本五月丁香| 九九这里是免费的视频5| 丁香六月激情| 中文字幕黄色片| 欧美色五月| 欧美日综合| AV在线免费观看不卡| 五月 成人 婷婷| 婷婷 伊人 久久| 99热免费精品| 色综合网址| 麻豆AV一区二区三区| 99玖玖视频| 成人色站,在线视频,看片-SS1AV| 日本九九热| 五月激情站| 久久机热探花| 激情五月丁香在线观看直播| 色色99| 农村熟妇高潮精品A片| 综合另类激情| 久久小视频免费| 天天色天天干天天插| 欧美VA在线观看| 啊v视频在线观看| 丁香五月成人丝袜| 免费观看的AV| 伊人婷婷福利网| www.婷婷网| 97碰人人操| 九九无码| 色婷婷久久综合久色| 五月天激情视频| 99成人| 毛片新网地| 久久婷婷综合五月天| 欧美人与性动交CCOO| 夜色热久| 五月天成人在线播放丁香| 色999五月色| 包操45分钟网站| 婷婷五月激情图片| 久久久久久久久久久jjjj| 婷婷射丁香| 亚洲无AV在线中文字幕| 欧美婷婷五月| 9久精品| 色99自拍| 五月天精品| 精品久久久人妻| 人人操婷婷| 日本色狠狠| 日本WWW九九九| 玖玖婷婷综合| 激情综合4月| 丁香五月婷婷五月| 五月天激情网址| 夜夜夜夜撸夜夜操| 在线播放中文字幕| 九月丁香八月婷婷久久综合久97| 亚洲操B| 九月激情网| 丁香六月综合激情| 五月丁香六月婷婷欧美综合| 免费无码毛片一区二区A片 | 五月婷婷丁香在线| 熟美女麻豆| 99精品国产在热久久婷婷| 玖玖热视频| 婷婷五月天久久久| 99国产这里只有精品| 五月婷婷亚洲| 国产熟妇乱子伦hd| 99re热在线视频| 99热 免费| 99热都是精品| 五月天最新网| 六月丁香五月激情婷婷| 国产高清视频91九九九久久久| 91精品久久久久、久五月天| 五月丁香六月婷婷综合在线| 5月激情天| 综合婷婷| 超碰人人操在线| 一本久道综合99| 激情av网| 国产91资源在线| 九九99偷拍视频| 亚洲蜜乳AV| 夜精品无码A片一区二区蜜桃| 99热这里只有精| 久久五月丁香六月婷| 91精品久久久久久77777| 欧美性生交XXXXX无码小说| 精品三区影院| 日本色久| 五月丁香色综合| 亚洲精品乱码久久久久99| 久久国产精品乱子伦_靑青草…| 亚洲精品字幕在线观看| 亚洲激情综合| 天天操婷婷| 99热精品无码| www.婷婷五月| 久久怕怕视频| 欧美在线97| 亚洲激情四射| 99碰网站| 日本一毛片| 婷婷综合| 激情99| 国外亚洲成AV人片在线观看| 久久草大香蕉| 欧美交换配乱吟粗大25P| 人妻精品一区二区三区| 亚洲操逼片| 99这里只有精品视频| 久久性爱视频这里只有精品 | 婷婷五月天毛片| 亚洲视频在线观看| 丁香伍月婷电影全集| 97操在线| 99伊人婷婷在线| 丁香五夜激情四射夜夜夜| 一区无码| 九洲一级A片| 美女亚洲五月丁香| 亚洲国产精品成人免费一区久久久在线观看AAAA | 六月色丁香中文字幕| 91要啪| 婷婷亚洲五| 五月婷婷视频28| 在线观看欧美| 色色亚洲视频| 性爱激情小说AV五月丁香花| 五月丁婷香| 五月丁香六月婷婷国产视频| 五月天狠狠| AV网在线观看| www一起操| 这里只有精品99www| 人人综合久| 无码碰碰| 99小精品| 91ncom.色| 丁香六月欧美| 五月天久久成人| 欧美视频五区| 99综合99| 另类激情五月| 成人国产欧美大片一区| 亚洲中文字幕av| 国产无套精品一区二区| XX色综合| 人人干人人干骚美女| 99在线精品视频| 九九成人精品免费视频| 婷婷成人五月天成人文学| 天堂伊人干| AV色五月婷婷| 五月天激情图片| 狠狠色婷婷7777久综合| 婷婷五月天成人综合网| 国产午夜精品AV一区二区麻豆| 亚欧州精品视频| 这里只有精品视频99| 日本黄色一级| 情情五月天色| 九九色色| 色波激情五月天| 色五月婷婷老师| ..真实国产乱子伦对白在线_欧| 激情五月天色| 狠狠色婷婷| 亚洲免费99| 色5月丁香婷婷| 九九人人精品| 久久五月天色婷婷| 91互操| 五月天婷婷社区| 九九九九热99超碰| 丁香五月,激情五月,深爱五月| 欧美人与性动交CCOO| 99精品视频在线免费观看| 婷婷大香蕉| 99久.| 色香欲综合| 日本三级网址| 激情綜合網址| AV在线免费播放| 久久久久亚洲AV成人无码电影| 9999热在线免费观看| 色呦呦美女| www.超碰在线| 久久思思热| 日日懆天天懆| 热久久婷婷| 操逼棍操逼| 亚洲国产网站| 婷婷五月天干干| 色播五月天婷婷老师| 99re免费精品视频| 思恩热国产视频右线观看| www超碰| 婷婷四月 成人 狠狠干| 另类少妇人与禽zOZZ0性伦| \\五月天婷婷激情| 国产精女同一区二区三区久| 五月天最新网| 久久草人妻| 97丨九色丨国产丨PORNY| 中文字幕色色色| 99草视频在线观看| 91碰碰| 亚洲丁香五月在线观看| 色婷婷激情四射视频| 91操碰| RenRenSe在线视频网站| 密臀av无码人妻精品| 欧美久久婷婷| 91婷婷丁香五月天免费视频网站| 成人国产欧美大片一区| 欧美美美女性色视频| 日本色色图| 五月天综合在线网| 99九九在线视频| 另类视频一区| 色欲久久久久| 五月丁香六月综合情在线观看| 五月丁香999| 99热这里只有精品23| av在线免费播放观看| 台湾无码A片一区二区| 99热精品少| 婷婷综合偷拍| 99热伊人| 色噜噜97视频在线观看| 白天AV月月| 亚洲综合五月天婷婷| 国产婷婷综合| 最新午夜理论片| 伊人久久大香线蕉AV最新午夜| 99免费| 婷婷婷婷色| 99re99热| 91九色熟女| 久久大国产香蕉| 91精品丝袜久久久久久| 久久99性爱视频| 色婷丁香| 久热爱大香蕉在线蜜臀悦色 | 97色在线观看视频| 欧美另类五月激情| 久色网| 五月天丁香花婷婷| 国产精品久久久久久久久久免费| 99热这里只有精品99| 五月婷婷影视| 婷五月丁香俺| 久9无码视频| 激情综合文学| 91超碰在线观看| 99热这里只有精品16| 六月香五月婷| 五月丁香婷婷爱激情综合网| 亚洲激情| 亚洲无码影片| .精品久久久麻豆国产精品| 婷婷五月天激情综合| 免费观看欧美成人AA片爱我多深 | 九九伦子片| 99ER热精品视频| 丁香五月天堂网| 丁香婷婷五月色成人网站| 五月丁香在线视频观看| 人人性久久| 9999热精品| 五月停停大香蕉| 欧美丰满熟妇BBB久久久| 啪啪综合网| 天天操天天操天天操天天操天天操| 久久色亭亭五月天| 五月婷婷六月丁香综合| 中文人妻主播久久| 天天插天天狠| 天搞天天天天天| 婷婷亚洲综合| 国产片色| 五月激情婷婷六月丁香| 婷婷丁香六月五月天| AV在线大香蕉| 久久大香蕉丁香| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 国产精品涩涩涩视频网站| 这里只有精品久久| 婷婷久热| 久久婷婷五月综合| 99国产精品白浆在线观看免费| 99热在线观看免费精品| 99re思思久久| 亚洲色久| 天天射网站| 夜色热久| 丰满少妇乱A片无码| 嫩模草| 月丁香久久久| 亚洲AV另类| 日本在线99| 婷婷色色五月| 九九热最新视频| 五月丁香六月婷| 大香蕉啪啪啪| 婷婷色导航| 伊人色综合网| 久久性都花花世界成人免费视频| 久久人妻情侣| 久久99网| 婷久看人爽| 久久久com| ri电影在线| 色色色色综合| 停停色综合伊人| 激情婷婷五月天| 综合激情网五月激情| 丁香五月天网站| 伊人久久激情图区五月| 久婷婷婷| 色色婷婷五月| 久久综合丁香激情五月| 婷婷综合视频| 97婷婷色| 婷婷五月天天天日日夜夜| 久久久久er热| 婷婷色五月激情| 亚洲色五月天| 2025最新亚洲激情在线| www.9操| 婷婷丁香五月天亚洲| 五月婷婷电影院| 激情开心五月天婷婷基地丁香社区| 亚洲精品另类| 色婷| 色婷婷综合综合网| 亚洲欧洲另类| 99在线精品视频免费| 性一交一乱一交A片久| 婷婷五月天亚洲综合网| 99福利视频导航| 丁香五月六月婷婷综合| 色综合九九色综合88| 色激情五月天| 久久成人精品视频| 99免费青青蜜臀| 91在线日| 婷婷她六月天| 色五月婷婷网| 色五月激情综合| 色色草97| 五月婷婷久久大香蕉| AV天堂淫乩| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | av在线观看网站| 99九无网码| 久久一热免费视频| 91伦| 六月色色| 激情五月婷婷综合网| 亚洲欧洲一二| 97人人操人人干| 激情综合网 激情五月天| 日本99色| 国产精品国产成人国产三级| 一区二区三区四区无码| 九九热婷婷| 国外亚洲成AV人片在线观看| 无套内射极品大美女| 丁香五月婷婷久久综合激情网 | 亚洲精级| 日本操B视频| 久久久精品99亚洲综合| 狠狠色综合图片| 亚洲综合99| 婷婷香五月| 超碰91在线| 色婷婷小视频| 图片区 小说区 区 亚洲五月| 五月天亭亭俺也| 天天拍夜夜撸| 国产精品国产成人国产三级| 婷婷久久免费| 九九热99精品在线| 超碰免费大香蕉| 九九色黄色| 伊人激情影院| 五月天四色房丁香亭亭| 色五月首页| 激情 婷婷| 色色欧美色色色| 久久精品婷婷| 五月婷婷六月少妇激情| 六月色日韩| 超碰人人99| 国产亚洲成AV人片在线观黄桃| 热成人网| 综合综合色色| 五月婷婷偷拍| 婷婷狠狠爱| 青柠影视免费高清电视剧| 亚洲 视频 导航 一区| 99操逼| 亚洲五月天天| 996热| 色婷在线视频| 日噜噜色| 夜夜操加勒比| 六月激情网| 五月天婷婷在线观看| nvrentiantang av| 婷婷五月天男人影院色色网| 欧美成性色| 色婷精品91| www.爱婷婷.com| 亚洲电影在线观看| 欧洲色色| 另类激情综合| 日韩综合大黄| 天干干夜夜操| 婷婷的五月天另类视频| 婷婷中文字幕| 九九99九九99九九99视频网| 二区成人视频| 91热视频| 五月婷婷六月激情| 青青草成人网| 婷婷操婷婷干婷婷射| 婷婷五月六月丁香综合| 午夜精品777| 婷婷五月天.com| 亚洲丁香五月综合| 欧亚洲在线高清视频| 丁香五月天啪啪| 婷婷91| 97人人搞| 成年视频免费观看| 1024在线观看免费视频| 在线综合亚洲欧美65| 九九热九九| 五月亭亭直播| 激情文学天天| 综合激情五月综合激情五月激情1 天天爱天天做天天舔 | 五月丁香在线综合| 九九草热在线观看| 激情五月天综合图片小说网站| 激情宗合哪里能看| 色色是色N一| 国产99精品免费视频| 五月婷婷五月天激情视频| 丁香婷婷六月激情文学| 欧美五月丁香在线| 日韩无码一区二区三区四区| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 亚洲婷婷六月天| 天天色,天天操,天天射| 另类图片 五月激情| 丁香伊人激情| 日本va视频| 丁香五月综合福利视频导航| 久草xx性爱视频| 五月丁香六月婷婷在线观看| 欧美综合五月丁香五月天| 婷婷六月天亚州| 欧美日韩AAAA| 婷婷五月天六月丁香| 在线成人网站| 欧美性丁香色色五月天干干| 丁香五月社区| 激情五月丁香五月色| 丰满人妻妇伦又伦精品国产| 精品久久久91久久影视网| www.lchjjc.com| 中文字幕av网站| 激情五月天的婷婷| 色情性爱视频网址| 在线综合婷婷| 色99热| 人妻熟妇国产精品| 色五月综合网| 丁香伍月婷电影全集| 九月丁香八月婷婷久久综合久97| 狠狠色丁香久久| 婷婷开心深爱五月天| 欧洲日韩一区二区三区| 婷婷精品综合| 五月天综合激情网| 极品人妻VIDEOSSS人妻| 九久九精品| 午夜丁香六月婷| 日本激情91| 久久婷婷综合基地| 激情五月丁香综合蜜桃| 激情婷婷五月天日本系列| 狠狠干婷婷| 青青草五月天| 年轻的妺妺伦理HD中文| 97sese婷婷| xxxx五月天色色| 超碰资源在线| 色99视| 色色 亚洲| 99性视频| 日本色色色色色色色色一色二色| 91干婷婷| 色五月婷婷操逼| 丁香五月日本| 色婷婷的五月天| www.五月天| 5五月综合网亚洲| www.久久| 天天爽夜夜爽天天爽夜夜爽| 婷婷丁香色情| 婷婷五月花| 玖色色综合| 婷婷色五月开心五月| 99综合| 香蕉视频性爱BB做爱| 亚洲综合无码| 99re热| 大香蕉欧美在线| 中文字幕日产A片在线看| 91麻豆国产三级精品福利在线观看 | 九九久久久综合| 青草网在线观看| 丁香五月成人网| 免费无码毛片一区二区A片| 碰超在线九色| oVV4WIB3vFi8D| 久久五月激情| 专区无日本视频高清8| 日本超碰在线| 日日噜狠狠色| 亚洲日本韩国| 日日操夜夜操不卡| 久久婷婷五月综合97色一本| 日日夜夜小色哥| 久久3p| 久久久久久久,99精品视频| aaa9区免费在线观看| 色。 婷婷婷| 久久人妻www| 色偷偷AV亚洲男人的天堂| 成人精品在线| 欧美xx激情视频在线观看| 97色婷婷| 青青草Avb在线| 噜噜色五月| 日本超碰在线| 丁香综合久久| 米奇影视资源777狠狠色婷婷五月天激情网| 综合激情视频| 99玖玖在线视频| 婷婷情色激情| 欧美大片| 狠狠色噜噜狠狠狠狠综合| 天天日日综合| 国产精品18久久久| 丁香五月天堂网AV| 五月天艹天天| 五月婷视频| 婷婷99| 日本一级特黄大片AAAAA级| 国产综合久久久777777| 五月天激情.com| 色情综合网| 97精品在线| 色色a| 婷婷色网址| 小视频一区| 国产欧美精品AAAAAA片| 天天天操天天天爰| 色99在线视频| 26uuu视频欧美| 99国产97在线,| 日在线V视频在线播放| 一点色成人网| 九九热在视频| 色啪网| 久久五月视频| 99色婷婷视频| 色五月91| 色五月综合在线| 久久国产AV| www、色色色| 97成人在线视频| 五月婷婷丁香狠狠撸久久| 日韩成人不卡| 激情婷婷五月基地| 婷婷色资源| 狠狠狠五月婷婷六月丁香| av操逼网| 天天插天天干天天舔| 日B日潘金莲BB| 丁香婷婷色五月天| 182.t午在线观看| 亚洲无码九九| 欧美性生交XXXXX无码小说| 丁香六月婷婷综合网| 国产亚洲成AV人片在线观黄桃| Va另类视频| 欧美色激情四射| 色欲色香综合网| 婷婷五月激情四射手| www.sezonghe| 婷婷五月丁香综合桃花色网| 99热色在线精品| 婷婷五月欧美| 久久九九国产精品怡红院| 北京熟妇搡BBBB搡BBBB| 精品99网站| 国产97在线日韩亚洲女人被黑人巨大| 丁香五月综合激情久久潮喷| 99在线精品视频| www.99热. com这里只有精品| www.91五月| 久久偷拍综合五月天| 91丨九色丨白浆| 六月丁香啪啪啪| 五月丁香婷婷无码A∨| 亚洲深喉aV| 五月婷六月综合在线观看| 青草青草视频2免费观看| 久久婷婷五月草视频| 亚洲欧美综合7777色亭亭| 人人爱人人摸人人澡| 激情婷婷在线中文字幕| 亚洲综合色色| 婷婷四色成人综合色视| 激情综合在线播放| 99综合网| 激情五月天色爱| 婷色综合| 五月婷婷激情性爱| 五月综合丁香婷婷| 人妻少妇色综合| 激情婷婷网| 久久狠狠干| 日韩成人精品中文字幕| 婷婷丁香人妻天天久久| 九热视频在线精品15| 大地资源色婷婷视频在线| 丁香五月天网友自拍啪啪啪视频| 五月丁香色综合| 99ri在线视频| 色五月婷婷大| 色婷婷中文| 久久98热re| 91精品国产综合久久密臀|