久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并发编程面试题(2021最新版)

發布時間:2024/8/26 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并发编程面试题(2021最新版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

基礎知識

并發編程的優缺點

為什么要使用并發編程(并發編程的優點)

并發編程有什么缺點

并發編程三要素是什么?在 Java 程序中怎么保證多線程的運行安全?并發編程三要素(線程的安全性問題體現在):

出現線程安全問題的原因:

線程切換帶來的原子性問題

緩存導致的可見性問題

編譯優化帶來的有序性問題

什么是多線程,多線程的優劣?

多線程的好處:

多線程的劣勢:

什么是線程和進程?

進程

線程

進程與線程的區別

什么是上下文切換?

守護線程和用戶線程有什么區別呢?

守護線程和用戶線程

形成死鎖的四個必要條件是什么

如何避免線程死鎖

破壞不剝奪條件

破壞循環等待條件

創建線程的四種方式創建線程有哪幾種方式?創建線程有四種方式:

說一下 runnable 和 callable 有什么區別?

相同點

主要區別

什么是 Callable 和 Future?

什么是 FutureTask

Java 中用到的線程調度算法是什么?

什么是線程調度器(Thread Scheduler)和時間分片(Time Slicing )?

sleep() 和 wait() 有什么區別?

為什么線程通信的方法 wait(), notify()和 notifyAll()被定義在 Object 類里?

為什么 wait(), notify()和 notifyAll()必須在同步方法或者同步塊中被調用?

Thread 類中的 yield 方法有什么作用?

為什么 Thread 類的 sleep()和 yield ()方法是靜態的?

線程的 sleep()方法和 yield()方法有什么區別?

如何停止一個正在運行的線程?

Java 中 interrupted 和 isInterrupted 方法的區別?

什么是阻塞式方法?

Java 中你怎樣喚醒一個阻塞的線程?

Java中線程通信協作的最常見的兩種方式:

什么是線程同步和線程互斥,有哪幾種實現方式?

實現線程同步的方法

在 Java 程序中怎么保證多線程的運行安全?

你對線程優先級的理解是什么?

一個線程運行時發生異常會怎樣?

Java 線程數過多會造成什么異常?

Java中垃圾回收有什么目的?什么時候進行垃圾回收?

finalize()方法什么時候被調用?析構函數(finalization)的目的是什么?

為什么代碼會重排序?

并發關鍵字synchronized

synchronized 的作用?

為什么會有兩個monitorexit呢?

synchronized可重入的原理

多線程中 synchronized 鎖升級的原理是什么?

synchronized 和 Lock 有什么區別?

synchronized 和 ReentrantLock 區別是什么?

Java 中能創建 volatile 數組嗎?

volatile 變量和 atomic 變量有什么不同?

volatile 能使得一個非原子操作變成原子操作嗎?

volatile 修飾符的有過什么實踐?

synchronized 和 volatile 的區別是什么?

什么是不可變對象,它對寫并發應用有什么幫助?

Lock體系Lock簡介與初識AQS

Java Concurrency API 中的 Lock 接口(Lock interface)是什么?對比同步它有什么優勢?

樂觀鎖和悲觀鎖的理解及如何實現,有哪些實現方式?

CAS 的會產生什么問題?

產生死鎖的條件是什么?怎么防止死鎖?產生死鎖的必要條件:

Java 中導致饑餓的原因:

AQS(AbstractQueuedSynchronizer)詳解與源碼分析AQS 介紹AQS的全稱為(AbstractQueuedSynchronizer),這個類在java.util.concurrent.locks包下面。?

AQS 原理分析

AQS 原理概覽

AQS 對資源的共享方式

AQS定義兩種資源共享方式

AQS底層使用了模板方法模式

ReentrantLock(重入鎖)實現原理與公平鎖非公平鎖區別什么是可重入鎖(ReentrantLock)?

重入性的實現原理

讀寫鎖ReentrantReadWriteLock源碼分析ReadWriteLock 是什么

而讀寫鎖有以下三個重要的特性:

Java 中 ConcurrentHashMap 的并發度是什么?

什么是并發容器的實現?

Java 中的同步集合與并發集合有什么區別?

SynchronizedMap 和 ConcurrentHashMap 有什么區別?

什么是線程局部變量?

ThreadLocal內存泄漏分析與解決方案ThreadLocal造成內存泄漏的原因?

ThreadLocal內存泄漏解決方案?

Executors類創建四種常見線程池什么是線程池?有哪幾種創建方式?

線程池有什么優點?

線程池都有哪些狀態?


基礎知識


并發編程的優缺點


為什么要使用并發編程(并發編程的優點)


充分利用多核CPU的計算能力:通過并發編程的形式可以將多核CPU的計算能力發揮到極致,性能得到提升

方便進行業務拆分,提升系統并發能力和性能:在特殊的業務場景下,先天的就適合于并發編程。現在的系統動不動就要求百萬級甚至千萬級的并發量,而多線程并發編程正是開發高并發系統的基礎,利用好多線程機制可以大大提高系統整體的并發能力以及性能。面對復雜業務模型,并行程序會比串行程序更適應業務需求,而并發編程更能吻合這種業務拆分 。

并發編程有什么缺點


并發編程的目的就是為了能提高程序的執行效率,提高程序運行速度,但是并發編程并不總是能提高程序運行速度的,而且并發編程可能會遇到很多問題,比如**:內存泄漏、上下文切換、線程安全、死鎖**等問題。

并發編程三要素是什么?在 Java 程序中怎么保證多線程的運行安全?
并發編程三要素(線程的安全性問題體現在):

原子性:原子,即一個不可再被分割的顆粒。原子性指的是一個或多個操作要么全部執行成功要么全部執行失敗。

可見性:一個線程對共享變量的修改,另一個線程能夠立刻看到。(synchronized,volatile)

有序性:程序執行的順序按照代碼的先后順序執行。(處理器可能會對指令進行重排序)

出現線程安全問題的原因:

線程切換帶來的原子性問題

緩存導致的可見性問題

編譯優化帶來的有序性問題

解決辦法:

JDK Atomic開頭的原子類、synchronized、LOCK,可以解決原子性問題
synchronized、volatile、LOCK,可以解決可見性問題
Happens-Before 規則可以解決有序性問題
并行和并發有什么區別?
并發:多個任務在同一個 CPU 核上,按細分的時間片輪流(交替)執行,從邏輯上來看那些任務是同時執行。
并行:單位時間內,多個處理器或多核處理器同時處理多個任務,是真正意義上的“同時進行”。
串行:有n個任務,由一個線程按順序執行。由于任務、方法都在一個線程執行所以不存在線程不安全情況,也就不存在臨界區的問題。
做一個形象的比喻:

并發 = 兩個隊列和一臺咖啡機。

并行 = 兩個隊列和兩臺咖啡機。

串行 = 一個隊列和一臺咖啡機。

什么是多線程,多線程的優劣?

多線程:多線程是指程序中包含多個執行流,即在一個程序中可以同時運行多個不同的線程來執行不同的任務。

多線程的好處:

可以提高 CPU 的利用率。在多線程程序中,一個線程必須等待的時候,CPU 可以運行其它的線程而不是等待,這樣就大大提高了程序的效率。也就是說允許單個程序創建多個并行執行的線程來完成各自的任務。

多線程的劣勢:

線程也是程序,所以線程需要占用內存,線程越多占用內存也越多;

多線程需要協調和管理,所以需要 CPU 時間跟蹤線程;

線程之間對共享資源的訪問會相互影響,必須解決競用共享資源的問題。

線程和進程區別


什么是線程和進程?


進程

一個在內存中運行的應用程序。每個進程都有自己獨立的一塊內存空間,一個進程可以有多個線程,比如在Windows系統中,一個運行的xx.exe就是一個進程。

線程

進程中的一個執行任務(控制單元),負責當前進程中程序的執行。一個進程至少有一個線程,一個進程可以運行多個線程,多個線程可共享數據。

進程與線程的區別

線程具有許多傳統進程所具有的特征,故又稱為輕型進程(Light—Weight Process)或進程元;而把傳統的進程稱為重型進程(Heavy—Weight Process),它相當于只有一個線程的任務。在引入了線程的操作系統中,通常一個進程都有若干個線程,至少包含一個線程。

根本區別:進程是操作系統資源分配的基本單位,而線程是處理器任務調度和執行的基本單位

資源開銷:每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(PC),線程之間切換的開銷小。

包含關系:如果一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,所以線程也被稱為輕權進程或者輕量級進程。

內存分配:同一進程的線程共享本進程的地址空間和資源,而進程之間的地址空間和資源是相互獨立的

影響關系:一個進程崩潰后,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。

執行過程:每個獨立的進程有程序運行的入口、順序執行序列和程序出口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制,兩者均可并發執行

什么是上下文切換?

多線程編程中一般線程的個數都大于 CPU 核心的個數,而一個 CPU 核心在任意時刻只能被一個線程使用,為了讓這些線程都能得到有效執行,CPU 采取的策略是為每個線程分配時間片并輪轉的形式。當一個線程的時間片用完的時候就會重新處于就緒狀態讓給其他線程使用,這個過程就屬于一次上下文切換。

概括來說就是:當前任務在執行完 CPU 時間片切換到另一個任務之前會先保存自己的狀態,以便下次再切換回這個任務時,可以再加載這個任務的狀態。任務從保存到再加載的過程就是一次上下文切換。

上下文切換通常是計算密集型的。也就是說,它需要相當可觀的處理器時間,在每秒幾十上百次的切換中,每次切換都需要納秒量級的時間。所以,上下文切換對系統來說意味著消耗大量的 CPU 時間,事實上,可能是操作系統中時間消耗最大的操作。

Linux 相比與其他操作系統(包括其他類 Unix 系統)有很多的優點,其中有一項就是,其上下文切換和模式切換的時間消耗非常少。

守護線程和用戶線程有什么區別呢?

守護線程和用戶線程

用戶 (User) 線程:運行在前臺,執行具體的任務,如程序的主線程、連接網絡的子線程等都是用戶線程
守護 (Daemon) 線程:運行在后臺,為其他前臺線程服務。也可以說守護線程是 JVM 中非守護線程的 “傭人”。一旦所有用戶線程都結束運行,守護線程會隨 JVM 一起結束工作
main 函數所在的線程就是一個用戶線程啊,main 函數啟動的同時在 JVM 內部同時還啟動了好多守護線程,比如垃圾回收線程。

比較明顯的區別之一是用戶線程結束,JVM 退出,不管這個時候有沒有守護線程運行。而守護線程不會影響 JVM 的退出。

注意事項:

setDaemon(true)必須在start()方法前執行,否則會拋出 IllegalThreadStateException 異常
在守護線程中產生的新線程也是守護線程
不是所有的任務都可以分配給守護線程來執行,比如讀寫操作或者計算邏輯
守護 (Daemon) 線程中不能依靠 finally 塊的內容來確保執行關閉或清理資源的邏輯。因為我們上面也說過了一旦所有用戶線程都結束運行,守護線程會隨 JVM 一起結束工作,所以守護 (Daemon) 線程中的 finally 語句塊可能無法被執行。
如何在 Windows 和 Linux 上查找哪個線程cpu利用率最高?
windows上面用任務管理器看,linux下可以用 top 這個工具看。

找出cpu耗用厲害的進程pid, 終端執行top命令,然后按下shift+p 查找出cpu利用最厲害的pid號
根據上面第一步拿到的pid號,top -H -p pid 。然后按下shift+p,查找出cpu利用率最厲害的線程號,比如top -H -p 1328
將獲取到的線程號轉換成16進制,去百度轉換一下就行
使用jstack工具將進程信息打印輸出,jstack pid號 > /tmp/t.dat,比如jstack 31365 > /tmp/t.dat
編輯/tmp/t.dat文件,查找線程號對應的信息
什么是線程死鎖
百度百科:死鎖是指兩個或兩個以上的進程(線程)在執行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處于死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程(線程)稱為死鎖進程(線程)。

多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止。

如下圖所示,線程 A 持有資源 2,線程 B 持有資源 1,他們同時都想申請對方的資源,所以這兩個線程就會互相等待而進入死鎖狀態。

下面通過一個例子來說明線程死鎖,代碼模擬了上圖的死鎖的情況:

public class DeadLockDemo {private static Object resource1 = new Object();//資源 1private static Object resource2 = new Object();//資源 2public static void main(String[] args) {new Thread(() -> {synchronized (resource1) {System.out.println(Thread.currentThread() + "get resource1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread() + "waiting get resource2");synchronized (resource2) {System.out.println(Thread.currentThread() + "get resource2");}}}, "線程 1").start();new Thread(() -> {synchronized (resource2) {System.out.println(Thread.currentThread() + "get resource2");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread() + "waiting get resource1");synchronized (resource1) {System.out.println(Thread.currentThread() + "get resource1");}}}, "線程 2").start();} }

?輸出結果:

Thread[線程 1,5,main]get resource1 Thread[線程 2,5,main]get resource2 Thread[線程 1,5,main]waiting get resource2 Thread[線程 2,5,main]waiting get resource1

線程 A 通過 synchronized (resource1) 獲得 resource1 的監視器鎖,然后通過Thread.sleep(1000);讓線程 A 休眠 1s 為的是讓線程 B 得到CPU執行權,然后獲取到 resource2 的監視器鎖。線程 A 和線程 B 休眠結束了都開始企圖請求獲取對方的資源,然后這兩個線程就會陷入互相等待的狀態,這也就產生了死鎖。上面的例子符合產生死鎖的四個必要條件。

形成死鎖的四個必要條件是什么

互斥條件:線程(進程)對于所分配到的資源具有排它性,即一個資源只能被一個線程(進程)占用,直到被該線程(進程)釋放
請求與保持條件:一個線程(進程)因請求被占用資源而發生阻塞時,對已獲得的資源保持不放。
不剝奪條件:線程(進程)已獲得的資源在末使用完之前不能被其他線程強行剝奪,只有自己使用完畢后才釋放資源。
循環等待條件:當發生死鎖時,所等待的線程(進程)必定會形成一個環路(類似于死循環),造成永久阻塞


如何避免線程死鎖


我們只要破壞產生死鎖的四個條件中的其中一個就可以了。

破壞互斥條件

這個條件我們沒有辦法破壞,因為我們用鎖本來就是想讓他們互斥的(臨界資源需要互斥訪問)。

破壞請求與保持條件

一次性申請所有的資源。

破壞不剝奪條件

占用部分資源的線程進一步申請其他資源時,如果申請不到,可以主動釋放它占有的資源。

破壞循環等待條件

靠按序申請資源來預防。按某一順序申請資源,釋放資源則反序釋放。破壞循環等待條件。

我們對線程 2 的代碼修改成下面這樣就不會產生死鎖了。
?

new Thread(() -> {synchronized (resource1) {System.out.println(Thread.currentThread() + "get resource1");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread() + "waiting get resource2");synchronized (resource2) {System.out.println(Thread.currentThread() + "get resource2");}} }, "線程 2").start();

輸出結果

Thread[線程 1,5,main]get resource1 Thread[線程 1,5,main]waiting get resource2 Thread[線程 1,5,main]get resource2 Thread[線程 2,5,main]get resource1 Thread[線程 2,5,main]waiting get resource2 Thread[線程 2,5,main]get resource2

我們分析一下上面的代碼為什么避免了死鎖的發生?

線程 1 首先獲得到 resource1 的監視器鎖,這時候線程 2 就獲取不到了。然后線程 1 再去獲取 resource2 的監視器鎖,可以獲取到。然后線程 1 釋放了對 resource1、resource2 的監視器鎖的占用,線程 2 獲取到就可以執行了。這樣就破壞了破壞循環等待條件,因此避免了死鎖。

創建線程的四種方式
創建線程有哪幾種方式?
創建線程有四種方式:

繼承 Thread 類;
實現 Runnable 接口;
實現 Callable 接口;
使用 Executors 工具類創建線程池
繼承 Thread 類

步驟

  • 定義一個Thread類的子類,重寫run方法,將相關邏輯實現,run()方法就是線程要執行的業務邏輯方法
  • 創建自定義的線程子類對象
  • 調用子類實例的star()方法來啟動線程
  • public class MyThread extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " run()方法正在執行...");}}

    public class TheadTest {public static void main(String[] args) {MyThread myThread = new MyThread(); myThread.start();System.out.println(Thread.currentThread().getName() + " main()方法執行結束");}}

    運行結果

    main main()方法執行結束 Thread-0 run()方法正在執行...

    實現 Runnable 接口

    步驟

  • 定義Runnable接口實現類MyRunnable,并重寫run()方法
  • 創建MyRunnable實例myRunnable,以myRunnable作為target創建Thead對象,該Thread對象才是真正的線程對象
  • 調用線程對象的start()方法
  • public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " run()方法執行中...");}}

    public class RunnableTest {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();System.out.println(Thread.currentThread().getName() + " main()方法執行完成");}}

    執行結果

    main main()方法執行完成 Thread-0 run()方法執行中...

    實現 Callable 接口

    步驟

  • 創建實現Callable接口的類myCallable
  • 以myCallable為參數創建FutureTask對象
  • 將FutureTask作為參數創建Thread對象
  • 調用線程對象的start()方法
  • public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() {System.out.println(Thread.currentThread().getName() + " call()方法執行中...");return 1;}}

    public class CallableTest {public static void main(String[] args) {FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyCallable());Thread thread = new Thread(futureTask);thread.start();try {Thread.sleep(1000);System.out.println("返回結果 " + futureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " main()方法執行完成");}}

    執行結果

    Thread-0 call()方法執行中... 返回結果 1 main main()方法執行完成

    使用 Executors 工具類創建線程池

    Executors提供了一系列工廠方法用于創先線程池,返回的線程池都實現了ExecutorService接口。

    主要有newFixedThreadPool,newCachedThreadPool,newSingleThreadExecutor,newScheduledThreadPool,后續詳細介紹這四種線程池
    ?

    public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " run()方法執行中...");}} public class SingleThreadExecutorTest {public static void main(String[] args) {ExecutorService executorService = Executors.newSingleThreadExecutor();MyRunnable runnableTest = new MyRunnable();for (int i = 0; i < 5; i++) {executorService.execute(runnableTest);}System.out.println("線程任務開始執行");executorService.shutdown();}}

    執行結果

    線程任務開始執行 pool-1-thread-1 is running... pool-1-thread-1 is running... pool-1-thread-1 is running... pool-1-thread-1 is running... pool-1-thread-1 is running...

    說一下 runnable 和 callable 有什么區別?

    相同點

    都是接口

    都可以編寫多線程程序

    都采用Thread.start()啟動線程

    主要區別

    Runnable 接口 run 方法無返回值;Callable 接口 call 方法有返回值,是個泛型,和Future、FutureTask配合可以用來獲取異步執行的結果
    Runnable 接口 run 方法只能拋出運行時異常,且無法捕獲處理;Callable 接口 call 方法允許拋出異常,可以獲取異常信息
    注:Callalbe接口支持返回執行結果,需要調用FutureTask.get()得到,此方法會阻塞主進程的繼續往下執行,如果不調用不會阻塞。

    線程的 run()和 start()有什么區別?
    每個線程都是通過某個特定Thread對象所對應的方法run()來完成其操作的,run()方法稱為線程體。通過調用Thread類的start()方法來啟動一個線程。

    start() 方法用于啟動線程,run() 方法用于執行線程的運行時代碼。run() 可以重復調用,而 start() 只能調用一次。

    start()方法來啟動一個線程,真正實現了多線程運行。調用start()方法無需等待run方法體代碼執行完畢,可以直接繼續執行其他的代碼; 此時線程是處于就緒狀態,并沒有運行。 然后通過此Thread類調用方法run()來完成其運行狀態, run()方法運行結束, 此線程終止。然后CPU再調度其它線程。

    run()方法是在本線程里的,只是線程里的一個函數,而不是多線程的。 如果直接調用run(),其實就相當于是調用了一個普通函數而已,直接待用run()方法必須等待run()方法執行完畢才能執行下面的代碼,所以執行路徑還是只有一條,根本就沒有線程的特征,所以在多線程執行時要使用start()方法而不是run()方法。

    為什么我們調用 start() 方法時會執行 run() 方法,為什么我們不能直接調用 run() 方法?
    這是另一個非常經典的 java 多線程面試問題,而且在面試中會經常被問到。很簡單,但是很多人都會答不上來!

    new 一個 Thread,線程進入了新建狀態。調用 start() 方法,會啟動一個線程并使線程進入了就緒狀態,當分配到時間片后就可以開始運行了。 start() 會執行線程的相應準備工作,然后自動執行 run() 方法的內容,這是真正的多線程工作。

    而直接執行 run() 方法,會把 run 方法當成一個 main 線程下的普通方法去執行,并不會在某個線程中執行它,所以這并不是多線程工作。

    總結: 調用 start 方法方可啟動線程并使線程進入就緒狀態,而 run 方法只是 thread 的一個普通方法調用,還是在主線程里執行。

    什么是 Callable 和 Future?


    Callable 接口類似于 Runnable,從名字就可以看出來了,但是 Runnable 不會返回結果,并且無法拋出返回結果的異常,而 Callable 功能更強大一些,被線程執行后,可以返回值,這個返回值可以被 Future 拿到,也就是說,Future 可以拿到異步執行任務的返回值。

    Future 接口表示異步任務,是一個可能還沒有完成的異步任務的結果。所以說 Callable用于產生結果,Future 用于獲取結果。

    什么是 FutureTask


    FutureTask 表示一個異步運算的任務。FutureTask 里面可以傳入一個 Callable 的具體實現類,可以對這個異步運算的任務的結果進行等待獲取、判斷是否已經完成、取消任務等操作。只有當運算完成的時候結果才能取回,如果運算尚未完成 get 方法將會阻塞。一個 FutureTask 對象可以對調用了 Callable 和 Runnable 的對象進行包裝,由于 FutureTask 也是Runnable 接口的實現類,所以 FutureTask 也可以放入線程池中。

    線程的狀態和基本操作
    說說線程的生命周期及五種基本狀態?

    1.新建(new):新創建了一個線程對象。

    2.可運行(runnable):線程對象創建后,當調用線程對象的 start()方法,該線程處于就緒狀態,等待被線程調度選中,獲取cpu的使用權。

    3.運行(running):可運行狀態(runnable)的線程獲得了cpu時間片(timeslice),執行程序代碼。注:就緒狀態是進入到運行狀態的唯一入口,也就是說,線程要想進入運行狀態執行,首先必須處于就緒狀態中;

    4.阻塞(block):處于運行狀態中的線程由于某種原因,暫時放棄對 CPU的使用權,停止執行,此時進入阻塞狀態,直到其進入到就緒狀態,才 有機會再次被 CPU 調用以進入到運行狀態。

    阻塞的情況分三種:
    (一). 等待阻塞:運行狀態中的線程執行 wait()方法,JVM會把該線程放入等待隊列(waitting queue)中,使本線程進入到等待阻塞狀態;
    (二). 同步阻塞:線程在獲取 synchronized 同步鎖失敗(因為鎖被其它線程所占用),,則JVM會把該線程放入鎖池(lock pool)中,線程會進入同步阻塞狀態;
    (三). 其他阻塞: 通過調用線程的 sleep()或 join()或發出了 I/O 請求時,線程會進入到阻塞狀態。當 sleep()狀態超時、join()等待線程終止或者超時、或者 I/O 處理完畢時,線程重新轉入就緒狀態。

    5.死亡(dead):線程run()、main()方法執行結束,或者因異常退出了run()方法,則該線程結束生命周期。死亡的線程不可再次復生。

    Java 中用到的線程調度算法是什么?


    計算機通常只有一個 CPU,在任意時刻只能執行一條機器指令,每個線程只有獲得CPU 的使用權才能執行指令。所謂多線程的并發運行,其實是指從宏觀上看,各個線程輪流獲得 CPU 的使用權,分別執行各自的任務。在運行池中,會有多個處于就緒狀態的線程在等待 CPU,JAVA 虛擬機的一項任務就是負責線程的調度,線程調度是指按照特定機制為多個線程分配 CPU 的使用權。

    有兩種調度模型:分時調度模型和搶占式調度模型。

    分時調度模型是指讓所有的線程輪流獲得 cpu 的使用權,并且平均分配每個線程占用的 CPU 的時間片這個也比較好理解。

    Java虛擬機采用搶占式調度模型,是指優先讓可運行池中優先級高的線程占用CPU,如果可運行池中的線程優先級相同,那么就隨機選擇一個線程,使其占用CPU。處于運行狀態的線程會一直運行,直至它不得不放棄 CPU。

    線程的調度策略
    線程調度器選擇優先級最高的線程運行,但是,如果發生以下情況,就會終止線程的運行:

    (1)線程體中調用了 yield 方法讓出了對 cpu 的占用權利

    (2)線程體中調用了 sleep 方法使線程進入睡眠狀態

    (3)線程由于 IO 操作受到阻塞

    (4)另外一個更高優先級線程出現

    (5)在支持時間片的系統中,該線程的時間片用完

    什么是線程調度器(Thread Scheduler)和時間分片(Time Slicing )?


    線程調度器是一個操作系統服務,它負責為 Runnable 狀態的線程分配 CPU 時間。一旦我們創建一個線程并啟動它,它的執行便依賴于線程調度器的實現。

    時間分片是指將可用的 CPU 時間分配給可用的 Runnable 線程的過程。分配 CPU 時間可以基于線程優先級或者線程等待的時間。

    線程調度并不受到 Java 虛擬機控制,所以由應用程序來控制它是更好的選擇(也就是說不要讓你的程序依賴于線程的優先級)。

    請說出與線程同步以及線程調度相關的方法。
    (1) wait():使一個線程處于等待(阻塞)狀態,并且釋放所持有的對象的鎖;

    (2)sleep():使一個正在運行的線程處于睡眠狀態,是一個靜態方法,調用此方法要處理 InterruptedException 異常;

    (3)notify():喚醒一個處于等待狀態的線程,當然在調用此方法的時候,并不能確切的喚醒某一個等待狀態的線程,而是由 JVM 確定喚醒哪個線程,而且與優先級無關;

    (4)notityAll():喚醒所有處于等待狀態的線程,該方法并不是將對象的鎖給所有線程,而是讓它們競爭,只有獲得鎖的線程才能進入就緒狀態;

    sleep() 和 wait() 有什么區別?

    兩者都可以暫停線程的執行

    類的不同:sleep() 是 Thread線程類的靜態方法,wait() 是 Object類的方法。
    是否釋放鎖:sleep() 不釋放鎖;wait() 釋放鎖。
    用途不同:Wait 通常被用于線程間交互/通信,sleep 通常被用于暫停執行。
    用法不同:wait() 方法被調用后,線程不會自動蘇醒,需要別的線程調用同一個對象上的 notify() 或者 notifyAll() 方法。sleep() 方法執行完成后,線程會自動蘇醒。或者可以使用wait(long timeout)超時后線程會自動蘇醒。
    你是如何調用 wait() 方法的?使用 if 塊還是循環?為什么?
    處于等待狀態的線程可能會收到錯誤警報和偽喚醒,如果不在循環中檢查等待條件,程序就會在沒有滿足結束條件的情況下退出。

    wait() 方法應該在循環調用,因為當線程獲取到 CPU 開始執行的時候,其他條件可能還沒有滿足,所以在處理前,循環檢測條件是否滿足會更好。下面是一段標準的使用 wait 和 notify 方法的代碼:
    ?

    synchronized (monitor) {// 判斷條件謂詞是否得到滿足while(!locked) {// 等待喚醒monitor.wait();}// 處理其他的業務邏輯 }

    為什么線程通信的方法 wait(), notify()和 notifyAll()被定義在 Object 類里?

    Java中,任何對象都可以作為鎖,并且 wait(),notify()等方法用于等待對象的鎖或者喚醒線程,在 Java 的線程中并沒有可供任何對象使用的鎖,所以任意對象調用方法一定定義在Object類中。

    wait(), notify()和 notifyAll()這些方法在同步代碼塊中調用

    有的人會說,既然是線程放棄對象鎖,那也可以把wait()定義在Thread類里面啊,新定義的線程繼承于Thread類,也不需要重新定義wait()方法的實現。然而,這樣做有一個非常大的問題,一個線程完全可以持有很多鎖,你一個線程放棄鎖的時候,到底要放棄哪個鎖?當然了,這種設計并不是不能實現,只是管理起來更加復雜。

    綜上所述,wait()、notify()和notifyAll()方法要定義在Object類中。

    為什么 wait(), notify()和 notifyAll()必須在同步方法或者同步塊中被調用?

    當一個線程需要調用對象的 wait()方法的時候,這個線程必須擁有該對象的鎖,接著它就會釋放這個對象鎖并進入等待狀態直到其他線程調用這個對象上的 notify()方法。同樣的,當一個線程需要調用對象的 notify()方法時,它會釋放這個對象的鎖,以便其他在等待的線程就可以得到這個對象鎖。由于所有的這些方法都需要線程持有對象的鎖,這樣就只能通過同步來實現,所以他們只能在同步方法或者同步塊中被調用。

    Thread 類中的 yield 方法有什么作用?

    使當前線程從執行狀態(運行狀態)變為可執行態(就緒狀態)。

    當前線程到了就緒狀態,那么接下來哪個線程會從就緒狀態變成執行狀態呢?可能是當前線程,也可能是其他線程,看系統的分配了。

    為什么 Thread 類的 sleep()和 yield ()方法是靜態的?

    Thread 類的 sleep()和 yield()方法將在當前正在執行的線程上運行。所以在其他處于等待狀態的線程上調用這些方法是沒有意義的。這就是為什么這些方法是靜態的。它們可以在當前正在執行的線程中工作,并避免程序員錯誤的認為可以在其他非運行線程調用這些方法。

    線程的 sleep()方法和 yield()方法有什么區別?

    (1) sleep()方法給其他線程運行機會時不考慮線程的優先級,因此會給低優先級的線程以運行的機會;yield()方法只會給相同優先級或更高優先級的線程以運行的機會;

    (2) 線程執行 sleep()方法后轉入阻塞(blocked)狀態,而執行 yield()方法后轉入就緒(ready)狀態;

    (3)sleep()方法聲明拋出 InterruptedException,而 yield()方法沒有聲明任何異常;

    (4)sleep()方法比 yield()方法(跟操作系統 CPU 調度相關)具有更好的可移植性,通常不建議使用yield()方法來控制并發線程的執行。

    如何停止一個正在運行的線程?

    在java中有以下3種方法可以終止正在運行的線程:

    使用退出標志,使線程正常退出,也就是當run方法完成后線程終止。
    使用stop方法強行終止,但是不推薦這個方法,因為stop和suspend及resume一樣都是過期作廢的方法。
    使用interrupt方法中斷線程。


    Java 中 interrupted 和 isInterrupted 方法的區別?

    interrupt:用于中斷線程。調用該方法的線程的狀態為將被置為”中斷”狀態。

    注意:線程中斷僅僅是置線程的中斷狀態位,不會停止線程。需要用戶自己去監視線程的狀態為并做處理。支持線程中斷的方法(也就是線程中斷后會拋出interruptedException 的方法)就是在監視線程的中斷狀態,一旦線程的中斷狀態被置為“中斷狀態”,就會拋出中斷異常。

    interrupted:是靜態方法,查看當前中斷信號是true還是false并且清除中斷信號。如果一個線程被中斷了,第一次調用 interrupted 則返回 true,第二次和后面的就返回 false 了。

    isInterrupted:查看當前中斷信號是true還是false

    什么是阻塞式方法?

    阻塞式方法是指程序會一直等待該方法完成期間不做其他事情,ServerSocket 的accept()方法就是一直等待客戶端連接。這里的阻塞是指調用結果返回之前,當前線程會被掛起,直到得到結果之后才會返回。此外,還有異步和非阻塞式方法在任務完成前就返回。

    Java 中你怎樣喚醒一個阻塞的線程?

    首先 ,wait()、notify() 方法是針對對象的,調用任意對象的 wait()方法都將導致線程阻塞,阻塞的同時也將釋放該對象的鎖,相應地,調用任意對象的 notify()方法則將隨機解除該對象阻塞的線程,但它需要重新獲取該對象的鎖,直到獲取成功才能往下執行;

    其次,wait、notify 方法必須在 synchronized 塊或方法中被調用,并且要保證同步塊或方法的鎖對象與調用 wait、notify 方法的對象是同一個,如此一來在調用 wait 之前當前線程就已經成功獲取某對象的鎖,執行 wait 阻塞后當前線程就將之前獲取的對象鎖釋放。

    notify() 和 notifyAll() 有什么區別?
    如果線程調用了對象的 wait()方法,那么線程便會處于該對象的等待池中,等待池中的線程不會去競爭該對象的鎖。

    notifyAll() 會喚醒所有的線程,notify() 只會喚醒一個線程。

    notifyAll() 調用后,會將全部線程由等待池移到鎖池,然后參與鎖的競爭,競爭成功則繼續執行,如果不成功則留在鎖池等待鎖被釋放后再次參與競爭。而 notify()只會喚醒一個線程,具體喚醒哪一個線程由虛擬機控制。

    如何在兩個線程間共享數據?
    在兩個線程間共享變量即可實現共享。

    一般來說,共享變量要求變量本身是線程安全的,然后在線程內使用的時候,如果有對共享變量的復合操作,那么也得保證復合操作的線程安全性。

    Java 如何實現多線程之間的通訊和協作?
    可以通過中斷 和 共享變量的方式實現線程間的通訊和協作

    比如說最經典的生產者-消費者模型:當隊列滿時,生產者需要等待隊列有空間才能繼續往里面放入商品,而在等待的期間內,生產者必須釋放對臨界資源(即隊列)的占用權。因為生產者如果不釋放對臨界資源的占用權,那么消費者就無法消費隊列中的商品,就不會讓隊列有空間,那么生產者就會一直無限等待下去。因此,一般情況下,當隊列滿時,會讓生產者交出對臨界資源的占用權,并進入掛起狀態。然后等待消費者消費了商品,然后消費者通知生產者隊列有空間了。同樣地,當隊列空時,消費者也必須等待,等待生產者通知它隊列中有商品了。這種互相通信的過程就是線程間的協作。

    Java中線程通信協作的最常見的兩種方式:

    一.syncrhoized加鎖的線程的Object類的wait()/notify()/notifyAll()

    二.ReentrantLock類加鎖的線程的Condition類的await()/signal()/signalAll()

    線程間直接的數據交換:

    三.通過管道進行線程間通信:1)字節流;2)字符流

    同步方法和同步塊,哪個是更好的選擇?
    同步塊是更好的選擇,因為它不會鎖住整個對象(當然你也可以讓它鎖住整個對象)。同步方法會鎖住整個對象,哪怕這個類中有多個不相關聯的同步塊,這通常會導致他們停止執行并需要等待獲得這個對象上的鎖。

    同步塊更要符合開放調用的原則,只在需要鎖住的代碼塊鎖住相應的對象,這樣從側面來說也可以避免死鎖。

    請知道一條原則:同步的范圍越小越好。

    什么是線程同步和線程互斥,有哪幾種實現方式?

    當一個線程對共享的數據進行操作時,應使之成為一個”原子操作“,即在沒有完成相關操作之前,不允許其他線程打斷它,否則,就會破壞數據的完整性,必然會得到錯誤的處理結果,這就是線程的同步。

    在多線程應用中,考慮不同線程之間的數據同步和防止死鎖。當兩個或多個線程之間同時等待對方釋放資源的時候就會形成線程之間的死鎖。為了防止死鎖的發生,需要通過同步來實現線程安全。

    線程互斥是指對于共享的進程系統資源,在各單個線程訪問時的排它性。當有若干個線程都要使用某一共享資源時,任何時刻最多只允許一個線程去使用,其它要使用該資源的線程必須等待,直到占用資源者釋放該資源。線程互斥可以看成是一種特殊的線程同步。

    線程間的同步方法大體可分為兩類:用戶模式和內核模式。顧名思義,內核模式就是指利用系統內核對象的單一性來進行同步,使用時需要切換內核態與用戶態,而用戶模式就是不需要切換到內核態,只在用戶態完成操作。

    用戶模式下的方法有:原子操作(例如一個單一的全局變量),臨界區。內核模式下的方法有:事件,信號量,互斥量。

    實現線程同步的方法

    同步代碼方法:sychronized 關鍵字修飾的方法

    同步代碼塊:sychronized 關鍵字修飾的代碼塊

    使用特殊變量域volatile實現線程同步:volatile關鍵字為域變量的訪問提供了一種免鎖機制

    使用重入鎖實現線程同步:reentrantlock類是可沖入、互斥、實現了lock接口的鎖他與sychronized方法具有相同的基本行為和語義

    在監視器(Monitor)內部,是如何做線程同步的?程序應該做哪種級別的同步?
    在 java 虛擬機中,每個對象( Object 和 class )通過某種邏輯關聯監視器,每個監視器和一個對象引用相關聯,為了實現監視器的互斥功能,每個對象都關聯著一把鎖。

    一旦方法或者代碼塊被 synchronized 修飾,那么這個部分就放入了監視器的監視區域,確保一次只能有一個線程執行該部分的代碼,線程在獲取鎖之前不允許執行該部分的代碼

    另外 java 還提供了顯式監視器( Lock )和隱式監視器( synchronized )兩種鎖方案

    如果你提交任務時,線程池隊列已滿,這時會發生什么
    這里區分一下:

    (1)如果使用的是無界隊列 LinkedBlockingQueue,也就是無界隊列的話,沒關系,繼續添加任務到阻塞隊列中等待執行,因為 LinkedBlockingQueue 可以近乎認為是一個無窮大的隊列,可以無限存放任務

    (2)如果使用的是有界隊列比如 ArrayBlockingQueue,任務首先會被添加到ArrayBlockingQueue 中,ArrayBlockingQueue 滿了,會根據maximumPoolSize 的值增加線程數量,如果增加了線程數量還是處理不過來,ArrayBlockingQueue 繼續滿,那么則會使用拒絕策略RejectedExecutionHandler 處理滿了的任務,默認是 AbortPolicy

    什么叫線程安全?servlet 是線程安全嗎?
    線程安全是編程中的術語,指某個方法在多線程環境中被調用時,能夠正確地處理多個線程之間的共享變量,使程序功能正確完成。

    Servlet 不是線程安全的,servlet 是單實例多線程的,當多個線程同時訪問同一個方法,是不能保證共享變量的線程安全性的。

    Struts2 的 action 是多實例多線程的,是線程安全的,每個請求過來都會 new 一個新的 action 分配給這個請求,請求完成后銷毀。

    SpringMVC 的 Controller 是線程安全的嗎?不是的,和 Servlet 類似的處理流程。

    Struts2 好處是不用考慮線程安全問題;Servlet 和 SpringMVC 需要考慮線程安全問題,但是性能可以提升不用處理太多的 gc,可以使用 ThreadLocal 來處理多線程的問題。

    在 Java 程序中怎么保證多線程的運行安全?

    方法一:使用安全類,比如 java.util.concurrent 下的類,使用原子類AtomicInteger
    方法二:使用自動鎖 synchronized。
    方法三:使用手動鎖 Lock。
    手動鎖 Java 示例代碼如下:
    ?

    Lock lock = new ReentrantLock(); lock. lock(); try {System. out. println("獲得鎖"); } catch (Exception e) {// TODO: handle exception } finally {System. out. println("釋放鎖");lock. unlock(); }

    你對線程優先級的理解是什么?

    每一個線程都是有優先級的,一般來說,高優先級的線程在運行時會具有優先權,但這依賴于線程調度的實現,這個實現是和操作系統相關的(OS dependent)。我們可以定義線程的優先級,但是這并不能保證高優先級的線程會在低優先級的線程前執行。線程優先級是一個 int 變量(從 1-10),1 代表最低優先級,10 代表最高優先級。

    Java 的線程優先級調度會委托給操作系統去處理,所以與具體的操作系統優先級有關,如非特別需要,一般無需設置線程優先級。

    線程類的構造方法、靜態塊是被哪個線程調用的
    這是一個非常刁鉆和狡猾的問題。請記住:線程類的構造方法、靜態塊是被 new這個線程類所在的線程所調用的,而 run 方法里面的代碼才是被線程自身所調用的。

    如果說上面的說法讓你感到困惑,那么我舉個例子,假設 Thread2 中 new 了Thread1,main 函數中 new 了 Thread2,那么:

    (1)Thread2 的構造方法、靜態塊是 main 線程調用的,Thread2 的 run()方法是Thread2 自己調用的

    (2)Thread1 的構造方法、靜態塊是 Thread2 調用的,Thread1 的 run()方法是Thread1 自己調用的

    Java 中怎么獲取一份線程 dump 文件?你如何在 Java 中獲取線程堆棧?
    Dump文件是進程的內存鏡像。可以把程序的執行狀態通過調試器保存到dump文件中。

    在 Linux 下,你可以通過命令 kill -3 PID (Java 進程的進程 ID)來獲取 Java應用的 dump 文件。

    在 Windows 下,你可以按下 Ctrl + Break 來獲取。這樣 JVM 就會將線程的 dump 文件打印到標準輸出或錯誤文件中,它可能打印在控制臺或者日志文件中,具體位置依賴應用的配置。

    一個線程運行時發生異常會怎樣?

    如果異常沒有被捕獲該線程將會停止執行。Thread.UncaughtExceptionHandler是用于處理未捕獲異常造成線程突然中斷情況的一個內嵌接口。當一個未捕獲異常將造成線程中斷的時候,JVM 會使用 Thread.getUncaughtExceptionHandler()來查詢線程的 UncaughtExceptionHandler 并將線程和異常作為參數傳遞給 handler 的 uncaughtException()方法進行處理。

    Java 線程數過多會造成什么異常?

    線程的生命周期開銷非常高

    消耗過多的 CPU

    資源如果可運行的線程數量多于可用處理器的數量,那么有線程將會被閑置。大量空閑的線程會占用許多內存,給垃圾回收器帶來壓力,而且大量的線程在競爭 CPU資源時還將產生其他性能的開銷。

    降低穩定性JVM

    在可創建線程的數量上存在一個限制,這個限制值將隨著平臺的不同而不同,并且承受著多個因素制約,包括 JVM 的啟動參數、Thread 構造函數中請求棧的大小,以及底層操作系統對線程的限制等。如果破壞了這些限制,那么可能拋出OutOfMemoryError 異常。

    并發理論
    Java內存模型


    Java中垃圾回收有什么目的?什么時候進行垃圾回收?

    垃圾回收是在內存中存在沒有引用的對象或超過作用域的對象時進行的。

    垃圾回收的目的是識別并且丟棄應用不再使用的對象來釋放和重用資源。

    如果對象的引用被置為null,垃圾收集器是否會立即釋放對象占用的內存?
    不會,在下一個垃圾回調周期中,這個對象將是被可回收的。

    也就是說并不會立即被垃圾收集器立刻回收,而是在下一次垃圾回收時才會釋放其占用的內存。

    finalize()方法什么時候被調用?析構函數(finalization)的目的是什么?

    1)垃圾回收器(garbage colector)決定回收某對象時,就會運行該對象的finalize()方法;
    finalize是Object類的一個方法,該方法在Object類中的聲明protected void finalize() throws Throwable { }
    在垃圾回收器執行時會調用被回收對象的finalize()方法,可以覆蓋此方法來實現對其資源的回收。注意:一旦垃圾回收器準備釋放對象占用的內存,將首先調用該對象的finalize()方法,并且下一次垃圾回收動作發生時,才真正回收對象占用的內存空間

    2)GC本來就是內存回收了,應用還需要在finalization做什么呢? 答案是大部分時候,什么都不用做(也就是不需要重載)。只有在某些很特殊的情況下,比如你調用了一些native的方法(一般是C寫的),可以要在finaliztion里去調用C的釋放函數。

    重排序與數據依賴性


    為什么代碼會重排序?

    在執行程序時,為了提供性能,處理器和編譯器常常會對指令進行重排序,但是不能隨意重排序,不是你想怎么排序就怎么排序,它需要滿足以下兩個條件:

    在單線程環境下不能改變程序運行的結果;

    存在數據依賴關系的不允許重排序

    需要注意的是:重排序不會影響單線程環境的執行結果,但是會破壞多線程的執行語義。

    as-if-serial規則和happens-before規則的區別
    as-if-serial語義保證單線程內程序的執行結果不被改變,happens-before關系保證正確同步的多線程程序的執行結果不被改變。

    as-if-serial語義給編寫單線程程序的程序員創造了一個幻境:單線程程序是按程序的順序來執行的。happens-before關系給編寫正確同步的多線程程序的程序員創造了一個幻境:正確同步的多線程程序是按happens-before指定的順序來執行的。

    as-if-serial語義和happens-before這么做的目的,都是為了在不改變程序執行結果的前提下,盡可能地提高程序執行的并行度。

    并發關鍵字
    synchronized


    synchronized 的作用?

    在 Java 中,synchronized 關鍵字是用來控制線程同步的,就是在多線程的環境下,控制 synchronized 代碼段不被多個線程同時執行。synchronized 可以修飾類、方法、變量。

    另外,在 Java 早期版本中,synchronized屬于重量級鎖,效率低下,因為監視器鎖(monitor)是依賴于底層的操作系統的 Mutex Lock 來實現的,Java 的線程是映射到操作系統的原生線程之上的。如果要掛起或者喚醒一個線程,都需要操作系統幫忙完成,而操作系統實現線程之間的切換時需要從用戶態轉換到內核態,這個狀態之間的轉換需要相對比較長的時間,時間成本相對較高,這也是為什么早期的 synchronized 效率低的原因。慶幸的是在 Java 6 之后 Java 官方對從 JVM 層面對synchronized 較大優化,所以現在的 synchronized 鎖效率也優化得很不錯了。JDK1.6對鎖的實現引入了大量的優化,如自旋鎖、適應性自旋鎖、鎖消除、鎖粗化、偏向鎖、輕量級鎖等技術來減少鎖操作的開銷。

    說說自己是怎么使用 synchronized 關鍵字,在項目中用到了嗎
    synchronized關鍵字最主要的三種使用方式:

    修飾實例方法: 作用于當前對象實例加鎖,進入同步代碼前要獲得當前對象實例的鎖
    修飾靜態方法: 也就是給當前類加鎖,會作用于類的所有對象實例,因為靜態成員不屬于任何一個實例對象,是類成員( static 表明這是該類的一個靜態資源,不管new了多少個對象,只有一份)。所以如果一個線程A調用一個實例對象的非靜態 synchronized 方法,而線程B需要調用這個實例對象所屬類的靜態 synchronized 方法,是允許的,不會發生互斥現象,因為訪問靜態 synchronized 方法占用的鎖是當前類的鎖,而訪問非靜態 synchronized 方法占用的鎖是當前實例對象鎖。
    修飾代碼塊: 指定加鎖對象,對給定對象加鎖,進入同步代碼庫前要獲得給定對象的鎖。
    總結: synchronized 關鍵字加到 static 靜態方法和 synchronized(class)代碼塊上都是是給 Class 類上鎖。synchronized 關鍵字加到實例方法上是給對象實例上鎖。盡量不要使用 synchronized(String a) 因為JVM中,字符串常量池具有緩存功能!

    下面我以一個常見的面試題為例講解一下 synchronized 關鍵字的具體使用。

    面試中面試官經常會說:“單例模式了解嗎?來給我手寫一下!給我解釋一下雙重檢驗鎖方式實現單例模式的原理唄!”

    雙重校驗鎖實現對象單例(線程安全)
    ?

    public class Singleton {private volatile static Singleton uniqueInstance;private Singleton() {}public static Singleton getUniqueInstance() {//先判斷對象是否已經實例過,沒有實例化過才進入加鎖代碼if (uniqueInstance == null) {//類對象加鎖synchronized (Singleton.class) {if (uniqueInstance == null) {uniqueInstance = new Singleton();}}}return uniqueInstance;} }

    另外,需要注意 uniqueInstance 采用 volatile 關鍵字修飾也是很有必要。

    uniqueInstance 采用 volatile 關鍵字修飾也是很有必要的, uniqueInstance = new Singleton(); 這段代碼其實是分為三步執行:

    為 uniqueInstance 分配內存空間
    初始化 uniqueInstance
    將 uniqueInstance 指向分配的內存地址
    但是由于 JVM 具有指令重排的特性,執行順序有可能變成 1->3->2。指令重排在單線程環境下不會出現問題,但是在多線程環境下會導致一個線程獲得還沒有初始化的實例。例如,線程 T1 執行了 1 和 3,此時 T2 調用 getUniqueInstance() 后發現 uniqueInstance 不為空,因此返回 uniqueInstance,但此時 uniqueInstance 還未被初始化。

    使用 volatile 可以禁止 JVM 的指令重排,保證在多線程環境下也能正常運行。

    說一下 synchronized 底層實現原理?
    synchronized是Java中的一個關鍵字,在使用的過程中并沒有看到顯示的加鎖和解鎖過程。因此有必要通過javap命令,查看相應的字節碼文件。

    synchronized 同步語句塊的情況
    ?

    public class SynchronizedDemo {public void method() {synchronized (this) {System.out.println("synchronized 代碼塊");}} }

    通過JDK 反匯編指令 javap -c -v SynchronizedDemo

    可以看出在執行同步代碼塊之前之后都有一個monitor字樣,其中前面的是monitorenter,后面的是離開monitorexit,不難想象一個線程也執行同步代碼塊,首先要獲取鎖,而獲取鎖的過程就是monitorenter ,在執行完代碼塊之后,要釋放鎖,釋放鎖就是執行monitorexit指令。

    為什么會有兩個monitorexit呢?

    這個主要是防止在同步代碼塊中線程因異常退出,而鎖沒有得到釋放,這必然會造成死鎖(等待的線程永遠獲取不到鎖)。因此最后一個monitorexit是保證在異常情況下,鎖也可以得到釋放,避免死鎖。
    僅有ACC_SYNCHRONIZED這么一個標志,該標記表明線程進入該方法時,需要monitorenter,退出該方法時需要monitorexit。

    synchronized可重入的原理

    重入鎖是指一個線程獲取到該鎖之后,該線程可以繼續獲得該鎖。底層原理維護一個計數器,當線程獲取該鎖時,計數器加一,再次獲得該鎖時繼續加一,釋放鎖時,計數器減一,當計數器值為0時,表明該鎖未被任何線程所持有,其它線程可以競爭獲取鎖。

    什么是自旋
    很多 synchronized 里面的代碼只是一些很簡單的代碼,執行時間非常快,此時等待的線程都加鎖可能是一種不太值得的操作,因為線程阻塞涉及到用戶態和內核態切換的問題。既然 synchronized 里面的代碼執行得非常快,不妨讓等待鎖的線程不要被阻塞,而是在 synchronized 的邊界做忙循環,這就是自旋。如果做了多次循環發現還沒有獲得鎖,再阻塞,這樣可能是一種更好的策略。

    多線程中 synchronized 鎖升級的原理是什么?

    synchronized 鎖升級原理:在鎖對象的對象頭里面有一個 threadid 字段,在第一次訪問的時候 threadid 為空,jvm 讓其持有偏向鎖,并將 threadid 設置為其線程 id,再次進入的時候會先判斷 threadid 是否與其線程 id 一致,如果一致則可以直接使用此對象,如果不一致,則升級偏向鎖為輕量級鎖,通過自旋循環一定次數來獲取鎖,執行一定次數之后,如果還沒有正常獲取到要使用的對象,此時就會把鎖從輕量級升級為重量級鎖,此過程就構成了 synchronized 鎖的升級。

    鎖的升級的目的:鎖升級是為了減低了鎖帶來的性能消耗。在 Java 6 之后優化 synchronized 的實現方式,使用了偏向鎖升級為輕量級鎖再升級到重量級鎖的方式,從而減低了鎖帶來的性能消耗。

    線程 B 怎么知道線程 A 修改了變量
    (1)volatile 修飾變量

    (2)synchronized 修飾修改變量的方法

    (3)wait/notify

    (4)while 輪詢

    當一個線程進入一個對象的 synchronized 方法 A 之后,其它線程是否可進入此對象的 synchronized 方法 B?
    不能。其它線程只能訪問該對象的非同步方法,同步方法則不能進入。因為非靜態方法上的 synchronized 修飾符要求執行方法時要獲得對象的鎖,如果已經進入A 方法說明對象鎖已經被取走,那么試圖進入 B 方法的線程就只能在等鎖池(注意不是等待池哦)中等待對象的鎖。

    synchronized、volatile、CAS 比較
    (1)synchronized 是悲觀鎖,屬于搶占式,會引起其他線程阻塞。

    (2)volatile 提供多線程共享變量可見性和禁止指令重排序優化。

    (3)CAS 是基于沖突檢測的樂觀鎖(非阻塞)

    synchronized 和 Lock 有什么區別?

    首先synchronized是Java內置關鍵字,在JVM層面,Lock是個Java類;
    synchronized 可以給類、方法、代碼塊加鎖;而 lock 只能給代碼塊加鎖。
    synchronized 不需要手動獲取鎖和釋放鎖,使用簡單,發生異常會自動釋放鎖,不會造成死鎖;而 lock 需要自己加鎖和釋放鎖,如果使用不當沒有 unLock()去釋放鎖就會造成死鎖。
    通過 Lock 可以知道有沒有成功獲取鎖,而 synchronized 卻無法辦到。


    synchronized 和 ReentrantLock 區別是什么?

    synchronized 是和 if、else、for、while 一樣的關鍵字,ReentrantLock 是類,這是二者的本質區別。既然 ReentrantLock 是類,那么它就提供了比synchronized 更多更靈活的特性,可以被繼承、可以有方法、可以有各種各樣的類變量

    synchronized 早期的實現比較低效,對比 ReentrantLock,大多數場景性能都相差較大,但是在 Java 6 中對 synchronized 進行了非常多的改進。

    相同點:兩者都是可重入鎖

    兩者都是可重入鎖。“可重入鎖”概念是:自己可以再次獲取自己的內部鎖。比如一個線程獲得了某個對象的鎖,此時這個對象鎖還沒有釋放,當其再次想要獲取這個對象的鎖的時候還是可以獲取的,如果不可鎖重入的話,就會造成死鎖。同一個線程每次獲取鎖,鎖的計數器都自增1,所以要等到鎖的計數器下降為0時才能釋放鎖。

    主要區別如下:

    ReentrantLock 使用起來比較靈活,但是必須有釋放鎖的配合動作;
    ReentrantLock 必須手動獲取與釋放鎖,而 synchronized 不需要手動釋放和開啟鎖;
    ReentrantLock 只適用于代碼塊鎖,而 synchronized 可以修飾類、方法、變量等。
    二者的鎖機制其實也是不一樣的。ReentrantLock 底層調用的是 Unsafe 的park 方法加鎖,synchronized 操作的應該是對象頭中 mark word
    Java中每一個對象都可以作為鎖,這是synchronized實現同步的基礎:

    普通同步方法,鎖是當前實例對象
    靜態同步方法,鎖是當前類的class對象
    同步方法塊,鎖是括號里面的對象
    volatile
    volatile 關鍵字的作用
    對于可見性,Java 提供了 volatile 關鍵字來保證可見性和禁止指令重排。 volatile 提供 happens-before 的保證,確保一個線程的修改能對其他線程是可見的。當一個共享變量被 volatile 修飾時,它會保證修改的值會立即被更新到主存,當有其他線程需要讀取時,它會去內存中讀取新值。

    從實踐角度而言,volatile 的一個重要作用就是和 CAS 結合,保證了原子性,詳細的可以參見 java.util.concurrent.atomic 包下的類,比如 AtomicInteger。

    volatile 常用于多線程環境下的單次操作(單次讀或者單次寫)。

    Java 中能創建 volatile 數組嗎?

    能,Java 中可以創建 volatile 類型數組,不過只是一個指向數組的引用,而不是整個數組。意思是,如果改變引用指向的數組,將會受到 volatile 的保護,但是如果多個線程同時改變數組的元素,volatile 標示符就不能起到之前的保護作用了。

    volatile 變量和 atomic 變量有什么不同?

    volatile 變量可以確保先行關系,即寫操作會發生在后續的讀操作之前, 但它并不能保證原子性。例如用 volatile 修飾 count 變量,那么 count++ 操作就不是原子性的。

    而 AtomicInteger 類提供的 atomic 方法可以讓這種操作具有原子性如getAndIncrement()方法會原子性的進行增量操作把當前值加一,其它數據類型和引用變量也可以進行相似操作。

    volatile 能使得一個非原子操作變成原子操作嗎?

    關鍵字volatile的主要作用是使變量在多個線程間可見,但無法保證原子性,對于多個線程訪問同一個實例變量需要加鎖進行同步。

    雖然volatile只能保證可見性不能保證原子性,但用volatile修飾long和double可以保證其操作原子性。

    所以從Oracle Java Spec里面可以看到:

    對于64位的long和double,如果沒有被volatile修飾,那么對其操作可以不是原子的。在操作的時候,可以分成兩步,每次對32位操作。
    如果使用volatile修飾long和double,那么其讀寫都是原子操作
    對于64位的引用地址的讀寫,都是原子操作
    在實現JVM時,可以自由選擇是否把讀寫long和double作為原子操作
    推薦JVM實現為原子操作


    volatile 修飾符的有過什么實踐?

    單例模式

    是否 Lazy 初始化:是

    是否多線程安全:是

    實現難度:較復雜

    描述:對于Double-Check這種可能出現的問題(當然這種概率已經非常小了,但畢竟還是有的嘛~),解決方案是:只需要給instance的聲明加上volatile關鍵字即可volatile關鍵字的一個作用是禁止指令重排,把instance聲明為volatile之后,對它的寫操作就會有一個內存屏障(什么是內存屏障?),這樣,在它的賦值完成之前,就不用會調用讀操作。注意:volatile阻止的不是singleton = newSingleton()這句話內部[1-2-3]的指令重排,而是保證了在一個寫操作([1-2-3])完成之前,不會調用讀操作(if (instance == null))。
    ?

    public class Singleton7 {private static volatile Singleton7 instance = null;private Singleton7() {}public static Singleton7 getInstance() {if (instance == null) {synchronized (Singleton7.class) {if (instance == null) {instance = new Singleton7();}}}return instance;}}

    synchronized 和 volatile 的區別是什么?

    synchronized 表示只有一個線程可以獲取作用對象的鎖,執行代碼,阻塞其他線程。

    volatile 表示變量在 CPU 的寄存器中是不確定的,必須從主存中讀取。保證多線程環境下變量的可見性;禁止指令重排序。

    區別

    volatile 是變量修飾符;synchronized 可以修飾類、方法、變量。

    volatile 僅能實現變量的修改可見性,不能保證原子性;而 synchronized 則可以保證變量的修改可見性和原子性。

    volatile 不會造成線程的阻塞;synchronized 可能會造成線程的阻塞。

    volatile標記的變量不會被編譯器優化;synchronized標記的變量可以被編譯器優化。

    volatile關鍵字是線程同步的輕量級實現,所以volatile性能肯定比synchronized關鍵字要好。但是volatile關鍵字只能用于變量而synchronized關鍵字可以修飾方法以及代碼塊。synchronized關鍵字在JavaSE1.6之后進行了主要包括為了減少獲得鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖以及其它各種優化之后執行效率有了顯著提升,實際開發中使用 synchronized 關鍵字的場景還是更多一些。

    final

    什么是不可變對象,它對寫并發應用有什么幫助?


    不可變對象(Immutable Objects)即對象一旦被創建它的狀態(對象的數據,也即對象屬性值)就不能改變,反之即為可變對象(Mutable Objects)。

    不可變對象的類即為不可變類(Immutable Class)。Java 平臺類庫中包含許多不可變類,如 String、基本類型的包裝類、BigInteger 和 BigDecimal 等。

    只有滿足如下狀態,一個對象才是不可變的;

    它的狀態不能在創建后再被修改;

    所有域都是 final 類型;并且,它被正確創建(創建期間沒有發生 this 引用的逸出)。

    不可變對象保證了對象的內存可見性,對不可變對象的讀取不需要進行額外的同步手段,提升了代碼執行效率。

    Lock體系
    Lock簡介與初識AQS

    Java Concurrency API 中的 Lock 接口(Lock interface)是什么?對比同步它有什么優勢?


    Lock 接口比同步方法和同步塊提供了更具擴展性的鎖操作。他們允許更靈活的結構,可以具有完全不同的性質,并且可以支持多個相關類的條件對象。

    它的優勢有:

    (1)可以使鎖更公平

    (2)可以使線程在等待鎖的時候響應中斷

    (3)可以讓線程嘗試獲取鎖,并在無法獲取鎖的時候立即返回或者等待一段時間

    (4)可以在不同的范圍,以不同的順序獲取和釋放鎖

    整體上來說 Lock 是 synchronized 的擴展版,Lock 提供了無條件的、可輪詢的(tryLock 方法)、定時的(tryLock 帶參方法)、可中斷的(lockInterruptibly)、可多條件隊列的(newCondition 方法)鎖操作。另外 Lock 的實現類基本都支持非公平鎖(默認)和公平鎖,synchronized 只支持非公平鎖,當然,在大部分情況下,非公平鎖是高效的選擇。

    樂觀鎖和悲觀鎖的理解及如何實現,有哪些實現方式?

    悲觀鎖:總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。再比如 Java 里面的同步原語 synchronized 關鍵字的實現也是悲觀鎖。

    樂觀鎖:顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量,像數據庫提供的類似于 write_condition 機制,其實都是提供的樂觀鎖。在 Java中 java.util.concurrent.atomic 包下面的原子變量類就是使用了樂觀鎖的一種實現方式 CAS 實現的。

    樂觀鎖的實現方式:

    1、使用版本標識來確定讀到的數據與提交時的數據是否一致。提交后修改版本標識,不一致時可以采取丟棄和再次嘗試的策略。

    2、java 中的 Compare and Swap 即 CAS ,當多個線程嘗試使用 CAS 同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程并不會被掛起,而是被告知這次競爭中失敗,并可以再次嘗試。 CAS 操作中包含三個操作數 —— 需要讀寫的內存位置(V)、進行比較的預期原值(A)和擬寫入的新值(B)。如果內存位置 V 的值與預期原值 A 相匹配,那么處理器會自動將該位置值更新為新值 B。否則處理器不做任何操作。

    什么是 CAS
    CAS 是 compare and swap 的縮寫,即我們所說的比較交換。

    cas 是一種基于鎖的操作,而且是樂觀鎖。在 java 中鎖分為樂觀鎖和悲觀鎖。悲觀鎖是將資源鎖住,等一個之前獲得鎖的線程釋放鎖之后,下一個線程才可以訪問。而樂觀鎖采取了一種寬泛的態度,通過某種方式不加鎖來處理資源,比如通過給記錄加 version 來獲取數據,性能較悲觀鎖有很大的提高。

    CAS 操作包含三個操作數 —— 內存位置(V)、預期原值(A)和新值(B)。如果內存地址里面的值和 A 的值是一樣的,那么就將內存里面的值更新成 B。CAS是通過無限循環來獲取數據的,若果在第一輪循環中,a 線程獲取地址里面的值被b 線程修改了,那么 a 線程需要自旋,到下次循環才有可能機會執行。

    java.util.concurrent.atomic 包下的類大多是使用 CAS 操作來實現的(AtomicInteger,AtomicBoolean,AtomicLong)。

    CAS 的會產生什么問題?

    1、ABA 問題:

    比如說一個線程 one 從內存位置 V 中取出 A,這時候另一個線程 two 也從內存中取出 A,并且 two 進行了一些操作變成了 B,然后 two 又將 V 位置的數據變成 A,這時候線程 one 進行 CAS 操作發現內存中仍然是 A,然后 one 操作成功。盡管線程 one 的 CAS 操作成功,但可能存在潛藏的問題。從 Java1.5 開始 JDK 的 atomic包里提供了一個類 AtomicStampedReference 來解決 ABA 問題。

    2、循環時間長開銷大:

    對于資源競爭嚴重(線程沖突嚴重)的情況,CAS 自旋的概率會比較大,從而浪費更多的 CPU 資源,效率低于 synchronized。

    3、只能保證一個共享變量的原子操作:

    當對一個共享變量執行操作時,我們可以使用循環 CAS 的方式來保證原子操作,但是對多個共享變量操作時,循環 CAS 就無法保證操作的原子性,這個時候就可以用鎖。

    什么是死鎖?
    當線程 A 持有獨占鎖a,并嘗試去獲取獨占鎖 b 的同時,線程 B 持有獨占鎖 b,并嘗試獲取獨占鎖 a 的情況下,就會發生 AB 兩個線程由于互相持有對方需要的鎖,而發生的阻塞現象,我們稱為死鎖。

    產生死鎖的條件是什么?怎么防止死鎖?
    產生死鎖的必要條件:

    1、互斥條件:所謂互斥就是進程在某一時間內獨占資源。

    2、請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

    3、不剝奪條件:進程已獲得資源,在末使用完之前,不能強行剝奪。

    4、循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。

    這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之 一不滿足,就不會發生死鎖。

    理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和 解除死鎖。

    防止死鎖可以采用以下的方法:

    盡量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),設置超時時間,超時可以退出防止死鎖。
    盡量使用 Java. util. concurrent 并發類代替自己手寫鎖。
    盡量降低鎖的使用粒度,盡量不要幾個功能用同一把鎖。
    盡量減少同步的代碼塊。
    死鎖與活鎖的區別,死鎖與饑餓的區別?
    死鎖:是指兩個或兩個以上的進程(或線程)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。

    活鎖:任務或者執行者沒有被阻塞,由于某些條件沒有滿足,導致一直重復嘗試,失敗,嘗試,失敗。

    活鎖和死鎖的區別在于,處于活鎖的實體是在不斷的改變狀態,這就是所謂的“活”, 而處于死鎖的實體表現為等待;活鎖有可能自行解開,死鎖則不能。

    饑餓:一個或者多個線程因為種種原因無法獲得所需要的資源,導致一直無法執行的狀態。

    Java 中導致饑餓的原因:

    1、高優先級線程吞噬所有的低優先級線程的 CPU 時間。

    2、線程被永久堵塞在一個等待進入同步塊的狀態,因為其他線程總是能在它之前持續地對該同步塊進行訪問。

    3、線程在等待一個本身也處于永久等待完成的對象(比如調用這個對象的 wait 方法),因為其他線程總是被持續地獲得喚醒。

    多線程鎖的升級原理是什么?
    在Java中,鎖共有4種狀態,級別從低到高依次為:無狀態鎖,偏向鎖,輕量級鎖和重量級鎖狀態,這幾個狀態會隨著競爭情況逐漸升級。鎖可以升級但不能降級。

    AQS(AbstractQueuedSynchronizer)詳解與源碼分析
    AQS 介紹
    AQS的全稱為(AbstractQueuedSynchronizer),這個類在java.util.concurrent.locks包下面。

    AQS是一個用來構建鎖和同步器的框架,使用AQS能簡單且高效地構造出應用廣泛的大量的同步器,比如我們提到的ReentrantLock,Semaphore,其他的諸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。當然,我們自己也能利用AQS非常輕松容易地構造出符合我們自己需求的同步器。

    AQS 原理分析

    下面大部分內容其實在AQS類注釋上已經給出了,不過是英語看著比較吃力一點,感興趣的話可以看看源碼。

    AQS 原理概覽

    AQS核心思想是,如果被請求的共享資源空閑,則將當前請求資源的線程設置為有效的工作線程,并且將共享資源設置為鎖定狀態。如果被請求的共享資源被占用,那么就需要一套線程阻塞等待以及被喚醒時鎖分配的機制,這個機制AQS是用CLH隊列鎖實現的,即將暫時獲取不到鎖的線程加入到隊列中。

    CLH(Craig,Landin,and Hagersten)隊列是一個虛擬的雙向隊列(虛擬的雙向隊列即不存在隊列實例,僅存在結點之間的關聯關系)。AQS是將每條請求共享資源的線程封裝成一個CLH鎖隊列的一個結點(Node)來實現鎖的分配。

    看個AQS(AbstractQueuedSynchronizer)原理圖:

    ?AQS使用一個int成員變量來表示同步狀態,通過內置的FIFO隊列來完成獲取資源線程的排隊工作。AQS使用CAS對該同步狀態進行原子操作實現對其值的修改。

    private volatile int state;//共享變量,使用volatile修飾保證線程可見性

    狀態信息通過protected類型的getState,setState,compareAndSetState進行操作

    //返回同步狀態的當前值 protected final int getState() { return state; }// 設置同步狀態的值 protected final void setState(int newState) { state = newState; } //原子地(CAS操作)將同步狀態值設置為給定值update如果當前同步狀態的值等于expect(期望值) protected final boolean compareAndSetState(int expect, int update) {return unsafe.compareAndSwapInt(this, stateOffset, expect, update); }

    AQS 對資源的共享方式

    AQS定義兩種資源共享方式

    Exclusive(獨占):只有一個線程能執行,如ReentrantLock。又可分為公平鎖和非公平鎖:

    公平鎖:按照線程在隊列中的排隊順序,先到者先拿到鎖
    非公平鎖:當線程要獲取鎖時,無視隊列順序直接去搶鎖,誰搶到就是誰的
    Share(共享):多個線程可同時執行,如Semaphore/CountDownLatch。Semaphore、CountDownLatch、 CyclicBarrier、ReadWriteLock 我們都會在后面講到。

    ReentrantReadWriteLock 可以看成是組合式,因為ReentrantReadWriteLock也就是讀寫鎖允許多個線程同時對某一資源進行讀。

    不同的自定義同步器爭用共享資源的方式也不同。自定義同步器在實現時只需要實現共享資源 state 的獲取與釋放方式即可,至于具體線程等待隊列的維護(如獲取資源失敗入隊/喚醒出隊等),AQS已經在頂層實現好了。

    AQS底層使用了模板方法模式

    同步器的設計是基于模板方法模式的,如果需要自定義同步器一般的方式是這樣(模板方法模式很經典的一個應用):

    使用者繼承AbstractQueuedSynchronizer并重寫指定的方法。(這些重寫方法很簡單,無非是對于共享資源state的獲取和釋放)
    將AQS組合在自定義同步組件的實現中,并調用其模板方法,而這些模板方法會調用使用者重寫的方法。
    這和我們以往通過實現接口的方式有很大區別,這是模板方法模式很經典的一個運用。

    AQS使用了模板方法模式,自定義同步器時需要重寫下面幾個AQS提供的模板方法:
    ?

    isHeldExclusively()//該線程是否正在獨占資源。只有用到condition才需要去實現它。 tryAcquire(int)//獨占方式。嘗試獲取資源,成功則返回true,失敗則返回false。 tryRelease(int)//獨占方式。嘗試釋放資源,成功則返回true,失敗則返回false。 tryAcquireShared(int)//共享方式。嘗試獲取資源。負數表示失敗;0表示成功,但沒有剩余可用資源;正數表示成功,且有剩余資源。 tryReleaseShared(int)//共享方式。嘗試釋放資源,成功則返回true,失敗則返回false。

    默認情況下,每個方法都拋出 UnsupportedOperationException。 這些方法的實現必須是內部線程安全的,并且通常應該簡短而不是阻塞。AQS類中的其他方法都是final ,所以無法被其他類使用,只有這幾個方法可以被其他類使用。

    以ReentrantLock為例,state初始化為0,表示未鎖定狀態。A線程lock()時,會調用tryAcquire()獨占該鎖并將state+1。此后,其他線程再tryAcquire()時就會失敗,直到A線程unlock()到state=0(即釋放鎖)為止,其它線程才有機會獲取該鎖。當然,釋放鎖之前,A線程自己是可以重復獲取此鎖的(state會累加),這就是可重入的概念。但要注意,獲取多少次就要釋放多么次,這樣才能保證state是能回到零態的。

    再以CountDownLatch以例,任務分為N個子線程去執行,state也初始化為N(注意N要與線程個數一致)。這N個子線程是并行執行的,每個子線程執行完后countDown()一次,state會CAS(Compare and Swap)減1。等到所有子線程都執行完后(即state=0),會unpark()主調用線程,然后主調用線程就會從await()函數返回,繼續后余動作。

    一般來說,自定義同步器要么是獨占方法,要么是共享方式,他們也只需實現tryAcquire-tryRelease、tryAcquireShared-tryReleaseShared中的一種即可。但AQS也支持自定義同步器同時實現獨占和共享兩種方式,如ReentrantReadWriteLock。

    ReentrantLock(重入鎖)實現原理與公平鎖非公平鎖區別
    什么是可重入鎖(ReentrantLock)?


    ReentrantLock重入鎖,是實現Lock接口的一個類,也是在實際編程中使用頻率很高的一個鎖,支持重入性,表示能夠對共享資源能夠重復加鎖,即當前線程獲取該鎖再次獲取不會被阻塞。

    在java關鍵字synchronized隱式支持重入性,synchronized通過獲取自增,釋放自減的方式實現重入。與此同時,ReentrantLock還支持公平鎖和非公平鎖兩種方式。那么,要想完完全全的弄懂ReentrantLock的話,主要也就是ReentrantLock同步語義的學習:1. 重入性的實現原理;2. 公平鎖和非公平鎖。

    重入性的實現原理

    要想支持重入性,就要解決兩個問題:1. 在線程獲取鎖的時候,如果已經獲取鎖的線程是當前線程的話則直接再次獲取成功;2. 由于鎖會被獲取n次,那么只有鎖在被釋放同樣的n次之后,該鎖才算是完全釋放成功。

    ReentrantLock支持兩種鎖:公平鎖和非公平鎖。何謂公平性,是針對獲取鎖而言的,如果一個鎖是公平的,那么鎖的獲取順序就應該符合請求上的絕對時間順序,滿足FIFO。

    讀寫鎖ReentrantReadWriteLock源碼分析
    ReadWriteLock 是什么


    首先明確一下,不是說 ReentrantLock 不好,只是 ReentrantLock 某些時候有局限。如果使用 ReentrantLock,可能本身是為了防止線程 A 在寫數據、線程 B 在讀數據造成的數據不一致,但這樣,如果線程 C 在讀數據、線程 D 也在讀數據,讀數據是不會改變數據的,沒有必要加鎖,但是還是加鎖了,降低了程序的性能。因為這個,才誕生了讀寫鎖 ReadWriteLock。

    ReadWriteLock 是一個讀寫鎖接口,讀寫鎖是用來提升并發程序性能的鎖分離技術,ReentrantReadWriteLock 是 ReadWriteLock 接口的一個具體實現,實現了讀寫的分離,讀鎖是共享的,寫鎖是獨占的,讀和讀之間不會互斥,讀和寫、寫和讀、寫和寫之間才會互斥,提升了讀寫的性能。

    而讀寫鎖有以下三個重要的特性:

    (1)公平選擇性:支持非公平(默認)和公平的鎖獲取方式,吞吐量還是非公平優于公平。

    (2)重進入:讀鎖和寫鎖都支持線程重進入。

    (3)鎖降級:遵循獲取寫鎖、獲取讀鎖再釋放寫鎖的次序,寫鎖能夠降級成為讀鎖。

    Condition源碼分析與等待通知機制
    LockSupport詳解
    并發容器
    并發容器之ConcurrentHashMap詳解(JDK1.8版本)與源碼分析
    什么是ConcurrentHashMap?
    ConcurrentHashMap是Java中的一個線程安全且高效的HashMap實現。平時涉及高并發如果要用map結構,那第一時間想到的就是它。相對于hashmap來說,ConcurrentHashMap就是線程安全的map,其中利用了鎖分段的思想提高了并發度。

    那么它到底是如何實現線程安全的?

    JDK 1.6版本關鍵要素:

    segment繼承了ReentrantLock充當鎖的角色,為每一個segment提供了線程安全的保障;

    segment維護了哈希散列表的若干個桶,每個桶由HashEntry構成的鏈表。

    JDK1.8后,ConcurrentHashMap拋棄了原有的Segment 分段鎖,而采用了 CAS + synchronized 來保證并發安全性。

    Java 中 ConcurrentHashMap 的并發度是什么?

    ConcurrentHashMap 把實際 map 劃分成若干部分來實現它的可擴展性和線程安全。這種劃分是使用并發度獲得的,它是 ConcurrentHashMap 類構造函數的一個可選參數,默認值為 16,這樣在多線程情況下就能避免爭用。

    在 JDK8 后,它摒棄了 Segment(鎖段)的概念,而是啟用了一種全新的方式實現,利用 CAS 算法。同時加入了更多的輔助變量來提高并發度,具體內容還是查看源碼吧。

    什么是并發容器的實現?

    何為同步容器:可以簡單地理解為通過 synchronized 來實現同步的容器,如果有多個線程調用同步容器的方法,它們將會串行執行。比如 Vector,Hashtable,以及 Collections.synchronizedSet,synchronizedList 等方法返回的容器。可以通過查看 Vector,Hashtable 等這些同步容器的實現代碼,可以看到這些容器實現線程安全的方式就是將它們的狀態封裝起來,并在需要同步的方法上加上關鍵字 synchronized。

    并發容器使用了與同步容器完全不同的加鎖策略來提供更高的并發性和伸縮性,例如在 ConcurrentHashMap 中采用了一種粒度更細的加鎖機制,可以稱為分段鎖,在這種鎖機制下,允許任意數量的讀線程并發地訪問 map,并且執行讀操作的線程和寫操作的線程也可以并發的訪問 map,同時允許一定數量的寫操作線程并發地修改 map,所以它可以在并發環境下實現更高的吞吐量。

    Java 中的同步集合與并發集合有什么區別?

    同步集合與并發集合都為多線程和并發提供了合適的線程安全的集合,不過并發集合的可擴展性更高。在 Java1.5 之前程序員們只有同步集合來用且在多線程并發的時候會導致爭用,阻礙了系統的擴展性。Java5 介紹了并發集合像ConcurrentHashMap,不僅提供線程安全還用鎖分離和內部分區等現代技術提高了可擴展性。

    SynchronizedMap 和 ConcurrentHashMap 有什么區別?

    SynchronizedMap 一次鎖住整張表來保證線程安全,所以每次只能有一個線程來訪為 map。

    ConcurrentHashMap 使用分段鎖來保證在多線程下的性能。

    ConcurrentHashMap 中則是一次鎖住一個桶。ConcurrentHashMap 默認將hash 表分為 16 個桶,諸如 get,put,remove 等常用操作只鎖當前需要用到的桶。

    這樣,原來只能一個線程進入,現在卻能同時有 16 個寫線程執行,并發性能的提升是顯而易見的。

    另外 ConcurrentHashMap 使用了一種不同的迭代方式。在這種迭代方式中,當iterator 被創建后集合再發生改變就不再是拋出ConcurrentModificationException,取而代之的是在改變時 new 新的數據從而不影響原有的數據,iterator 完成后再將頭指針替換為新的數據 ,這樣 iterator線程可以使用原來老的數據,而寫線程也可以并發的完成改變。

    并發容器之CopyOnWriteArrayList詳解
    CopyOnWriteArrayList 是什么,可以用于什么應用場景?有哪些優缺點?
    CopyOnWriteArrayList 是一個并發容器。有很多人稱它是線程安全的,我認為這句話不嚴謹,缺少一個前提條件,那就是非復合場景下操作它是線程安全的。

    CopyOnWriteArrayList(免鎖容器)的好處之一是當多個迭代器同時遍歷和修改這個列表時,不會拋出 ConcurrentModificationException。在CopyOnWriteArrayList 中,寫入將導致創建整個底層數組的副本,而源數組將保留在原地,使得復制的數組在被修改時,讀取操作可以安全地執行。

    CopyOnWriteArrayList 的使用場景

    通過源碼分析,我們看出它的優缺點比較明顯,所以使用場景也就比較明顯。就是合適讀多寫少的場景。

    CopyOnWriteArrayList 的缺點

    由于寫操作的時候,需要拷貝數組,會消耗內存,如果原數組的內容比較多的情況下,可能導致 young gc 或者 full gc。
    不能用于實時讀的場景,像拷貝數組、新增元素都需要時間,所以調用一個 set 操作后,讀取到數據可能還是舊的,雖然CopyOnWriteArrayList 能做到最終一致性,但是還是沒法滿足實時性要求。
    由于實際使用中可能沒法保證 CopyOnWriteArrayList 到底要放置多少數據,萬一數據稍微有點多,每次 add/set 都要重新復制數組,這個代價實在太高昂了。在高性能的互聯網應用中,這種操作分分鐘引起故障。
    CopyOnWriteArrayList 的設計思想

    讀寫分離,讀和寫分開
    最終一致性
    使用另外開辟空間的思路,來解決并發沖突
    并發容器之ThreadLocal詳解
    ThreadLocal 是什么?有哪些使用場景?
    ThreadLocal 是一個本地線程副本變量工具類,在每個線程中都創建了一個 ThreadLocalMap 對象,簡單說 ThreadLocal 就是一種以空間換時間的做法,每個線程可以訪問自己內部 ThreadLocalMap 對象內的 value。通過這種方式,避免資源在多線程間共享。

    原理:線程局部變量是局限于線程內部的變量,屬于線程自身所有,不在多個線程間共享。Java提供ThreadLocal類來支持線程局部變量,是一種實現線程安全的方式。但是在管理環境下(如 web 服務器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命周期比任何應用變量的生命周期都要長。任何線程局部變量一旦在工作完成后沒有釋放,Java 應用就存在內存泄露的風險。

    經典的使用場景是為每個線程分配一個 JDBC 連接 Connection。這樣就可以保證每個線程的都在各自的 Connection 上進行數據庫的操作,不會出現 A 線程關了 B線程正在使用的 Connection; 還有 Session 管理 等問題。

    ThreadLocal 使用例子:
    ?

    public class TestThreadLocal {//線程本地存儲變量private static final ThreadLocal<Integer> THREAD_LOCAL_NUM = new ThreadLocal<Integer>() {@Overrideprotected Integer initialValue() {return 0;}};public static void main(String[] args) {for (int i = 0; i <3; i++) {//啟動三個線程Thread t = new Thread() {@Overridepublic void run() {add10ByThreadLocal();}};t.start();}}/*** 線程本地存儲變量加 5*/private static void add10ByThreadLocal() {for (int i = 0; i <5; i++) {Integer n = THREAD_LOCAL_NUM.get();n += 1;THREAD_LOCAL_NUM.set(n);System.out.println(Thread.currentThread().getName() + " : ThreadLocal num=" + n);}}}

    打印結果:啟動了 3 個線程,每個線程最后都打印到 “ThreadLocal num=5”,而不是 num 一直在累加直到值等于 15

    Thread-0 : ThreadLocal num=1 Thread-1 : ThreadLocal num=1 Thread-0 : ThreadLocal num=2 Thread-0 : ThreadLocal num=3 Thread-1 : ThreadLocal num=2 Thread-2 : ThreadLocal num=1 Thread-0 : ThreadLocal num=4 Thread-2 : ThreadLocal num=2 Thread-1 : ThreadLocal num=3 Thread-1 : ThreadLocal num=4 Thread-2 : ThreadLocal num=3 Thread-0 : ThreadLocal num=5 Thread-2 : ThreadLocal num=4 Thread-2 : ThreadLocal num=5 Thread-1 : ThreadLocal num=5

    什么是線程局部變量?


    線程局部變量是局限于線程內部的變量,屬于線程自身所有,不在多個線程間共享。Java 提供 ThreadLocal 類來支持線程局部變量,是一種實現線程安全的方式。但是在管理環境下(如 web 服務器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命周期比任何應用變量的生命周期都要長。任何線程局部變量一旦在工作完成后沒有釋放,Java 應用就存在內存泄露的風險。

    ThreadLocal內存泄漏分析與解決方案
    ThreadLocal造成內存泄漏的原因?


    ThreadLocalMap 中使用的 key 為 ThreadLocal 的弱引用,而 value 是強引用。所以,如果 ThreadLocal 沒有被外部強引用的情況下,在垃圾回收的時候,key 會被清理掉,而 value 不會被清理掉。這樣一來,ThreadLocalMap 中就會出現key為null的Entry。假如我們不做任何措施的話,value 永遠無法被GC 回收,這個時候就可能會產生內存泄露。ThreadLocalMap實現中已經考慮了這種情況,在調用 set()、get()、remove() 方法的時候,會清理掉 key 為 null 的記錄。使用完 ThreadLocal方法后 最好手動調用remove()方法

    ThreadLocal內存泄漏解決方案?

    每次使用完ThreadLocal,都調用它的remove()方法,清除數據。

    在使用線程池的情況下,沒有及時清理ThreadLocal,不僅是內存泄漏的問題,更嚴重的是可能導致業務邏輯出現問題。所以,使用ThreadLocal就跟加鎖完要解鎖一樣,用完就清理。

    并發容器之BlockingQueue詳解
    什么是阻塞隊列?阻塞隊列的實現原理是什么?如何使用阻塞隊列來實現生產者-消費者模型?
    阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列。

    這兩個附加的操作是:在隊列為空時,獲取元素的線程會等待隊列變為非空。當隊列滿時,存儲元素的線程會等待隊列可用。

    阻塞隊列常用于生產者和消費者的場景,生產者是往隊列里添加元素的線程,消費者是從隊列里拿元素的線程。阻塞隊列就是生產者存放元素的容器,而消費者也只從容器里拿元素。

    JDK7 提供了 7 個阻塞隊列。分別是:

    ArrayBlockingQueue :一個由數組結構組成的有界阻塞隊列。

    LinkedBlockingQueue :一個由鏈表結構組成的有界阻塞隊列。

    PriorityBlockingQueue :一個支持優先級排序的無界阻塞隊列。

    DelayQueue:一個使用優先級隊列實現的無界阻塞隊列。

    SynchronousQueue:一個不存儲元素的阻塞隊列。

    LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列。

    LinkedBlockingDeque:一個由鏈表結構組成的雙向阻塞隊列。

    Java 5 之前實現同步存取時,可以使用普通的一個集合,然后在使用線程的協作和線程同步可以實現生產者,消費者模式,主要的技術就是用好,wait,notify,notifyAll,sychronized 這些關鍵字。而在 java 5 之后,可以使用阻塞隊列來實現,此方式大大簡少了代碼量,使得多線程編程更加容易,安全方面也有保障。

    BlockingQueue 接口是 Queue 的子接口,它的主要用途并不是作為容器,而是作為線程同步的的工具,因此他具有一個很明顯的特性,當生產者線程試圖向 BlockingQueue 放入元素時,如果隊列已滿,則線程被阻塞,當消費者線程試圖從中取出一個元素時,如果隊列為空,則該線程會被阻塞,正是因為它所具有這個特性,所以在程序中多個線程交替向 BlockingQueue 中放入元素,取出元素,它可以很好的控制線程之間的通信。

    阻塞隊列使用最經典的場景就是 socket 客戶端數據的讀取和解析,讀取數據的線程不斷將數據放入隊列,然后解析線程不斷從隊列取數據解析。

    并發容器之ConcurrentLinkedQueue詳解與源碼分析
    并發容器之ArrayBlockingQueue與LinkedBlockingQueue詳解
    線程池


    Executors類創建四種常見線程池
    什么是線程池?有哪幾種創建方式?

    池化技術相比大家已經屢見不鮮了,線程池、數據庫連接池、Http 連接池等等都是對這個思想的應用。池化技術的思想主要是為了減少每次獲取資源的消耗,提高對資源的利用率。

    在面向對象編程中,創建和銷毀對象是很費時間的,因為創建一個對象要獲取內存資源或者其它更多資源。在 Java 中更是如此,虛擬機將試圖跟蹤每一個對象,以便能夠在對象銷毀后進行垃圾回收。所以提高服務程序效率的一個手段就是盡可能減少創建和銷毀對象的次數,特別是一些很耗資源的對象創建和銷毀,這就是”池化資源”技術產生的原因。

    線程池顧名思義就是事先創建若干個可執行的線程放入一個池(容器)中,需要的時候從池中獲取線程不用自行創建,使用完畢不需要銷毀線程而是放回池中,從而減少創建和銷毀線程對象的開銷。Java 5+中的 Executor 接口定義一個執行線程的工具。它的子類型即線程池接口是 ExecutorService。要配置一個線程池是比較復雜的,尤其是對于線程池的原理不是很清楚的情況下,因此在工具類 Executors 面提供了一些靜態工廠方法,生成一些常用的線程池,如下所示:

    (1)newSingleThreadExecutor:創建一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當于單線程串行執行所有任務。如果這個唯一的線程因為異常結束,那么會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。

    (2)newFixedThreadPool:創建固定大小的線程池。每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那么線程池會補充一個新線程。如果希望在服務器上使用線程池,建議使用 newFixedThreadPool方法來創建線程池,這樣能獲得更好的性能。

    (3) newCachedThreadPool:創建一個可緩存的線程池。如果線程池的大小超過了處理任務所需要的線程,那么就會回收部分空閑(60 秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴于操作系統(或者說 JVM)能夠創建的最大線程大小。

    (4)newScheduledThreadPool:創建一個大小無限的線程池。此線程池支持定時以及周期性執行任務的需求。

    線程池有什么優點?

    降低資源消耗:重用存在的線程,減少對象創建銷毀的開銷。

    提高響應速度。可有效的控制最大并發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。當任務到達時,任務可以不需要的等到線程創建就能立即執行。

    提高線程的可管理性。線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控。

    附加功能:提供定時執行、定期執行、單線程、并發數控制等功能。

    綜上所述使用線程池框架 Executor 能更好的管理線程、提供系統資源使用率。

    線程池都有哪些狀態?

    RUNNING:這是最正常的狀態,接受新的任務,處理等待隊列中的任務。
    SHUTDOWN:不接受新的任務提交,但是會繼續處理等待隊列中的任務。
    STOP:不接受新的任務提交,不再處理等待隊列中的任務,中斷正在執行任務的線程。
    TIDYING:所有的任務都銷毀了,workCount 為 0,線程池的狀態在轉換為 TIDYING 狀態時,會執行鉤子方法 terminated()。
    TERMINATED:terminated()方法結束后,線程池的狀態就會變成這個。
    什么是 Executor 框架?為什么使用 Executor 框架?
    Executor 框架是一個根據一組執行策略調用,調度,執行和控制的異步任務的框架。

    每次執行任務創建線程 new Thread()比較消耗性能,創建一個線程是比較耗時、耗資源的,而且無限制的創建線程會引起應用程序內存溢出。

    所以創建一個線程池是個更好的的解決方案,因為可以限制線程的數量并且可以回收再利用這些線程。利用Executors 框架可以非常方便的創建一個線程池。

    在 Java 中 Executor 和 Executors 的區別?
    Executors 工具類的不同方法按照我們的需求創建了不同的線程池,來滿足業務的需求。

    Executor 接口對象能執行我們的線程任務。

    ExecutorService 接口繼承了 Executor 接口并進行了擴展,提供了更多的方法我們能獲得任務執行的狀態并且可以獲取任務的返回值。

    使用 ThreadPoolExecutor 可以創建自定義線程池。

    Future 表示異步計算的結果,他提供了檢查計算是否完成的方法,以等待計算的完成,并可以使用 get()方法獲取計算的結果。

    線程池中 submit() 和 execute() 方法有什么區別?
    接收參數:execute()只能執行 Runnable 類型的任務。submit()可以執行 Runnable 和 Callable 類型的任務。

    返回值:submit()方法可以返回持有計算結果的 Future 對象,而execute()沒有

    異常處理:submit()方便Exception處理

    什么是線程組,為什么在 Java 中不推薦使用?
    ThreadGroup 類,可以把線程歸屬到某一個線程組中,線程組中可以有線程對象,也可以有線程組,組中還可以有線程,這樣的組織結構有點類似于樹的形式。

    線程組和線程池是兩個不同的概念,他們的作用完全不同,前者是為了方便線程的管理,后者是為了管理線程的生命周期,復用線程,減少創建銷毀線程的開銷。

    為什么不推薦使用線程組?因為使用有很多的安全隱患吧,沒有具體追究,如果需要使用,推薦使用線程池。

    線程池之ThreadPoolExecutor詳解
    Executors和ThreaPoolExecutor創建線程池的區別
    《阿里巴巴Java開發手冊》中強制線程池不允許使用 Executors 去創建,而是通過 ThreadPoolExecutor 的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險

    Executors 各個方法的弊端:

    newFixedThreadPool 和 newSingleThreadExecutor:
    主要問題是堆積的請求處理隊列可能會耗費非常大的內存,甚至 OOM。

    newCachedThreadPool 和 newScheduledThreadPool:
    主要問題是線程數最大數是 Integer.MAX_VALUE,可能會創建數量非常多的線程,甚至 OOM。

    ThreaPoolExecutor創建線程池方式只有一種,就是走它的構造函數,參數自己指定

    你知道怎么創建線程池嗎?
    創建線程池的方式有多種,這里你只需要答 ThreadPoolExecutor 即可。

    ThreadPoolExecutor() 是最原始的線程池創建,也是阿里巴巴 Java 開發手冊中明確規范的創建線程池的方式。

    ThreadPoolExecutor構造函數重要參數分析
    ThreadPoolExecutor 3 個最重要的參數:

    corePoolSize :核心線程數,線程數定義了最小可以同時運行的線程數量。
    maximumPoolSize :線程池中允許存在的工作線程的最大數量
    workQueue:當新任務來的時候會先判斷當前運行的線程數量是否達到核心線程數,如果達到的話,任務就會被存放在隊列中。
    ThreadPoolExecutor其他常見參數:

    keepAliveTime:線程池中的線程數量大于 corePoolSize 的時候,如果這時沒有新的任務提交,核心線程外的線程不會立即銷毀,而是會等待,直到等待的時間超過了 keepAliveTime才會被回收銷毀;
    unit :keepAliveTime 參數的時間單位。
    threadFactory:為線程池提供創建新線程的線程工廠
    handler :線程池任務隊列超過 maxinumPoolSize 之后的拒絕策略
    ThreadPoolExecutor飽和策略
    ThreadPoolExecutor 飽和策略定義:

    如果當前同時運行的線程數量達到最大線程數量并且隊列也已經被放滿了任時,ThreadPoolTaskExecutor 定義一些策略:

    ThreadPoolExecutor.AbortPolicy:拋出 RejectedExecutionException來拒絕新任務的處理。
    ThreadPoolExecutor.CallerRunsPolicy:調用執行自己的線程運行任務。您不會任務請求。但是這種策略會降低對于新任務提交速度,影響程序的整體性能。另外,這個策略喜歡增加隊列容量。如果您的應用程序可以承受此延遲并且你不能任務丟棄任何一個任務請求的話,你可以選擇這個策略。
    ThreadPoolExecutor.DiscardPolicy:不處理新任務,直接丟棄掉。
    ThreadPoolExecutor.DiscardOldestPolicy: 此策略將丟棄最早的未處理的任務請求。
    舉個例子: Spring 通過 ThreadPoolTaskExecutor 或者我們直接通過 ThreadPoolExecutor 的構造函數創建線程池的時候,當我們不指定 RejectedExecutionHandler 飽和策略的話來配置線程池的時候默認使用的是 ThreadPoolExecutor.AbortPolicy。在默認情況下,ThreadPoolExecutor 將拋出 RejectedExecutionException 來拒絕新來的任務 ,這代表你將丟失對這個任務的處理。 對于可伸縮的應用程序,建議使用 ThreadPoolExecutor.CallerRunsPolicy。當最大池被填滿時,此策略為我們提供可伸縮隊列。(這個直接查看 ThreadPoolExecutor 的構造函數源碼就可以看出,比較簡單的原因,這里就不貼代碼了)

    一個簡單的線程池Demo:Runnable+ThreadPoolExecutor
    線程池實現原理

    為了讓大家更清楚上面的面試題中的一些概念,我寫了一個簡單的線程池 Demo。

    首先創建一個?Runnable?接口的實現類(當然也可以是?Callable?接口,我們上面也說了兩者的區別。)

    import java.util.Date;/*** 這是一個簡單的Runnable類,需要大約5秒鐘來執行其任務。*/ public class MyRunnable implements Runnable {private String command;public MyRunnable(String s) {this.command = s;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " Start. Time = " + new Date());processCommand();System.out.println(Thread.currentThread().getName() + " End. Time = " + new Date());}private void processCommand() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic String toString() {return this.command;} }

    ?編寫測試程序,我們這里以阿里巴巴推薦的使用?ThreadPoolExecutor?構造函數自定義參數的方式來創建線程池。

    import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;public class ThreadPoolExecutorDemo {private static final int CORE_POOL_SIZE = 5;private static final int MAX_POOL_SIZE = 10;private static final int QUEUE_CAPACITY = 100;private static final Long KEEP_ALIVE_TIME = 1L;public static void main(String[] args) {//使用阿里巴巴推薦的創建線程池的方式//通過ThreadPoolExecutor構造函數自定義參數創建ThreadPoolExecutor executor = new ThreadPoolExecutor(CORE_POOL_SIZE,MAX_POOL_SIZE,KEEP_ALIVE_TIME,TimeUnit.SECONDS,new ArrayBlockingQueue<>(QUEUE_CAPACITY),new ThreadPoolExecutor.CallerRunsPolicy());for (int i = 0; i < 10; i++) {//創建WorkerThread對象(WorkerThread類實現了Runnable 接口)Runnable worker = new MyRunnable("" + i);//執行Runnableexecutor.execute(worker);}//終止線程池executor.shutdown();while (!executor.isTerminated()) {}System.out.println("Finished all threads");} }

    可以看到我們上面的代碼指定了:

  • corePoolSize: 核心線程數為 5。
  • maximumPoolSize :最大線程數 10
  • keepAliveTime : 等待時間為 1L。
  • unit: 等待時間的單位為 TimeUnit.SECONDS。
  • workQueue:任務隊列為 ArrayBlockingQueue,并且容量為 100;
  • handler:飽和策略為 CallerRunsPolicy。
  • Output:
    ?

    pool-1-thread-2 Start. Time = Tue Nov 12 20:59:44 CST 2019 pool-1-thread-5 Start. Time = Tue Nov 12 20:59:44 CST 2019 pool-1-thread-4 Start. Time = Tue Nov 12 20:59:44 CST 2019 pool-1-thread-1 Start. Time = Tue Nov 12 20:59:44 CST 2019 pool-1-thread-3 Start. Time = Tue Nov 12 20:59:44 CST 2019 pool-1-thread-5 End. Time = Tue Nov 12 20:59:49 CST 2019 pool-1-thread-3 End. Time = Tue Nov 12 20:59:49 CST 2019 pool-1-thread-2 End. Time = Tue Nov 12 20:59:49 CST 2019 pool-1-thread-4 End. Time = Tue Nov 12 20:59:49 CST 2019 pool-1-thread-1 End. Time = Tue Nov 12 20:59:49 CST 2019 pool-1-thread-2 Start. Time = Tue Nov 12 20:59:49 CST 2019 pool-1-thread-1 Start. Time = Tue Nov 12 20:59:49 CST 2019 pool-1-thread-4 Start. Time = Tue Nov 12 20:59:49 CST 2019 pool-1-thread-3 Start. Time = Tue Nov 12 20:59:49 CST 2019 pool-1-thread-5 Start. Time = Tue Nov 12 20:59:49 CST 2019 pool-1-thread-2 End. Time = Tue Nov 12 20:59:54 CST 2019 pool-1-thread-3 End. Time = Tue Nov 12 20:59:54 CST 2019 pool-1-thread-4 End. Time = Tue Nov 12 20:59:54 CST 2019 pool-1-thread-5 End. Time = Tue Nov 12 20:59:54 CST 2019 pool-1-thread-1 End. Time = Tue Nov 12 20:59:54 CST 2019

    線程池之ScheduledThreadPoolExecutor詳解
    FutureTask詳解
    原子操作類
    什么是原子操作?在 Java Concurrency API 中有哪些原子類(atomic classes)?
    原子操作(atomic operation)意為”不可被中斷的一個或一系列操作” 。

    處理器使用基于對緩存加鎖或總線加鎖的方式來實現多處理器之間的原子操作。在 Java 中可以通過鎖和循環 CAS 的方式來實現原子操作。 CAS 操作——Compare & Set,或是 Compare & Swap,現在幾乎所有的 CPU 指令都支持 CAS 的原子操作。

    原子操作是指一個不受其他操作影響的操作任務單元。原子操作是在多線程環境下避免數據不一致必須的手段。

    int++并不是一個原子操作,所以當一個線程讀取它的值并加 1 時,另外一個線程有可能會讀到之前的值,這就會引發錯誤。

    為了解決這個問題,必須保證增加操作是原子的,在 JDK1.5 之前我們可以使用同步技術來做到這一點。到 JDK1.5,java.util.concurrent.atomic 包提供了 int 和long 類型的原子包裝類,它們可以自動的保證對于他們的操作是原子的并且不需要使用同步。

    java.util.concurrent 這個包里面提供了一組原子類。其基本的特性就是在多線程環境下,當有多個線程同時執行這些類的實例包含的方法時,具有排他性,即當某個線程進入方法,執行其中的指令時,不會被其他線程打斷,而別的線程就像自旋鎖一樣,一直等到該方法執行完成,才由 JVM 從等待隊列中選擇另一個線程進入,這只是一種邏輯上的理解。

    原子類:AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference

    原子數組:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray

    原子屬性更新器:AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater

    解決 ABA 問題的原子類:AtomicMarkableReference(通過引入一個 boolean來反映中間有沒有變過),AtomicStampedReference(通過引入一個 int 來累加來反映中間有沒有變過)

    說一下 atomic 的原理?
    Atomic包中的類基本的特性就是在多線程環境下,當有多個線程同時對單個(包括基本類型及引用類型)變量進行操作時,具有排他性,即當多個線程同時對該變量的值進行更新時,僅有一個線程能成功,而未成功的線程可以向自旋鎖一樣,繼續嘗試,一直等到執行成功。

    AtomicInteger 類的部分源碼:
    ?

    // setup to use Unsafe.compareAndSwapInt for updates(更新操作時提供“比較并替換”的作用) private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long valueOffset;static {try {valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); } }private volatile int value;

    AtomicInteger 類主要利用 CAS (compare and swap) + volatile 和 native 方法來保證原子操作,從而避免 synchronized 的高開銷,執行效率大為提升。

    CAS的原理是拿期望的值和原本的一個值作比較,如果相同則更新成新的值。UnSafe 類的 objectFieldOffset() 方法是一個本地方法,這個方法是用來拿到“原來的值”的內存地址,返回值是 valueOffset。另外 value 是一個volatile變量,在內存中可見,因此 JVM 可以保證任何時刻任何線程總能拿到該變量的最新值。

    并發工具
    并發工具之CountDownLatch與CyclicBarrier
    在 Java 中 CycliBarriar 和 CountdownLatch 有什么區別?
    CountDownLatch與CyclicBarrier都是用于控制并發的工具類,都可以理解成維護的就是一個計數器,但是這兩者還是各有不同側重點的:

    CountDownLatch一般用于某個線程A等待若干個其他線程執行完任務之后,它才執行;而CyclicBarrier一般用于一組線程互相等待至某個狀態,然后這一組線程再同時執行;CountDownLatch強調一個線程等多個線程完成某件事情。CyclicBarrier是多個線程互等,等大家都完成,再攜手共進。

    調用CountDownLatch的countDown方法后,當前線程并不會阻塞,會繼續往下執行;而調用CyclicBarrier的await方法,會阻塞當前線程,直到CyclicBarrier指定的線程全部都到達了指定點的時候,才能繼續往下執行;

    CountDownLatch方法比較少,操作比較簡單,而CyclicBarrier提供的方法更多,比如能夠通過getNumberWaiting(),isBroken()這些方法獲取當前多個線程的狀態,并且CyclicBarrier的構造方法可以傳入barrierAction,指定當所有線程都到達時執行的業務功能;

    CountDownLatch是不能復用的,而CyclicLatch是可以復用的。

    并發工具之Semaphore與Exchanger
    Semaphore 有什么作用
    Semaphore 就是一個信號量,它的作用是限制某段代碼塊的并發數。Semaphore有一個構造函數,可以傳入一個 int 型整數 n,表示某段代碼最多只有 n 個線程可以訪問,如果超出了 n,那么請等待,等到某個線程執行完畢這段代碼塊,下一個線程再進入。由此可以看出如果 Semaphore 構造函數中傳入的 int 型整數 n=1,相當于變成了一個 synchronized 了。

    Semaphore(信號量)-允許多個線程同時訪問: synchronized 和 ReentrantLock 都是一次只允許一個線程訪問某個資源,Semaphore(信號量)可以指定多個線程同時訪問某個資源。

    什么是線程間交換數據的工具Exchanger
    Exchanger是一個用于線程間協作的工具類,用于兩個線程間交換數據。它提供了一個交換的同步點,在這個同步點兩個線程能夠交換數據。交換數據是通過exchange方法來實現的,如果一個線程先執行exchange方法,那么它會同步等待另一個線程也執行exchange方法,這個時候兩個線程就都達到了同步點,兩個線程就可以交換數據。

    常用的并發工具類有哪些?
    Semaphore(信號量)-允許多個線程同時訪問: synchronized 和 ReentrantLock 都是一次只允許一個線程訪問某個資源,Semaphore(信號量)可以指定多個線程同時訪問某個資源。
    CountDownLatch(倒計時器): CountDownLatch是一個同步工具類,用來協調多個線程之間的同步。這個工具通常用來控制線程等待,它可以讓某一個線程等待直到倒計時結束,再開始執行。
    CyclicBarrier(循環柵欄): CyclicBarrier 和 CountDownLatch 非常類似,它也可以實現線程間的技術等待,但是它的功能比 CountDownLatch 更加復雜和強大。主要應用場景和 CountDownLatch 類似。CyclicBarrier 的字面意思是可循環使用(Cyclic)的屏障(Barrier)。它要做的事情是,讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最后一個線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續干活。CyclicBarrier默認的構造方法是 CyclicBarrier(int parties),其參數表示屏障攔截的線程數量,每個線程調用await()方法告訴 CyclicBarrier 我已經到達了屏障,然后當前線程被阻塞。

    總結

    以上是生活随笔為你收集整理的并发编程面试题(2021最新版)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    欧美日韩色另类综合 | 国产精品美女久久久 | 国产乱子伦视频在线播放 | 丰满妇女强制高潮18xxxx | 中文字幕无码视频专区 | 国产精品无码一区二区桃花视频 | 日日摸天天摸爽爽狠狠97 | 性欧美牲交xxxxx视频 | 国产一区二区三区精品视频 | 无码一区二区三区在线 | 精品亚洲韩国一区二区三区 | 天堂久久天堂av色综合 | 伊人久久大香线蕉av一区二区 | 久久婷婷五月综合色国产香蕉 | 亚洲熟妇自偷自拍另类 | 久久久久成人精品免费播放动漫 | 国产精品久久久久久久9999 | 曰韩无码二三区中文字幕 | 一个人看的视频www在线 | 国产精品无码成人午夜电影 | 中文无码成人免费视频在线观看 | 少妇厨房愉情理9仑片视频 | 99精品国产综合久久久久五月天 | 国内老熟妇对白xxxxhd | a片免费视频在线观看 | 5858s亚洲色大成网站www | 国产猛烈高潮尖叫视频免费 | 精品人妻中文字幕有码在线 | 久久亚洲日韩精品一区二区三区 | 无套内射视频囯产 | 天天摸天天碰天天添 | 久久久精品欧美一区二区免费 | 综合激情五月综合激情五月激情1 | 小泽玛莉亚一区二区视频在线 | 啦啦啦www在线观看免费视频 | 秋霞成人午夜鲁丝一区二区三区 | 精品久久久久香蕉网 | 中文字幕人成乱码熟女app | 人妻插b视频一区二区三区 | 欧美成人午夜精品久久久 | 97久久精品无码一区二区 | 国产 浪潮av性色四虎 | 图片区 小说区 区 亚洲五月 | 中文字幕无码免费久久9一区9 | а√天堂www在线天堂小说 | 欧美性生交活xxxxxdddd | 国产亚洲人成在线播放 | 久久久中文久久久无码 | 色婷婷香蕉在线一区二区 | 99久久人妻精品免费一区 | 久久久中文久久久无码 | 一区二区三区高清视频一 | 久久久久免费看成人影片 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 久久久国产一区二区三区 | 欧美日本免费一区二区三区 | 国产麻豆精品精东影业av网站 | 欧美日本免费一区二区三区 | 人妻aⅴ无码一区二区三区 | 香蕉久久久久久av成人 | 欧美老人巨大xxxx做受 | 成人欧美一区二区三区黑人免费 | 亚洲精品一区二区三区在线 | 狂野欧美性猛交免费视频 | 久久久精品国产sm最大网站 | 夜精品a片一区二区三区无码白浆 | 国产农村乱对白刺激视频 | 一个人看的视频www在线 | 蜜臀aⅴ国产精品久久久国产老师 | 成年美女黄网站色大免费全看 | 任你躁国产自任一区二区三区 | 亚洲精品成a人在线观看 | 成在人线av无码免费 | 国产精品福利视频导航 | 国产精品久久久久9999小说 | 欧洲美熟女乱又伦 | 午夜无码人妻av大片色欲 | 一本久久伊人热热精品中文字幕 | 精品成在人线av无码免费看 | 日本欧美一区二区三区乱码 | 内射老妇bbwx0c0ck | 久久久中文字幕日本无吗 | 激情内射亚州一区二区三区爱妻 | 激情爆乳一区二区三区 | 爱做久久久久久 | 伊在人天堂亚洲香蕉精品区 | 4hu四虎永久在线观看 | 国产av无码专区亚洲awww | 国内精品九九久久久精品 | 任你躁在线精品免费 | 欧美国产日韩久久mv | 成年美女黄网站色大免费全看 | 亚洲精品国产精品乱码不卡 | 无码国模国产在线观看 | 精品无码国产自产拍在线观看蜜 | 久久久久国色av免费观看性色 | a在线观看免费网站大全 | 国产精品久久久久久久9999 | а√天堂www在线天堂小说 | aⅴ在线视频男人的天堂 | 国产艳妇av在线观看果冻传媒 | 亚洲aⅴ无码成人网站国产app | 日本一区二区三区免费播放 | 国产尤物精品视频 | 成人免费视频在线观看 | 日韩视频 中文字幕 视频一区 | √8天堂资源地址中文在线 | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美老熟妇乱xxxxx | 日产国产精品亚洲系列 | 久久久久久av无码免费看大片 | 亚洲男人av天堂午夜在 | 婷婷五月综合缴情在线视频 | www一区二区www免费 | 国产一区二区三区影院 | 香港三级日本三级妇三级 | 日日碰狠狠躁久久躁蜜桃 | 99久久精品午夜一区二区 | 九九综合va免费看 | 中文字幕人妻无码一夲道 | 99精品国产综合久久久久五月天 | 亚洲欧美日韩综合久久久 | 丝袜 中出 制服 人妻 美腿 | 成熟妇人a片免费看网站 | 在线看片无码永久免费视频 | 7777奇米四色成人眼影 | 无码免费一区二区三区 | 国产成人无码av在线影院 | 欧美喷潮久久久xxxxx | 欧美老人巨大xxxx做受 | 亚洲精品无码人妻无码 | 亚洲第一无码av无码专区 | 国产在线无码精品电影网 | 一本久久伊人热热精品中文字幕 | 国产乱人伦av在线无码 | 国产精品久久久久久亚洲影视内衣 | 国产精品手机免费 | 国精产品一区二区三区 | 一本久道高清无码视频 | 综合人妻久久一区二区精品 | 国产成人精品久久亚洲高清不卡 | 亚洲人成人无码网www国产 | √8天堂资源地址中文在线 | 无码国模国产在线观看 | 久久久久久久久蜜桃 | 又大又硬又爽免费视频 | 亚洲精品久久久久中文第一幕 | 久久精品中文闷骚内射 | 荡女精品导航 | 亚洲国产精品无码一区二区三区 | 无码福利日韩神码福利片 | 熟女体下毛毛黑森林 | 中文字幕日韩精品一区二区三区 | 亚洲国产精品无码久久久久高潮 | 一本久久a久久精品亚洲 | 内射欧美老妇wbb | 玩弄少妇高潮ⅹxxxyw | 中文字幕中文有码在线 | 亚洲欧美日韩成人高清在线一区 | 中文字幕无码日韩专区 | 国产在线无码精品电影网 | 无遮无挡爽爽免费视频 | 沈阳熟女露脸对白视频 | 大肉大捧一进一出视频出来呀 | 秋霞成人午夜鲁丝一区二区三区 | 给我免费的视频在线观看 | 欧美freesex黑人又粗又大 | 欧美猛少妇色xxxxx | 婷婷五月综合缴情在线视频 | 少妇高潮喷潮久久久影院 | 丰满少妇人妻久久久久久 | 国产尤物精品视频 | 成人精品一区二区三区中文字幕 | 牲欲强的熟妇农村老妇女 | 日本丰满护士爆乳xxxx | 亚洲成av人片天堂网无码】 | 久久精品中文字幕大胸 | 国产黑色丝袜在线播放 | 中文字幕久久久久人妻 | 免费视频欧美无人区码 | 乱码午夜-极国产极内射 | 国产成人无码av片在线观看不卡 | 97久久国产亚洲精品超碰热 | 欧美三级不卡在线观看 | 内射爽无广熟女亚洲 | 日本肉体xxxx裸交 | 熟妇激情内射com | 国产成人精品一区二区在线小狼 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲国产精品成人久久蜜臀 | 国产真实乱对白精彩久久 | 97夜夜澡人人爽人人喊中国片 | 欧美高清在线精品一区 | 国产精品18久久久久久麻辣 | 久久国产36精品色熟妇 | 久久久国产精品无码免费专区 | 97夜夜澡人人双人人人喊 | 丁香花在线影院观看在线播放 | 无码国内精品人妻少妇 | 天天拍夜夜添久久精品大 | 人妻少妇精品无码专区二区 | 丰满肥臀大屁股熟妇激情视频 | 高潮毛片无遮挡高清免费视频 | 欧美真人作爱免费视频 | 丰满人妻一区二区三区免费视频 | 久久久久99精品成人片 | 18精品久久久无码午夜福利 | 中文字幕无码人妻少妇免费 | 亚洲一区二区三区偷拍女厕 | 久久久久se色偷偷亚洲精品av | 在线观看免费人成视频 | 高清国产亚洲精品自在久久 | 国产在热线精品视频 | 97久久国产亚洲精品超碰热 | 野狼第一精品社区 | 久久精品中文字幕一区 | 女人色极品影院 | 国产亚洲欧美在线专区 | 日本一本二本三区免费 | 国产精品久免费的黄网站 | 少妇性俱乐部纵欲狂欢电影 | 欧美第一黄网免费网站 | 午夜精品久久久久久久 | 久久99热只有频精品8 | 免费看男女做好爽好硬视频 | 亚洲a无码综合a国产av中文 | 久久久国产精品无码免费专区 | 日本www一道久久久免费榴莲 | 亚洲成av人片在线观看无码不卡 | 粗大的内捧猛烈进出视频 | 真人与拘做受免费视频一 | 国产亚洲精品久久久ai换 | 波多野42部无码喷潮在线 | 四十如虎的丰满熟妇啪啪 | 亚洲の无码国产の无码步美 | 亚洲国产日韩a在线播放 | 国产黄在线观看免费观看不卡 | 久久精品99久久香蕉国产色戒 | √天堂中文官网8在线 | 亚洲一区二区三区国产精华液 | 亚洲中文字幕成人无码 | 中文无码伦av中文字幕 | 牲欲强的熟妇农村老妇女视频 | 国产精品无码一区二区桃花视频 | 扒开双腿疯狂进出爽爽爽视频 | 国内精品一区二区三区不卡 | 亚洲精品国产品国语在线观看 | 久久熟妇人妻午夜寂寞影院 | 午夜福利一区二区三区在线观看 | av无码不卡在线观看免费 | 99精品无人区乱码1区2区3区 | 丰满人妻被黑人猛烈进入 | 熟女俱乐部五十路六十路av | 亚洲人成无码网www | 欧美日韩一区二区三区自拍 | 国产精品第一国产精品 | 牛和人交xxxx欧美 | 日本护士毛茸茸高潮 | 丰满人妻一区二区三区免费视频 | 性色av无码免费一区二区三区 | 久精品国产欧美亚洲色aⅴ大片 | 免费网站看v片在线18禁无码 | 日本欧美一区二区三区乱码 | 无遮挡国产高潮视频免费观看 | 青青久在线视频免费观看 | 精品国产av色一区二区深夜久久 | 国产精品内射视频免费 | 成人综合网亚洲伊人 | 天天躁夜夜躁狠狠是什么心态 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国模大胆一区二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 色五月五月丁香亚洲综合网 | 日韩av无码一区二区三区不卡 | 国产精华av午夜在线观看 | 九九综合va免费看 | 国产人妻大战黑人第1集 | 日本熟妇人妻xxxxx人hd | 精品国产一区二区三区四区 | 99久久99久久免费精品蜜桃 | 免费无码的av片在线观看 | 男女超爽视频免费播放 | 草草网站影院白丝内射 | 亚洲国产欧美日韩精品一区二区三区 | 蜜臀av无码人妻精品 | 国产成人人人97超碰超爽8 | 国产一区二区三区精品视频 | 国产精品99久久精品爆乳 | 2020最新国产自产精品 | 女人被男人躁得好爽免费视频 | 亚洲综合另类小说色区 | 亚洲色成人中文字幕网站 | 无码人妻丰满熟妇区毛片18 | 日本大乳高潮视频在线观看 | 亚洲天堂2017无码中文 | 国产精华av午夜在线观看 | 国产精品无码久久av | 亚洲 欧美 激情 小说 另类 | 黑人粗大猛烈进出高潮视频 | 美女毛片一区二区三区四区 | 午夜性刺激在线视频免费 | 日日鲁鲁鲁夜夜爽爽狠狠 | 性啪啪chinese东北女人 | 国产香蕉97碰碰久久人人 | 一二三四在线观看免费视频 | 最近中文2019字幕第二页 | 在线 国产 欧美 亚洲 天堂 | 樱花草在线社区www | 中文精品无码中文字幕无码专区 | 国产成人无码av一区二区 | 黑人玩弄人妻中文在线 | 精品夜夜澡人妻无码av蜜桃 | 狂野欧美性猛交免费视频 | 捆绑白丝粉色jk震动捧喷白浆 | 国产精品久久久 | 日日橹狠狠爱欧美视频 | 狠狠色丁香久久婷婷综合五月 | 色婷婷久久一区二区三区麻豆 | 1000部啪啪未满十八勿入下载 | 亚洲の无码国产の无码步美 | 国内精品久久久久久中文字幕 | 亚洲欧美国产精品专区久久 | 四十如虎的丰满熟妇啪啪 | 国内精品九九久久久精品 | 高潮毛片无遮挡高清免费 | 人妻有码中文字幕在线 | 国产av无码专区亚洲a∨毛片 | 国产在线一区二区三区四区五区 | 欧美 日韩 人妻 高清 中文 | 99久久精品午夜一区二区 | 麻花豆传媒剧国产免费mv在线 | 性开放的女人aaa片 | 欧洲熟妇精品视频 | www一区二区www免费 | 国产精品资源一区二区 | 人妻互换免费中文字幕 | 国产性生交xxxxx无码 | 人人妻人人澡人人爽欧美精品 | 亚洲中文字幕在线观看 | 久久久久亚洲精品男人的天堂 | 国内精品人妻无码久久久影院蜜桃 | 宝宝好涨水快流出来免费视频 | 樱花草在线播放免费中文 | 亚洲精品www久久久 | 久久99热只有频精品8 | 亚洲日本在线电影 | 伊人久久大香线蕉午夜 | 国产精品自产拍在线观看 | √天堂中文官网8在线 | 日本一本二本三区免费 | 久久午夜无码鲁丝片午夜精品 | 久久精品国产99精品亚洲 | 亚洲日韩av一区二区三区中文 | 丰满少妇弄高潮了www | 日韩精品乱码av一区二区 | 亚洲欧美中文字幕5发布 | 国产又爽又猛又粗的视频a片 | 久久五月精品中文字幕 | 一本色道久久综合狠狠躁 | 亚洲中文字幕乱码av波多ji | 国产97人人超碰caoprom | 中文无码成人免费视频在线观看 | 乱人伦人妻中文字幕无码久久网 | 丰满岳乱妇在线观看中字无码 | 美女毛片一区二区三区四区 | 特大黑人娇小亚洲女 | 国产精品久久国产三级国 | 欧美激情内射喷水高潮 | 久激情内射婷内射蜜桃人妖 | 欧美亚洲国产一区二区三区 | 精品少妇爆乳无码av无码专区 | 亚洲 欧美 激情 小说 另类 | 红桃av一区二区三区在线无码av | 国产三级久久久精品麻豆三级 | 西西人体www44rt大胆高清 | 欧美激情一区二区三区成人 | 窝窝午夜理论片影院 | 亚洲а∨天堂久久精品2021 | 熟女体下毛毛黑森林 | 欧美一区二区三区 | 国产 浪潮av性色四虎 | 国产成人无码区免费内射一片色欲 | 成年美女黄网站色大免费视频 | 窝窝午夜理论片影院 | 无遮挡啪啪摇乳动态图 | 日本乱偷人妻中文字幕 | 国产精品美女久久久网av | 国产精品国产三级国产专播 | 午夜精品一区二区三区的区别 | 欧美兽交xxxx×视频 | 丰满人妻精品国产99aⅴ | 又黄又爽又色的视频 | 中文字幕中文有码在线 | 野狼第一精品社区 | 国产精品国产自线拍免费软件 | а√资源新版在线天堂 | 小sao货水好多真紧h无码视频 | 一本久久伊人热热精品中文字幕 | 天天躁夜夜躁狠狠是什么心态 | 国产在线无码精品电影网 | av无码久久久久不卡免费网站 | 午夜熟女插插xx免费视频 | 性生交大片免费看l | 中文字幕乱码人妻无码久久 | a在线亚洲男人的天堂 | 天海翼激烈高潮到腰振不止 | 国产两女互慰高潮视频在线观看 | 精品国产成人一区二区三区 | 久久天天躁狠狠躁夜夜免费观看 | 中文亚洲成a人片在线观看 | 精品无码国产自产拍在线观看蜜 | 暴力强奷在线播放无码 | 免费乱码人妻系列无码专区 | 丝袜美腿亚洲一区二区 | 国产69精品久久久久app下载 | 一本久道久久综合婷婷五月 | 成熟人妻av无码专区 | 亚洲娇小与黑人巨大交 | 性欧美疯狂xxxxbbbb | 成人片黄网站色大片免费观看 | 国产成人人人97超碰超爽8 | 亚洲色欲久久久综合网东京热 | 精品人妻中文字幕有码在线 | 亚洲国产精华液网站w | 国产人妻精品午夜福利免费 | 亚洲成av人片在线观看无码不卡 | 国产精品久久国产精品99 | 亚洲熟妇色xxxxx亚洲 | 伊人色综合久久天天小片 | 欧美 亚洲 国产 另类 | a片免费视频在线观看 | yw尤物av无码国产在线观看 | 性欧美大战久久久久久久 | 亚洲无人区午夜福利码高清完整版 | 国产成人无码av片在线观看不卡 | 国产色在线 | 国产 | 台湾无码一区二区 | 成人三级无码视频在线观看 | 亚无码乱人伦一区二区 | 国产精品久久久久7777 | 极品尤物被啪到呻吟喷水 | 亚洲午夜福利在线观看 | 免费观看的无遮挡av | 性做久久久久久久免费看 | 欧美国产亚洲日韩在线二区 | 男女猛烈xx00免费视频试看 | 久久精品国产99久久6动漫 | 内射后入在线观看一区 | 日韩视频 中文字幕 视频一区 | 国产成人一区二区三区在线观看 | 97精品国产97久久久久久免费 | 国内老熟妇对白xxxxhd | 男人扒开女人内裤强吻桶进去 | 亚洲国产成人a精品不卡在线 | 亚洲日韩精品欧美一区二区 | 在线视频网站www色 | 丰满人妻一区二区三区免费视频 | 成人精品视频一区二区 | 欧美激情综合亚洲一二区 | 国产sm调教视频在线观看 | 成熟妇人a片免费看网站 | 老头边吃奶边弄进去呻吟 | 天堂一区人妻无码 | 亚洲午夜久久久影院 | 婷婷丁香六月激情综合啪 | 人妻少妇被猛烈进入中文字幕 | 久久综合九色综合97网 | 免费无码午夜福利片69 | a片免费视频在线观看 | 欧洲精品码一区二区三区免费看 | 黑人大群体交免费视频 | 精品一二三区久久aaa片 | 麻豆精品国产精华精华液好用吗 | 熟妇人妻无乱码中文字幕 | 乱人伦人妻中文字幕无码久久网 | 国产午夜精品一区二区三区嫩草 | 亚洲爆乳大丰满无码专区 | 亚洲天堂2017无码中文 | 中文字幕色婷婷在线视频 | 国产成人无码a区在线观看视频app | 在线欧美精品一区二区三区 | 亚洲中文字幕成人无码 | 免费无码的av片在线观看 | 精品无人区无码乱码毛片国产 | 国产明星裸体无码xxxx视频 | 熟女少妇人妻中文字幕 | 久激情内射婷内射蜜桃人妖 | 性色av无码免费一区二区三区 | 国产亚洲精品久久久久久大师 | 欧美三级不卡在线观看 | 国产精品欧美成人 | 成人免费视频视频在线观看 免费 | 日韩精品一区二区av在线 | 午夜性刺激在线视频免费 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 波多野结衣av一区二区全免费观看 | 国产在线一区二区三区四区五区 | 精品久久8x国产免费观看 | 国产精品毛多多水多 | 欧美性生交活xxxxxdddd | 我要看www免费看插插视频 | 国产精品va在线播放 | 色情久久久av熟女人妻网站 | 久久精品中文闷骚内射 | 亚洲精品无码国产 | 国产成人无码av片在线观看不卡 | 国产成人无码a区在线观看视频app | a在线亚洲男人的天堂 | 无码帝国www无码专区色综合 | 四虎影视成人永久免费观看视频 | 国产激情无码一区二区app | 四虎国产精品免费久久 | 亚洲欧美日韩国产精品一区二区 | 99精品国产综合久久久久五月天 | 国产午夜手机精彩视频 | 亚洲色大成网站www国产 | 天堂а√在线中文在线 | 美女张开腿让人桶 | 精品夜夜澡人妻无码av蜜桃 | 亚洲国精产品一二二线 | 小泽玛莉亚一区二区视频在线 | 久久无码中文字幕免费影院蜜桃 | 亚洲狠狠色丁香婷婷综合 | 欧美freesex黑人又粗又大 | 少妇激情av一区二区 | 久久婷婷五月综合色国产香蕉 | 久久亚洲日韩精品一区二区三区 | 久久久久久国产精品无码下载 | 永久免费观看国产裸体美女 | 未满成年国产在线观看 | 少妇人妻大乳在线视频 | 亚洲の无码国产の无码步美 | 沈阳熟女露脸对白视频 | 亚洲色成人中文字幕网站 | 中文字幕无码乱人伦 | 欧美成人午夜精品久久久 | 高清不卡一区二区三区 | 国产精品自产拍在线观看 | 日韩人妻系列无码专区 | 色窝窝无码一区二区三区色欲 | 久久人人爽人人爽人人片ⅴ | 内射老妇bbwx0c0ck | 真人与拘做受免费视频一 | 51国偷自产一区二区三区 | 亚洲а∨天堂久久精品2021 | 久久综合色之久久综合 | 国产人妻精品一区二区三区不卡 | 日韩人妻系列无码专区 | 欧美freesex黑人又粗又大 | 又粗又大又硬毛片免费看 | 大胆欧美熟妇xx | 精品国产aⅴ无码一区二区 | 1000部啪啪未满十八勿入下载 | 国产疯狂伦交大片 | 日产国产精品亚洲系列 | 亚洲国产精品一区二区美利坚 | 精品无码国产自产拍在线观看蜜 | 啦啦啦www在线观看免费视频 | 亚洲综合在线一区二区三区 | 欧美精品无码一区二区三区 | 日韩av无码中文无码电影 | 精品久久综合1区2区3区激情 | 又粗又大又硬又长又爽 | 色噜噜亚洲男人的天堂 | 成 人 免费观看网站 | 天天拍夜夜添久久精品大 | 国产三级精品三级男人的天堂 | 18精品久久久无码午夜福利 | 男女下面进入的视频免费午夜 | 国产精品久久久久9999小说 | 国内丰满熟女出轨videos | 国产福利视频一区二区 | 久久国语露脸国产精品电影 | 一本久道久久综合婷婷五月 | 日韩av无码一区二区三区 | 人人爽人人爽人人片av亚洲 | 欧美性生交xxxxx久久久 | 日韩亚洲欧美中文高清在线 | 国产精品va在线播放 | 中文字幕无码av波多野吉衣 | 欧美 丝袜 自拍 制服 另类 | 又大又黄又粗又爽的免费视频 | 欧美人与物videos另类 | 狠狠色噜噜狠狠狠7777奇米 | 日产精品高潮呻吟av久久 | 国产成人一区二区三区别 | 东京热男人av天堂 | 55夜色66夜色国产精品视频 | 久久综合狠狠综合久久综合88 | 国产精品视频免费播放 | 国产成人久久精品流白浆 | 精品久久久中文字幕人妻 | 精品国产一区二区三区av 性色 | 国内综合精品午夜久久资源 | 青青久在线视频免费观看 | 天海翼激烈高潮到腰振不止 | 久久精品女人的天堂av | 亚洲精品国产精品乱码不卡 | 熟女俱乐部五十路六十路av | 夜夜影院未满十八勿进 | 精品成在人线av无码免费看 | 亚洲中文字幕无码中文字在线 | 日韩欧美群交p片內射中文 | 国产av剧情md精品麻豆 | 麻豆蜜桃av蜜臀av色欲av | 乱人伦中文视频在线观看 | 国产人妖乱国产精品人妖 | 亚洲欧美精品伊人久久 | 色综合久久久久综合一本到桃花网 | 4hu四虎永久在线观看 | 无码一区二区三区在线 | 免费无码av一区二区 | 国产日产欧产精品精品app | 欧美变态另类xxxx | 日本又色又爽又黄的a片18禁 | √8天堂资源地址中文在线 | 日本va欧美va欧美va精品 | 国产欧美精品一区二区三区 | 久久久精品456亚洲影院 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 夜夜影院未满十八勿进 | 波多野42部无码喷潮在线 | 国产午夜亚洲精品不卡下载 | 蜜桃臀无码内射一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 欧美xxxx黑人又粗又长 | 国产偷抇久久精品a片69 | 国产在线一区二区三区四区五区 | 久久精品国产一区二区三区 | 中文字幕av伊人av无码av | 四虎4hu永久免费 | 免费观看黄网站 | 荫蒂被男人添的好舒服爽免费视频 | 中文字幕久久久久人妻 | 欧美一区二区三区视频在线观看 | 国产无遮挡吃胸膜奶免费看 | 国产精品igao视频网 | 中文字幕+乱码+中文字幕一区 | 国产午夜亚洲精品不卡下载 | 97精品国产97久久久久久免费 | 亚洲一区二区三区四区 | 久久www免费人成人片 | 内射欧美老妇wbb | 无遮挡国产高潮视频免费观看 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲色无码一区二区三区 | 亚洲精品综合五月久久小说 | 麻豆国产人妻欲求不满谁演的 | 美女毛片一区二区三区四区 | 国产色精品久久人妻 | 日本又色又爽又黄的a片18禁 | 国产莉萝无码av在线播放 | 色综合久久久久综合一本到桃花网 | 无码人妻精品一区二区三区不卡 | 精品久久综合1区2区3区激情 | 四十如虎的丰满熟妇啪啪 | 欧美日本免费一区二区三区 | 激情爆乳一区二区三区 | 国产亚洲tv在线观看 | 国产香蕉尹人综合在线观看 | 国产av无码专区亚洲awww | 国产精品无码一区二区桃花视频 | 免费观看激色视频网站 | 久久亚洲a片com人成 | 国产在线aaa片一区二区99 | 麻豆精品国产精华精华液好用吗 | 秋霞成人午夜鲁丝一区二区三区 | 日本xxxx色视频在线观看免费 | 人人妻人人澡人人爽欧美精品 | 亚洲综合久久一区二区 | 亚洲男女内射在线播放 | 国产偷国产偷精品高清尤物 | 67194成是人免费无码 | 亚洲欧洲中文日韩av乱码 | 欧洲极品少妇 | 精品国产青草久久久久福利 | 网友自拍区视频精品 | 无码av免费一区二区三区试看 | 激情综合激情五月俺也去 | yw尤物av无码国产在线观看 | 国产真实伦对白全集 | 中文字幕乱妇无码av在线 | 国产乱码精品一品二品 | 国产亚洲精品久久久久久 | 鲁鲁鲁爽爽爽在线视频观看 | 娇妻被黑人粗大高潮白浆 | 又黄又爽又色的视频 | 免费视频欧美无人区码 | 国产97人人超碰caoprom | 亚洲成a人一区二区三区 | 久精品国产欧美亚洲色aⅴ大片 | 国产成人av免费观看 | 欧美国产日韩亚洲中文 | 久久久久人妻一区精品色欧美 | 国产极品美女高潮无套在线观看 | 欧美zoozzooz性欧美 | 国产凸凹视频一区二区 | 老熟女乱子伦 | 成人精品视频一区二区 | 亚洲国产精品久久人人爱 | 国产午夜福利100集发布 | 99精品国产综合久久久久五月天 | 久久婷婷五月综合色国产香蕉 | 亚洲欧美国产精品专区久久 | 无套内射视频囯产 | 国产深夜福利视频在线 | 天堂一区人妻无码 | 特大黑人娇小亚洲女 | 理论片87福利理论电影 | 久久久久久国产精品无码下载 | 男人的天堂av网站 | 奇米影视7777久久精品人人爽 | 欧美日韩一区二区免费视频 | 国产精品无码一区二区三区不卡 | 精品无码一区二区三区的天堂 | 67194成是人免费无码 | 国产无套内射久久久国产 | 波多野结衣aⅴ在线 | 欧美zoozzooz性欧美 | 少妇无套内谢久久久久 | 女人和拘做爰正片视频 | 国产精品久久久久久久9999 | 在线看片无码永久免费视频 | 国产乱人无码伦av在线a | 欧美性生交活xxxxxdddd | 野狼第一精品社区 | 国产女主播喷水视频在线观看 | 久久久无码中文字幕久... | 亚洲热妇无码av在线播放 | 国产黑色丝袜在线播放 | 999久久久国产精品消防器材 | 俺去俺来也www色官网 | 成年女人永久免费看片 | 国产xxx69麻豆国语对白 | 亚洲中文字幕va福利 | 日本熟妇大屁股人妻 | 精品 日韩 国产 欧美 视频 | 日本精品高清一区二区 | 中文字幕无线码 | 亚洲综合色区中文字幕 | a在线观看免费网站大全 | 亚洲国产一区二区三区在线观看 | 日韩无码专区 | 人妻插b视频一区二区三区 | 人妻互换免费中文字幕 | 久久久久99精品国产片 | 理论片87福利理论电影 | 正在播放东北夫妻内射 | 亚洲综合伊人久久大杳蕉 | 亚洲国产一区二区三区在线观看 | 色综合久久久无码网中文 | 学生妹亚洲一区二区 | 国产精品鲁鲁鲁 | 好屌草这里只有精品 | 国产成人精品优优av | 日韩精品无码免费一区二区三区 | 18禁黄网站男男禁片免费观看 | 亚洲欧美中文字幕5发布 | 久久久国产精品无码免费专区 | 亚洲熟妇色xxxxx欧美老妇y | 欧美刺激性大交 | 亚洲欧美日韩综合久久久 | 久久久久免费看成人影片 | 国产精品人妻一区二区三区四 | 丰满人妻翻云覆雨呻吟视频 | 麻豆精品国产精华精华液好用吗 | aⅴ在线视频男人的天堂 | 国产成人无码av一区二区 | 日韩精品久久久肉伦网站 | 中文字幕无码免费久久9一区9 | 九月婷婷人人澡人人添人人爽 | 国产精品无码一区二区桃花视频 | 激情亚洲一区国产精品 | 高清无码午夜福利视频 | 国内精品久久毛片一区二区 | 欧美日韩在线亚洲综合国产人 | 帮老师解开蕾丝奶罩吸乳网站 | 撕开奶罩揉吮奶头视频 | 国产高潮视频在线观看 | 精品久久久久久亚洲精品 | 日本饥渴人妻欲求不满 | 欧美自拍另类欧美综合图片区 | 亚洲熟妇色xxxxx欧美老妇y | 天堂无码人妻精品一区二区三区 | 国产口爆吞精在线视频 | 国产明星裸体无码xxxx视频 | 日韩精品a片一区二区三区妖精 | 奇米影视7777久久精品 | 人人爽人人澡人人高潮 | 99久久婷婷国产综合精品青草免费 | 日日摸日日碰夜夜爽av | 2019nv天堂香蕉在线观看 | 欧美一区二区三区 | 亚洲区小说区激情区图片区 | 国产午夜福利100集发布 | 亚洲第一无码av无码专区 | 欧美日韩色另类综合 | 亚洲国产欧美在线成人 | 亚洲无人区午夜福利码高清完整版 | 亚洲成a人片在线观看日本 | 日本肉体xxxx裸交 | 熟妇女人妻丰满少妇中文字幕 | 九九久久精品国产免费看小说 | 日日橹狠狠爱欧美视频 | 亚洲综合无码一区二区三区 | 国产精品国产自线拍免费软件 | 久久99精品久久久久久动态图 | 精品一二三区久久aaa片 | 日韩精品无码一区二区中文字幕 | 宝宝好涨水快流出来免费视频 | 国产美女精品一区二区三区 | 久久综合九色综合97网 | 亚洲日本va中文字幕 | 亚洲欧美精品伊人久久 | 网友自拍区视频精品 | 国精产品一区二区三区 | 蜜桃臀无码内射一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 日韩无码专区 | 日韩精品无码一区二区中文字幕 | 久久人人爽人人爽人人片av高清 | 娇妻被黑人粗大高潮白浆 | 牲交欧美兽交欧美 | 亚洲综合色区中文字幕 | 午夜时刻免费入口 | 欧美变态另类xxxx | 精品国产一区二区三区四区 | 国内精品人妻无码久久久影院 | 少妇的肉体aa片免费 | 国产人妻人伦精品1国产丝袜 | 狠狠综合久久久久综合网 | 亚洲a无码综合a国产av中文 | 无遮挡啪啪摇乳动态图 | 国产又粗又硬又大爽黄老大爷视 | 日产精品高潮呻吟av久久 | 色综合久久久久综合一本到桃花网 | 国产人妖乱国产精品人妖 | 欧美怡红院免费全部视频 | 欧洲美熟女乱又伦 | 国产成人无码午夜视频在线观看 | 国产在线精品一区二区三区直播 | 国产麻豆精品精东影业av网站 | 男人和女人高潮免费网站 | 十八禁视频网站在线观看 | 强开小婷嫩苞又嫩又紧视频 | 成人三级无码视频在线观看 | 色偷偷人人澡人人爽人人模 | 国产美女极度色诱视频www | 国产成人无码区免费内射一片色欲 | 亚洲色欲久久久综合网东京热 | 国产无遮挡又黄又爽又色 | 中文精品久久久久人妻不卡 | 色婷婷欧美在线播放内射 | 亚洲经典千人经典日产 | 97精品国产97久久久久久免费 | 无码毛片视频一区二区本码 | 成 人 免费观看网站 | 国产偷国产偷精品高清尤物 | 国产舌乚八伦偷品w中 | 亚洲精品中文字幕久久久久 | 免费观看激色视频网站 | 久久国产精品二国产精品 | www一区二区www免费 | 色婷婷av一区二区三区之红樱桃 | 成人无码精品1区2区3区免费看 | 亚洲区小说区激情区图片区 | 久久久国产精品无码免费专区 | 清纯唯美经典一区二区 | 国产亚洲视频中文字幕97精品 | 国产9 9在线 | 中文 | 丝袜人妻一区二区三区 | 熟妇人妻无码xxx视频 | 亚洲精品无码人妻无码 | 成人精品视频一区二区三区尤物 | 日本大香伊一区二区三区 | 精品熟女少妇av免费观看 | 国产精品福利视频导航 | 亚洲狠狠婷婷综合久久 | 午夜理论片yy44880影院 | www国产亚洲精品久久网站 | 任你躁在线精品免费 | 国产深夜福利视频在线 | 福利一区二区三区视频在线观看 | 亚洲欧美综合区丁香五月小说 | 欧美日韩一区二区免费视频 | 欧美成人高清在线播放 | 亚洲欧美日韩国产精品一区二区 | 亚洲中文字幕成人无码 | 日韩av无码一区二区三区不卡 | ass日本丰满熟妇pics | 人人妻人人澡人人爽人人精品浪潮 | 曰韩少妇内射免费播放 | 天天做天天爱天天爽综合网 | 久久久精品国产sm最大网站 | 国产香蕉尹人视频在线 | 国产成人av免费观看 | 国产九九九九九九九a片 | 强奷人妻日本中文字幕 | 少妇无码一区二区二三区 | 激情国产av做激情国产爱 | 欧美精品国产综合久久 | 国产激情一区二区三区 | 欧美日韩精品 | 黑人巨大精品欧美一区二区 | 牛和人交xxxx欧美 | 亚洲自偷自偷在线制服 | 六月丁香婷婷色狠狠久久 | 中文字幕无码av波多野吉衣 | 亚洲国精产品一二二线 | av小次郎收藏 | 亚洲国产高清在线观看视频 | 久久99精品久久久久久 | 最近中文2019字幕第二页 | 荡女精品导航 | 久久久婷婷五月亚洲97号色 | 国内老熟妇对白xxxxhd | 国产精品香蕉在线观看 | 一区二区三区乱码在线 | 欧洲 | 久久人人爽人人爽人人片ⅴ | 国产成人一区二区三区别 | 午夜熟女插插xx免费视频 | 永久免费观看国产裸体美女 | 亚洲熟妇色xxxxx欧美老妇y | 精品国产一区二区三区四区在线看 | 狂野欧美激情性xxxx | 99久久人妻精品免费一区 | 国产艳妇av在线观看果冻传媒 | 99精品国产综合久久久久五月天 | 亚洲男女内射在线播放 | 亚洲色欲色欲欲www在线 | 1000部啪啪未满十八勿入下载 | 亚洲国产高清在线观看视频 | 纯爱无遮挡h肉动漫在线播放 | 精品无码成人片一区二区98 | 三级4级全黄60分钟 | 精品国产aⅴ无码一区二区 | 国产人妻人伦精品1国产丝袜 | 成熟女人特级毛片www免费 | 欧美第一黄网免费网站 | 露脸叫床粗话东北少妇 | 免费看男女做好爽好硬视频 | 欧美三级不卡在线观看 | 波多野结衣 黑人 | 西西人体www44rt大胆高清 | 欧美老熟妇乱xxxxx | 理论片87福利理论电影 | 亚洲中文字幕在线观看 | 成 人 网 站国产免费观看 | 装睡被陌生人摸出水好爽 | 国精产品一区二区三区 | 国产av一区二区三区最新精品 | 精品一区二区三区波多野结衣 | 天天综合网天天综合色 | 亚洲国产日韩a在线播放 | 天天躁夜夜躁狠狠是什么心态 | 国产av一区二区精品久久凹凸 | 国产精品手机免费 | 亚洲精品一区二区三区在线 | 一二三四在线观看免费视频 | 香蕉久久久久久av成人 | 久青草影院在线观看国产 | 大胆欧美熟妇xx | 无码播放一区二区三区 | 图片小说视频一区二区 | 曰韩无码二三区中文字幕 | 波多野结衣高清一区二区三区 | 内射白嫩少妇超碰 | 九九在线中文字幕无码 | 草草网站影院白丝内射 | 欧美成人午夜精品久久久 | 中文字幕人妻丝袜二区 | 国产精品第一国产精品 | 熟妇人妻中文av无码 | 日欧一片内射va在线影院 | 乱码av麻豆丝袜熟女系列 | 日韩欧美中文字幕公布 | 东京热男人av天堂 | 国产亲子乱弄免费视频 | 亚洲精品国产精品乱码视色 | 亚洲日韩一区二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产极品美女高潮无套在线观看 | 国产精品a成v人在线播放 | 久久久久se色偷偷亚洲精品av | 漂亮人妻洗澡被公强 日日躁 | 激情五月综合色婷婷一区二区 | 亚洲成熟女人毛毛耸耸多 | 国产明星裸体无码xxxx视频 | 精品国精品国产自在久国产87 | 欧美肥老太牲交大战 | 欧美成人家庭影院 | 日韩精品无码一区二区中文字幕 | 鲁大师影院在线观看 | 极品尤物被啪到呻吟喷水 | 国内精品九九久久久精品 | 国产在线aaa片一区二区99 | 亚洲日韩av一区二区三区四区 | 中文字幕人妻丝袜二区 | aⅴ亚洲 日韩 色 图网站 播放 | 精品夜夜澡人妻无码av蜜桃 | 亚洲日韩精品欧美一区二区 | 国产精品美女久久久网av | 男女猛烈xx00免费视频试看 | 色综合天天综合狠狠爱 | 无码成人精品区在线观看 | 国产疯狂伦交大片 | 女人色极品影院 | 97资源共享在线视频 | 伊人久久大香线焦av综合影院 | 小泽玛莉亚一区二区视频在线 | 国产精品办公室沙发 | 亚洲精品一区三区三区在线观看 | 午夜成人1000部免费视频 | 女人被男人躁得好爽免费视频 | 性欧美videos高清精品 | 免费人成在线观看网站 | 欧美人与牲动交xxxx | 无码人妻出轨黑人中文字幕 | 亚洲无人区午夜福利码高清完整版 | 欧美人与禽猛交狂配 | 久久久精品人妻久久影视 | 18黄暴禁片在线观看 | 国产成人无码av一区二区 | 亚洲精品久久久久avwww潮水 | 亚洲熟女一区二区三区 | 岛国片人妻三上悠亚 | 老司机亚洲精品影院 | 夫妻免费无码v看片 | 天干天干啦夜天干天2017 | 国产成人综合色在线观看网站 | 精品国产麻豆免费人成网站 | 亚洲天堂2017无码 | 国产办公室秘书无码精品99 | 18精品久久久无码午夜福利 | 两性色午夜免费视频 | 亚洲精品鲁一鲁一区二区三区 | 国产女主播喷水视频在线观看 | 亚洲小说图区综合在线 | 76少妇精品导航 | 特级做a爰片毛片免费69 | 精品国产一区二区三区四区 | 国产精品亚洲综合色区韩国 | 午夜精品久久久久久久久 | 99久久精品国产一区二区蜜芽 | 无码人妻av免费一区二区三区 | 丝袜 中出 制服 人妻 美腿 | 麻豆md0077饥渴少妇 | 亚洲精品午夜国产va久久成人 | 中文字幕人妻丝袜二区 | 性欧美熟妇videofreesex | 欧美一区二区三区 | 水蜜桃av无码 | 亚洲精品美女久久久久久久 | 欧洲vodafone精品性 | 欧美第一黄网免费网站 | 领导边摸边吃奶边做爽在线观看 | 精品久久久久久人妻无码中文字幕 | 免费看男女做好爽好硬视频 | 亚洲综合在线一区二区三区 | 欧美老熟妇乱xxxxx | 2019nv天堂香蕉在线观看 | 国产av一区二区三区最新精品 | 97精品国产97久久久久久免费 | 精品无码一区二区三区的天堂 | 国产内射老熟女aaaa | 国产美女极度色诱视频www | 亚洲一区二区三区含羞草 | 欧美 日韩 人妻 高清 中文 | 女人高潮内射99精品 | 亚洲欧美国产精品久久 | 国精品人妻无码一区二区三区蜜柚 | 中文字幕亚洲情99在线 | 国产激情一区二区三区 | 国产人妻精品午夜福利免费 | 日韩精品成人一区二区三区 | 久久国内精品自在自线 | 色综合久久久无码中文字幕 | 麻豆av传媒蜜桃天美传媒 | 无码播放一区二区三区 | 麻豆蜜桃av蜜臀av色欲av | 大肉大捧一进一出好爽视频 | 丝袜足控一区二区三区 | 精品国产青草久久久久福利 | 精品乱子伦一区二区三区 | 久久伊人色av天堂九九小黄鸭 | 老熟妇仑乱视频一区二区 | 亚洲a无码综合a国产av中文 | 夜先锋av资源网站 | 四虎国产精品一区二区 | 成人欧美一区二区三区 | 天天摸天天碰天天添 | 十八禁真人啪啪免费网站 | 亚洲小说春色综合另类 | 搡女人真爽免费视频大全 | 色一情一乱一伦 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 亚洲伊人久久精品影院 | 亚洲小说图区综合在线 | 久久天天躁夜夜躁狠狠 | 国产性生大片免费观看性 | 扒开双腿疯狂进出爽爽爽视频 | 欧美真人作爱免费视频 | 亚洲天堂2017无码 | 久久久精品国产sm最大网站 | 一本色道久久综合亚洲精品不卡 | 国产麻豆精品精东影业av网站 | 精品欧美一区二区三区久久久 | 美女毛片一区二区三区四区 | 久久国产精品二国产精品 | 中国大陆精品视频xxxx | 性欧美牲交xxxxx视频 | 亚洲熟妇自偷自拍另类 | 日本在线高清不卡免费播放 | 久久99国产综合精品 | 亚洲s码欧洲m码国产av | 亚洲综合伊人久久大杳蕉 | 日韩欧美中文字幕公布 | 麻豆国产人妻欲求不满 | 两性色午夜视频免费播放 | 日产精品高潮呻吟av久久 | 夜夜高潮次次欢爽av女 | 中文精品久久久久人妻不卡 | 亚洲欧美国产精品专区久久 | 亚洲精品中文字幕久久久久 | 一个人看的视频www在线 | 青青青爽视频在线观看 | 亚洲色无码一区二区三区 | 天天做天天爱天天爽综合网 | 亚洲精品国产品国语在线观看 | 人妻少妇被猛烈进入中文字幕 | 亚洲国产午夜精品理论片 | 奇米影视7777久久精品人人爽 | 国产精品丝袜黑色高跟鞋 | 久久久久99精品成人片 | 久久久久国色av免费观看性色 | 亚洲国产av精品一区二区蜜芽 | 永久黄网站色视频免费直播 | 国产午夜无码精品免费看 | 人人妻人人澡人人爽欧美一区九九 | 漂亮人妻洗澡被公强 日日躁 | 人人妻人人藻人人爽欧美一区 | 日韩亚洲欧美中文高清在线 | 亚洲色欲色欲欲www在线 | 国产精品久久久午夜夜伦鲁鲁 | 色综合久久久无码网中文 | 日韩精品a片一区二区三区妖精 | 亚洲精品国产精品乱码视色 | 大肉大捧一进一出好爽视频 | 7777奇米四色成人眼影 | 国产偷国产偷精品高清尤物 | 任你躁在线精品免费 | 久久精品国产99久久6动漫 | 精品国产福利一区二区 | 日本精品人妻无码免费大全 | 亚洲精品无码人妻无码 | 又色又爽又黄的美女裸体网站 | 国产精品va在线观看无码 | 日本大乳高潮视频在线观看 | 日韩在线不卡免费视频一区 | 成人欧美一区二区三区黑人免费 | 久久精品国产大片免费观看 | 国产内射爽爽大片视频社区在线 | 中文字幕无码日韩欧毛 | 领导边摸边吃奶边做爽在线观看 | 日韩精品无码一区二区中文字幕 | 成人试看120秒体验区 | 久久综合久久自在自线精品自 | 亚洲自偷自拍另类第1页 | 久久人人爽人人爽人人片ⅴ | 国产欧美精品一区二区三区 | a在线亚洲男人的天堂 | 精品无码av一区二区三区 | 亚洲一区二区三区四区 | 无码人妻丰满熟妇区毛片18 | 欧洲极品少妇 | 国产超级va在线观看视频 | 国产网红无码精品视频 | 亚洲自偷自偷在线制服 | 国产人成高清在线视频99最全资源 | 天天做天天爱天天爽综合网 | 国产在线无码精品电影网 | 2019午夜福利不卡片在线 | 人妻aⅴ无码一区二区三区 | 欧美兽交xxxx×视频 | 精品久久8x国产免费观看 | 人人妻人人藻人人爽欧美一区 | 人妻有码中文字幕在线 | 中文字幕av无码一区二区三区电影 | 欧美日韩色另类综合 | 在线播放无码字幕亚洲 | 亚洲の无码国产の无码步美 | 精品久久久久久人妻无码中文字幕 | 国产精品亚洲а∨无码播放麻豆 | 小鲜肉自慰网站xnxx | 日本欧美一区二区三区乱码 | 天堂亚洲免费视频 | 久久久久免费精品国产 | 亚洲国产精品成人久久蜜臀 | 国产偷抇久久精品a片69 | 综合网日日天干夜夜久久 | 欧美精品一区二区精品久久 | 亚洲码国产精品高潮在线 | 久久久久99精品国产片 | 亚洲中文字幕av在天堂 | 老熟妇仑乱视频一区二区 | 黑人巨大精品欧美一区二区 | 国产一区二区三区精品视频 | 国产一区二区三区日韩精品 | 亚洲国产成人a精品不卡在线 | 成人片黄网站色大片免费观看 | 好爽又高潮了毛片免费下载 | 色诱久久久久综合网ywww | 精品无码一区二区三区的天堂 | 精品一区二区三区无码免费视频 | 亚洲成在人网站无码天堂 | 水蜜桃av无码 | 高清不卡一区二区三区 | 少妇无套内谢久久久久 | 天堂а√在线中文在线 | 国产成人无码av片在线观看不卡 | 特级做a爰片毛片免费69 | 亚洲国产精品毛片av不卡在线 | 黑人巨大精品欧美黑寡妇 | 国产精品无码久久av | 内射老妇bbwx0c0ck | 激情综合激情五月俺也去 | 日韩精品成人一区二区三区 | 色婷婷香蕉在线一区二区 | 亚洲精品一区三区三区在线观看 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲欧洲无卡二区视頻 | 国产精品无套呻吟在线 | 老熟女重囗味hdxx69 | 免费观看又污又黄的网站 | 亚洲中文字幕久久无码 | 狠狠亚洲超碰狼人久久 | 国产无遮挡又黄又爽又色 | 国产精品无码久久av | 欧美 亚洲 国产 另类 | 亚洲呦女专区 | 狠狠色色综合网站 | 久久zyz资源站无码中文动漫 | 日本va欧美va欧美va精品 | 久久精品无码一区二区三区 | 99久久久无码国产精品免费 | 亚洲经典千人经典日产 | 久久99精品久久久久久动态图 | 亚洲日韩一区二区三区 | 国产高清av在线播放 | 国精产品一品二品国精品69xx | 久久人人爽人人爽人人片av高清 | 国产亚洲精品久久久久久久 | 欧美亚洲日韩国产人成在线播放 | 中文字幕av日韩精品一区二区 | 国产乱人伦av在线无码 | 国产成人精品一区二区在线小狼 | 日本精品人妻无码77777 天堂一区人妻无码 | 野狼第一精品社区 | 国产精品久久国产三级国 | 国产无套内射久久久国产 | 男女超爽视频免费播放 | 性欧美牲交xxxxx视频 | 少妇愉情理伦片bd | av小次郎收藏 | 国产口爆吞精在线视频 | 荫蒂添的好舒服视频囗交 | 无码国模国产在线观看 | 亚洲中文字幕久久无码 | 国产激情一区二区三区 | 亚洲熟妇色xxxxx欧美老妇 | 少妇被黑人到高潮喷出白浆 | 国产9 9在线 | 中文 | 亚洲熟女一区二区三区 | 亚洲成av人片天堂网无码】 | 图片区 小说区 区 亚洲五月 | 国产精品18久久久久久麻辣 | 无码任你躁久久久久久久 | 国产明星裸体无码xxxx视频 | 清纯唯美经典一区二区 | 日本爽爽爽爽爽爽在线观看免 | 福利一区二区三区视频在线观看 | 蜜桃视频韩日免费播放 | 人人妻人人澡人人爽精品欧美 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产免费久久久久久无码 | 蜜臀av在线播放 久久综合激激的五月天 | 欧美成人午夜精品久久久 | 国产超级va在线观看视频 | 98国产精品综合一区二区三区 | 牛和人交xxxx欧美 | 久久精品国产日本波多野结衣 | 久9re热视频这里只有精品 | 亚洲精品国产精品乱码视色 | 日韩人妻系列无码专区 | 奇米影视888欧美在线观看 | 玩弄人妻少妇500系列视频 | 国产精品无码mv在线观看 | 国产精品欧美成人 | 国产熟女一区二区三区四区五区 | 国产成人无码a区在线观看视频app | 亚洲天堂2017无码 | 亚洲色大成网站www国产 | 国产精华av午夜在线观看 | 亚洲 日韩 欧美 成人 在线观看 | 久久99精品国产麻豆 | 强伦人妻一区二区三区视频18 | 精品人妻人人做人人爽 | 日韩精品a片一区二区三区妖精 | 黑森林福利视频导航 | 久久久久免费看成人影片 | 久久精品中文字幕大胸 | 人妻天天爽夜夜爽一区二区 | 呦交小u女精品视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 无遮挡国产高潮视频免费观看 | 国产女主播喷水视频在线观看 | 免费无码的av片在线观看 | 色一情一乱一伦一区二区三欧美 | 女人被男人爽到呻吟的视频 | 麻豆国产丝袜白领秘书在线观看 | 女人被男人躁得好爽免费视频 | 青青草原综合久久大伊人精品 | 亚洲无人区一区二区三区 | 中文字幕+乱码+中文字幕一区 | 色综合视频一区二区三区 | 久久精品人妻少妇一区二区三区 | 麻豆蜜桃av蜜臀av色欲av | 亚洲日韩乱码中文无码蜜桃臀网站 | 真人与拘做受免费视频 | 国产莉萝无码av在线播放 | 人妻少妇精品视频专区 | 中文字幕人妻丝袜二区 | 自拍偷自拍亚洲精品10p | 无码帝国www无码专区色综合 | 捆绑白丝粉色jk震动捧喷白浆 | 成人精品天堂一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 人人爽人人澡人人人妻 | 内射巨臀欧美在线视频 | 久久精品99久久香蕉国产色戒 | 性史性农村dvd毛片 | 国产精品久久久午夜夜伦鲁鲁 | 日韩精品乱码av一区二区 | 欧美zoozzooz性欧美 | 香蕉久久久久久av成人 | 少妇激情av一区二区 | 国産精品久久久久久久 | 久久午夜无码鲁丝片秋霞 | 亚洲成a人片在线观看无码3d | 国产乱人伦偷精品视频 | 亚洲综合久久一区二区 | 亚洲国产欧美国产综合一区 | 国产婷婷色一区二区三区在线 | 国内精品人妻无码久久久影院蜜桃 | 少妇一晚三次一区二区三区 | 欧美第一黄网免费网站 | 中文字幕乱码亚洲无线三区 | 亚欧洲精品在线视频免费观看 | 性欧美疯狂xxxxbbbb | 国产97人人超碰caoprom | 人妻与老人中文字幕 | 亚洲乱码日产精品bd | 欧美xxxx黑人又粗又长 | 精品久久8x国产免费观看 | 无码国模国产在线观看 | 国内老熟妇对白xxxxhd | 日韩精品久久久肉伦网站 | 蜜桃视频韩日免费播放 | 欧美xxxxx精品 | 久久久久久a亚洲欧洲av冫 | 亚洲精品成人福利网站 | 成人亚洲精品久久久久软件 | 亚洲の无码国产の无码影院 | 亚洲精品一区二区三区四区五区 | 日本护士xxxxhd少妇 | 无人区乱码一区二区三区 | 精品乱码久久久久久久 | 亚洲人成无码网www | 国产99久久精品一区二区 | 欧美性色19p | 午夜免费福利小电影 | 久久国产精品偷任你爽任你 | 2019nv天堂香蕉在线观看 | 性色欲网站人妻丰满中文久久不卡 | 日本一卡2卡3卡四卡精品网站 | 亚洲色欲久久久综合网东京热 | 日韩无套无码精品 | 国产av无码专区亚洲a∨毛片 | 中文无码精品a∨在线观看不卡 | 久久97精品久久久久久久不卡 | 亚洲精品一区二区三区在线 | 无码中文字幕色专区 | 激情亚洲一区国产精品 | 老子影院午夜伦不卡 | 99精品无人区乱码1区2区3区 | 久久精品女人天堂av免费观看 | 377p欧洲日本亚洲大胆 | 国产成人精品优优av | 国产亚洲视频中文字幕97精品 | 少妇无码av无码专区在线观看 | 国产欧美熟妇另类久久久 | 日本爽爽爽爽爽爽在线观看免 | 色综合久久网 | 欧美国产日韩久久mv | 亚洲日本va午夜在线电影 | 中文字幕无码热在线视频 | 国内丰满熟女出轨videos | 亚洲熟妇色xxxxx亚洲 | 日韩成人一区二区三区在线观看 | 久久99精品国产麻豆 | 国产性生大片免费观看性 | 国产精品鲁鲁鲁 | 无遮挡国产高潮视频免费观看 | 2020久久香蕉国产线看观看 | 成人免费视频在线观看 | 成人三级无码视频在线观看 | 久久99精品国产麻豆 | 精品一区二区三区无码免费视频 | 国产精品久久久久9999小说 | 蜜臀av无码人妻精品 | 999久久久国产精品消防器材 | 国产性生交xxxxx无码 | 国产办公室秘书无码精品99 | 国产xxx69麻豆国语对白 | 国产农村乱对白刺激视频 | 无码一区二区三区在线 | 天天摸天天透天天添 | 久久99热只有频精品8 | 欧美黑人巨大xxxxx | 俄罗斯老熟妇色xxxx | 国产欧美熟妇另类久久久 | 国产在线一区二区三区四区五区 | 日韩人妻无码一区二区三区久久99 | 青青草原综合久久大伊人精品 | 国产人妖乱国产精品人妖 | 一本色道婷婷久久欧美 | 亚洲热妇无码av在线播放 | 男女性色大片免费网站 | 日日躁夜夜躁狠狠躁 | 少妇无码一区二区二三区 | 国产亚洲精品久久久久久国模美 | 草草网站影院白丝内射 | 俄罗斯老熟妇色xxxx | 国产特级毛片aaaaaa高潮流水 | 日韩少妇白浆无码系列 | 内射欧美老妇wbb | 国产va免费精品观看 | 精品一区二区三区波多野结衣 | 国产日产欧产精品精品app | 日日夜夜撸啊撸 | 鲁大师影院在线观看 | 亚洲人成网站色7799 | 性生交大片免费看女人按摩摩 | 婷婷六月久久综合丁香 | 精品 日韩 国产 欧美 视频 | 伦伦影院午夜理论片 | 18无码粉嫩小泬无套在线观看 | 国产成人无码区免费内射一片色欲 | 好男人www社区 | 日韩亚洲欧美精品综合 | 亚洲精品无码国产 | 亚洲中文字幕va福利 | 亚洲色欲色欲欲www在线 | 欧美丰满熟妇xxxx | 野外少妇愉情中文字幕 | 久久国产劲爆∧v内射 | 超碰97人人做人人爱少妇 | 一本大道久久东京热无码av | 久久久久99精品成人片 | 亚洲另类伦春色综合小说 | 捆绑白丝粉色jk震动捧喷白浆 | 欧美国产日产一区二区 | 欧美人与禽zoz0性伦交 | 亚洲一区二区三区无码久久 | 一区二区三区高清视频一 | 狠狠亚洲超碰狼人久久 | 国产色在线 | 国产 | 国产精品-区区久久久狼 | 国产精品18久久久久久麻辣 | 日产精品99久久久久久 | 欧洲欧美人成视频在线 | 国产精品亚洲lv粉色 | 亚洲七七久久桃花影院 | 亚洲精品综合一区二区三区在线 | 久久视频在线观看精品 | 性生交片免费无码看人 | 日韩成人一区二区三区在线观看 | 色婷婷久久一区二区三区麻豆 | 亚洲国产成人av在线观看 | 欧美三级a做爰在线观看 | 97夜夜澡人人双人人人喊 | 性欧美牲交xxxxx视频 | 综合激情五月综合激情五月激情1 | 久久久久久av无码免费看大片 | 国产内射老熟女aaaa | 亚洲人成人无码网www国产 | 日本熟妇乱子伦xxxx | 国产综合色产在线精品 | 亚洲爆乳大丰满无码专区 | 欧美黑人巨大xxxxx | аⅴ资源天堂资源库在线 | 强辱丰满人妻hd中文字幕 | 99麻豆久久久国产精品免费 | 一本加勒比波多野结衣 | 伊人色综合久久天天小片 | 国产成人综合在线女婷五月99播放 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲熟妇色xxxxx欧美老妇y | 丰满人妻一区二区三区免费视频 | 99精品视频在线观看免费 | 国产亚洲欧美日韩亚洲中文色 | 国产av剧情md精品麻豆 | 国产人妻久久精品二区三区老狼 | 欧美性生交活xxxxxdddd | 免费观看又污又黄的网站 | 久久人人爽人人爽人人片av高清 | 在线精品亚洲一区二区 | 亚洲精品久久久久久久久久久 | 国产又爽又猛又粗的视频a片 | 久久精品国产一区二区三区 | 正在播放东北夫妻内射 | 亚洲成av人片在线观看无码不卡 | 蜜桃臀无码内射一区二区三区 | 亚洲中文字幕乱码av波多ji | 亚拍精品一区二区三区探花 | 色一情一乱一伦一区二区三欧美 | 久久久精品成人免费观看 | 国产亚洲精品精品国产亚洲综合 | 色欲人妻aaaaaaa无码 | 无码播放一区二区三区 | 国产亲子乱弄免费视频 | 无遮无挡爽爽免费视频 | 成人aaa片一区国产精品 | 狠狠色噜噜狠狠狠狠7777米奇 | 人妻少妇精品视频专区 | 野狼第一精品社区 | 欧美成人免费全部网站 | 四虎永久在线精品免费网址 | 无码毛片视频一区二区本码 | 丰满少妇女裸体bbw | 中文字幕精品av一区二区五区 | 亚洲精品国产a久久久久久 | 色噜噜亚洲男人的天堂 | 国产精品.xx视频.xxtv | 搡女人真爽免费视频大全 | 无码人中文字幕 | 亚洲高清偷拍一区二区三区 | 中文无码精品a∨在线观看不卡 | 亚洲精品久久久久中文第一幕 | av小次郎收藏 | 中文精品久久久久人妻不卡 | 日本免费一区二区三区最新 | 在教室伦流澡到高潮hnp视频 | 亚洲一区av无码专区在线观看 | 久久久精品人妻久久影视 | 日产精品高潮呻吟av久久 | 久久亚洲中文字幕无码 | 一区二区三区高清视频一 | 少女韩国电视剧在线观看完整 | 久久精品99久久香蕉国产色戒 | 久久精品国产一区二区三区肥胖 | 日本肉体xxxx裸交 | √8天堂资源地址中文在线 | 在教室伦流澡到高潮hnp视频 | 久久99精品久久久久久 | 久久亚洲中文字幕无码 | 国产精品igao视频网 | 扒开双腿疯狂进出爽爽爽视频 | 好屌草这里只有精品 | 日本又色又爽又黄的a片18禁 | 亚洲一区二区三区含羞草 | 特级做a爰片毛片免费69 | 亚洲精品美女久久久久久久 | 乱人伦中文视频在线观看 | 99精品无人区乱码1区2区3区 | 亚洲区小说区激情区图片区 | 午夜不卡av免费 一本久久a久久精品vr综合 | 蜜桃视频插满18在线观看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 亚洲成a人一区二区三区 | 精品无码国产自产拍在线观看蜜 | 大肉大捧一进一出好爽视频 | 少妇无套内谢久久久久 | 欧美日韩在线亚洲综合国产人 | 国产成人精品久久亚洲高清不卡 | 扒开双腿吃奶呻吟做受视频 | 无码国产色欲xxxxx视频 | 中文字幕无码热在线视频 | 少妇性荡欲午夜性开放视频剧场 | 丰腴饱满的极品熟妇 | 国模大胆一区二区三区 | 乱中年女人伦av三区 | 最新版天堂资源中文官网 | 国产亚洲精品久久久久久久久动漫 | 欧美xxxxx精品 | 鲁大师影院在线观看 | 色一情一乱一伦 | 成人免费视频在线观看 | 夜精品a片一区二区三区无码白浆 | 日韩 欧美 动漫 国产 制服 | 欧美人妻一区二区三区 | 色妞www精品免费视频 | 亚洲国产精品美女久久久久 | 人人爽人人爽人人片av亚洲 | 丰满肥臀大屁股熟妇激情视频 | 国产精品久久久久7777 | 亚洲а∨天堂久久精品2021 | 中国大陆精品视频xxxx | 午夜无码人妻av大片色欲 | 色窝窝无码一区二区三区色欲 | 欧洲精品码一区二区三区免费看 | 欧美日韩人成综合在线播放 | 亚洲一区二区三区国产精华液 | 特黄特色大片免费播放器图片 | 水蜜桃色314在线观看 | 欧美一区二区三区视频在线观看 | 成年美女黄网站色大免费全看 | 国产猛烈高潮尖叫视频免费 | 水蜜桃av无码 | 骚片av蜜桃精品一区 | 国产人妻精品一区二区三区不卡 | 久久99久久99精品中文字幕 | 欧美黑人性暴力猛交喷水 | 国产福利视频一区二区 | 国产亚洲美女精品久久久2020 | 大地资源中文第3页 | 久久久国产精品无码免费专区 | 欧美成人家庭影院 | 草草网站影院白丝内射 | 免费人成在线观看网站 | 国产香蕉97碰碰久久人人 | 亚洲の无码国产の无码影院 | 精品国产麻豆免费人成网站 | 特黄特色大片免费播放器图片 | 蜜桃无码一区二区三区 | 成人亚洲精品久久久久软件 | 午夜不卡av免费 一本久久a久久精品vr综合 | 无套内谢的新婚少妇国语播放 | 99视频精品全部免费免费观看 | 九九久久精品国产免费看小说 | 国产精品igao视频网 | 欧美亚洲日韩国产人成在线播放 | 成人性做爰aaa片免费看 | 99精品国产综合久久久久五月天 | 亚洲精品久久久久中文第一幕 | 精品熟女少妇av免费观看 | 影音先锋中文字幕无码 | 少女韩国电视剧在线观看完整 | 狂野欧美激情性xxxx | 99久久精品日本一区二区免费 | 玩弄少妇高潮ⅹxxxyw | 亚洲欧美国产精品久久 | 亚洲色成人中文字幕网站 | 亚洲国产欧美日韩精品一区二区三区 | 精品国精品国产自在久国产87 | 国产精品人人妻人人爽 | 久青草影院在线观看国产 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 超碰97人人做人人爱少妇 | 18精品久久久无码午夜福利 | 红桃av一区二区三区在线无码av | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | √天堂资源地址中文在线 | 精品人妻人人做人人爽 | 成人欧美一区二区三区黑人 | 国产乱人无码伦av在线a | 久久久久免费看成人影片 | 午夜精品一区二区三区的区别 | 亚洲色偷偷偷综合网 | 亚洲 a v无 码免 费 成 人 a v | 国产亚洲欧美日韩亚洲中文色 | 亚洲国产精品一区二区第一页 | 国产亚av手机在线观看 | 乱人伦人妻中文字幕无码久久网 | 色婷婷欧美在线播放内射 | 国产免费久久精品国产传媒 |