日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java concurrent包介绍及使用

發布時間:2023/11/29 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java concurrent包介绍及使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

說一說java的concurrent包1-concurrent包簡介

前面一個系列的文章都在圍繞hash展開,今天準備先說下concurrent包,這個系列可能會以使用場景說明為主,concurrent包本身的代碼分析可能比較少; 我在這方面的實踐經驗較為有限,有錯誤歡迎批評指正?

不過前一個系列并未結束,還有一些文章沒有放出來,歡迎關注核桃博客?

concurrent包是jdk1.5引入的重要的包,主要代碼由大牛Doug Lea完成,其實是在jdk1.4時代,由于java語言內置對多線程編程的支持比較基礎和有限,所以他寫了這個,因為實在太過于優秀,所以被加入到jdk之中;?

通常所說的concurrent包基本有3個package組成?
java.util.concurrent:提供大部分關于并發的接口和類,如BlockingQueue,Callable,ConcurrentHashMap,ExecutorService, Semaphore等?
java.util.concurrent.atomic:提供所有原子操作的類, 如AtomicInteger, AtomicLong等;?
java.util.concurrent.locks:提供鎖相關的類, 如Lock, ReentrantLock, ReadWriteLock, Condition等;?

concurrent包的優點:?
1. 首先,功能非常豐富,諸如線程池(ThreadPoolExecutor),CountDownLatch等并發編程中需要的類已經有現成的實現,不需要自己去實現一套; 畢竟jdk1.4對多線程編程的主要支持幾乎就只有Thread, Runnable,synchronized等?

2. concurrent包里面的一些操作是基于硬件級別的CAS(compare and swap),就是在cpu級別提供了原子操作,簡單的說就可以提供無阻塞、無鎖定的算法; 而現代cpu大部分都是支持這樣的算法的;

說一說java的concurrent包2-等待多個線程完成執行的CountDownLatch?

前面一篇說了concurrent包的基本結構,接下來首先看一下一個非常有用的類,CountDownLatch, 可以用來在一個線程中等待多個線程完成任務的類;?

前面一篇說了concurrent包的基本結構,接下來首先看一下一個非常有用的類,CountDownLatch, 可以用來在一個線程中等待多個線程完成任務的類;?
通常的使用場景是,某個主線程接到一個任務,起了n個子線程去完成,但是主線程需要等待這n個子線程都完成任務了以后才開始執行某個操作;?

下面是一段演示代碼?

Java代碼??

@Test?? public?void?demoCountDown()?? {??int?count?=?10;??final?CountDownLatch?l?=?new?CountDownLatch(count);??for(int?i?=?0;?i?<?count;?++i)??{??final?int?index?=?i;??new?Thread(new?Runnable()?{??@Override??public?void?run()?{??try?{??Thread.currentThread().sleep(20?*?1000);??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??System.out.println("thread?"?+?index?+?"?has?finished...");??l.countDown();??}??}).start();??}??try?{??l.await();??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??System.out.println("now?all?threads?have?finished");??}運行的結果?
thread 1 has finished...?
thread 3 has finished...?
thread 4 has finished...?
thread 6 has finished...?
thread 8 has finished...?
thread 0 has finished...?
thread 7 has finished...?
thread 9 has finished...?
thread 2 has finished...?
thread 5 has finished...?
now all threads have finished?

前面10個線程的執行完成順序會變化,但是最后一句始終會等待前面10個線程都完成之后才會執行

說一說java的concurrent包3-線程安全并且無阻塞的Atomic類?

有了CountDownLatch,涉及到多線程同步的演示就比較容易了,接下來我們看下Atomic相關的類, 比如AtomicLong, AtomicInteger等這些;?

有了CountDownLatch,涉及到多線程同步的演示就比較容易了,接下來我們看下Atomic相關的類, 比如AtomicLong, AtomicInteger等這些;?
簡單的說,這些類都是線程安全的,支持無阻塞無鎖定的?

Java代碼??

set()??

get()??

getAndSet()??

getAndIncrement()??

getAndDecrement()??

getAndAdd()??


等操作?

下面是一個測試代碼?

Java代碼??

package?com.hetaoblog.concurrent.test;??import?java.util.concurrent.CountDownLatch;?? import?java.util.concurrent.atomic.AtomicLong;??import?org.junit.Test;?? /**?*?*?by?http://www.hetaoblog.com?*?@author?hetaoblog?*?*/?? public?class?AtomicTest?{??@Test??public?void?testAtomic()??{??final?int?loopcount?=?10000;??int?threadcount?=?10;??final?NonSafeSeq?seq1?=?new?NonSafeSeq();??final?SafeSeq?seq2?=?new?SafeSeq();??final?CountDownLatch?l?=?new?CountDownLatch(threadcount);??for(int?i?=?0;?i?<?threadcount;?++i)??{??final?int?index?=?i;??new?Thread(new?Runnable()?{??@Override??public?void?run()?{??for(int?j?=?0;?j?<?loopcount;?++j)??{??seq1.inc();??seq2.inc();??}??System.out.println("finished?:?"?+?index);??l.countDown();??}??}).start();??}??try?{??l.await();??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??System.out.println("both?have?finished....");??System.out.println("NonSafeSeq:"?+?seq1.get());??System.out.println("SafeSeq?with?atomic:?"?+?seq2.get());??}?? }??class?NonSafeSeq{??private?long?count?=?0;??public?void?inc()??{??count++;??}??public?long??get()??{??return?count;??}?? }??class?SafeSeq{??private?AtomicLong?count??=?new?AtomicLong(0);??public?void?inc()??{??count.incrementAndGet();??}??public?long?get()??{??return?count.longValue();??}?? }其中NonSafeSeq是作為對比的類,直接放一個private long count不是線程安全的,而SafeSeq里面放了一個AtomicLong,是線程安全的;可以直接調用incrementAndGet來增加?

運行代碼,可以得到類似這樣的結果?
finished : 1?
finished : 0?
finished : 3?
finished : 2?
finished : 5?
finished : 4?
finished : 6?
finished : 8?
finished : 9?
finished : 7?
both have finished....?
NonSafeSeq:91723?
SafeSeq with atomic: 100000?

可以看到,10個線程,每個線程運行了10,000次,理論上應該有100,000次增加,使用了普通的long是非線程安全的,而使用了AtomicLong是線程安全的;?

注意,這個例子也說明,雖然long本身的單個設置是原子的,要么成功要么不成功,但是諸如count++這樣的操作就不是線程安全的;因為這包括了讀取和寫入兩步操作;

說一說java的concurrent包4--可以代替synchronized關鍵字的ReentrantLock?

在jdk 1.4時代,線程間的同步主要依賴于synchronized關鍵字,本質上該關鍵字是一個對象鎖,可以加在不同的instance上或者class上,從使用的角度則分別可以加在非靜態方法,靜態方法,以及直接synchronized(MyObject)這樣的用法;?

在jdk 1.4時代,線程間的同步主要依賴于synchronized關鍵字,本質上該關鍵字是一個對象鎖,可以加在不同的instance上或者class上,從使用的角度則分別可以加在非靜態方法,靜態方法,以及直接synchronized(MyObject)這樣的用法;?
concurrent包提供了一個可以替代synchronized關鍵字的ReentrantLock,?
簡單的說你可以new一個ReentrantLock, 然后通過lock.lock和lock.unlock來獲取鎖和釋放鎖;注意必須將unlock放在finally塊里面,?
reentrantlock的好處?
1. 是更好的性能,?
2. 提供同一個lock對象上不同condition的信號通知?
3. 還提供lockInterruptibly這樣支持響應中斷的加鎖過程,意思是說你試圖去加鎖,但是當前鎖被其他線程hold住,然后你這個線程可以被中斷;?

簡單的一個例子:?

Java代碼??

package?com.hetaoblog.concurrent.test;??import?java.util.concurrent.CountDownLatch;?? import?java.util.concurrent.locks.ReentrantLock;??import?org.junit.Test;??public?class?ReentrantLockDemo?{??@Test??public?void?demoLock()??{??final?int?loopcount?=?10000;??int?threadcount?=?10;??final?SafeSeqWithLock?seq?=?new?SafeSeqWithLock();??final?CountDownLatch?l?=?new?CountDownLatch(threadcount);??for(int?i?=?0;?i?<?threadcount;?++i)??{??final?int?index?=?i;??new?Thread(new?Runnable()?{??@Override??public?void?run()?{??for(int?j?=?0;?j?<?loopcount;?++j)??{??seq.inc();??}??System.out.println("finished?:?"?+?index);??l.countDown();??}??}).start();??}??try?{??l.await();??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??System.out.println("both?have?finished....");??System.out.println("SafeSeqWithLock:"?+?seq.get());??}?? }??class?SafeSeqWithLock{??private?long?count?=?0;??private?ReentrantLock?lock?=?new?ReentrantLock();??public?void?inc()??{??lock.lock();??try{??count++;??}??finally{??lock.unlock();??}??}??public?long?get()??{??return?count;??}?? }同樣以前面的類似Sequence的類舉例,通過對inc操作加鎖,保證了線程安全;?
當然,這里get()我沒有加鎖,對于這樣直接讀取返回原子類型的函數,我認為不加鎖是沒問題的,相當于返回最近成功操作的值;?

運行結果類似這樣,?
finished : 7?
finished : 2?
finished : 6?
finished : 1?
finished : 5?
finished : 3?
finished : 0?
finished : 9?
finished : 8?
finished : 4?
both have finished....?

SafeSeqWithLock:100000

說一說java的concurrent包5--讀寫鎖ReadWriteLock?

concurrent包里面還提供了一個非常有用的鎖,讀寫鎖ReadWriteLock?

concurrent包里面還提供了一個非常有用的鎖,讀寫鎖ReadWriteLock?
下面是ReadWriteLock接口的說明:?
A ReadWriteLock maintains a pair of associated locks, one for read-only operations and one for writing. The read lock may be held simultaneously by multiple reader threads, so long as there are no writers. The write lock is exclusive.?

意思是說讀鎖可以有很多個鎖同時上鎖,只要當前沒有寫鎖;?
寫鎖是排他的,上了寫鎖,其他線程既不能上讀鎖,也不能上寫鎖;同樣,需要上寫鎖的前提是既沒有讀鎖,也沒有寫鎖;?
兩個寫鎖不能同時獲得無需說明,下面一段程序說明下上了讀鎖以后,其他線程需要上寫鎖也無法獲得?

Java代碼??

@Test?? public?void?testRWLock_getw_onr()?? {??ReentrantReadWriteLock?lock?=?new?ReentrantReadWriteLock();??final?Lock?rlock?=?lock.readLock();??final?Lock?wlock?=?lock.writeLock();??final?CountDownLatch?l??=?new?CountDownLatch(2);??//?start?r?thread??new?Thread(new?Runnable()?{??@Override??public?void?run()?{??System.out.println(new?Date()?+?"now?to?get?rlock");??rlock.lock();??try?{??Thread.currentThread().sleep(20?*?1000);??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??System.out.println(new?Date()?+?"now?to?unlock?rlock");??rlock.unlock();??l.countDown();??}??}).start();??//?start?w?thread??new?Thread(new?Runnable()?{??@Override??public?void?run()?{??System.out.println(new?Date()?+?"now?to?get?wlock");??wlock.lock();??System.out.println(new?Date()?+?"now?to?unlock?wlock");??wlock.unlock();??l.countDown();??}??}).start();??try?{??l.await();??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??System.out.println(new?Date()?+?"finished");?? }這代碼在我機器上打印的結果是, 也就是試圖獲得寫鎖的線程只有當另外一個線程將讀鎖釋放了以后才可以獲得?
Tue Feb 28 23:18:13 CST 2012now to get rlock?
Tue Feb 28 23:18:13 CST 2012now to get wlock?
Tue Feb 28 23:18:33 CST 2012now to unlock rlock?
Tue Feb 28 23:18:33 CST 2012now to unlock wlock?
Tue Feb 28 23:18:33 CST 2012finished?

ReadWriteLock的實現是ReentrantReadWriteLock,?
有趣的是,在一個線程中,讀鎖不能直接升級為寫鎖,但是寫鎖可以降級為讀鎖;?
這意思是,如果你已經有了讀鎖,再去試圖獲得寫鎖,將會無法獲得, 一直堵住了;?
但是如果你有了寫鎖,再去試圖獲得讀鎖,沒問題;?

下面是一段降級的代碼,?

Java代碼??

@Test?? public?void?testRWLock_downgrade()?? {??ReentrantReadWriteLock?lock?=?new?ReentrantReadWriteLock();??Lock?rlock?=?lock.readLock();??Lock?wlock?=?lock.writeLock();??System.out.println("now?to?get?wlock");??wlock.lock();??System.out.println("now?to?get?rlock");??rlock.lock();??System.out.println("now?to?unlock?wlock");??wlock.unlock();??System.out.println("now?to?unlock?rlock");??rlock.unlock();??System.out.println("finished");??}可以正常打印出?
now to get wlock?
now to get rlock?
now to unlock wlock?
now to unlock rlock?
finished?

下面是一段升級的代碼,?

Java代碼??

@Test??public?void?testRWLock_upgrade()??{??ReentrantReadWriteLock?lock?=?new?ReentrantReadWriteLock();??Lock?rlock?=?lock.readLock();??Lock?wlock?=?lock.writeLock();??System.out.println("now?to?get?rlock");??rlock.lock();??System.out.println("now?to?get?wlock");??wlock.lock();??System.out.println("now?to?unlock?wlock");??wlock.unlock();??System.out.println("now?to?unlock?rlock");??rlock.unlock();??System.out.println("finished");??}只能打印出下面兩句,后面就一直掛住了?
now to get rlock?

now to get wlock

說一說java的concurrent包6–java里面的線程基礎類Thread?

有網友建議我在介紹concurrent包之前先介紹下jdk1.5之前的多線程知識,這是個相當不錯的想法, 這篇就先介紹下Thread類;?

有網友建議我在介紹concurrent包之前先介紹下jdk1.5之前的多線程知識,這是個相當不錯的想法, 這篇就先介紹下Thread類;?
Thread類是java中的線程,幾乎所有的多線程都在Thread這個類的基礎之后展開;?
下面介紹這個類的基本用法,Thread類的最基本函數就是run函數?
public void run()?
簡單的說來,基本的創建一個完成自己功能的線程可以繼承Thread類,然后override這個run方法, 如下所示?

Java代碼??

public?class?ThreadDemo?{??@Test??public?void?testThread()??{??SimpleThread?t?=?new?SimpleThread();??t.start();??}???}?? class?SimpleThread?extends?Thread{??@Override??public?void?run()?{??System.out.println(?Thread.currentThread().getName()?+?"?is?running??");??}?? }通常在run方法里面實現自己要做的功能,這里簡單的打印了了一句話, 運行結果是?
Thread-0 is running?
啟動一個線程就是new一個自己的Thread對象,然后調用其中的start方法啟動這個線程;注意, run()方法運行結束之后這個線程的生命周期就結束了;?

上面舉的例子是說啟動一個線程就去完成一個任務,有的時候我們需要一個線程始終在跑,定期執行一些任務,然后在某個時刻停止這個線程的運行; 那么可以有類似下面的一段代碼:?

Java代碼??

public?class?ThreadDemo?{??public?static?void?main(String[]?args)??{??PeriodicalRunningThread?t?=?new?PeriodicalRunningThread();??t.start();??System.out.println("main?thread?is?going?to?sleep...");??try?{??Thread.currentThread().sleep(20?*?1000);??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??System.out.println(new?Date()?+?"?now?to?stop?PeriodicalRunningThread");??t.setRunning(false);??}??}???class?PeriodicalRunningThread?extends?Thread{??private?volatile?boolean?running?=?true;??@Override??public?void?run()?{??while(running)??{??System.out.println(new?Date()?+?"?"?+?Thread.currentThread().getName()?+??"?is?running?"?+?new?Date());??try?{??Thread.currentThread().sleep(5?*?1000);??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??}??System.out.println(new?Date()?+?"?"?+?Thread.currentThread().getName()?+?"?will?end");??}??public?void?setRunning(boolean?running)?{??this.running?=?running;??}??}這段代碼的打印結果是:?
main thread is going to sleep…?
Wed Feb 29 21:10:39 CST 2012 Thread-0 is running Wed Feb 29 21:10:39 CST 2012?
Wed Feb 29 21:10:44 CST 2012 Thread-0 is running Wed Feb 29 21:10:44 CST 2012?
Wed Feb 29 21:10:49 CST 2012 Thread-0 is running Wed Feb 29 21:10:49 CST 2012?
Wed Feb 29 21:10:54 CST 2012 Thread-0 is running Wed Feb 29 21:10:54 CST 2012?
Wed Feb 29 21:10:59 CST 2012 now to stop PeriodicalRunningThread?
Wed Feb 29 21:10:59 CST 2012 Thread-0 will end?

這里通過一個volatile的boolean值來作為標識表示這個線程的停止;?
關于這里的volatile關鍵字的使用,如有興趣可以先看這個,核桃博客也會在這個系列的后續文章中對這個關鍵字做說明?
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html?

這樣,在這個running標識為true的時候,該線程一直在跑,但是完成一段任務后會sleep一段時間,然后繼續執行;

說一說java的concurrent包7–Thread和Runnable?

這篇還是Thread和Runnable的基礎?

這篇還是Thread和Runnable的基礎?
在前面一篇的代碼里面已經介紹了Thread類的其他幾個常用的方法,?
1. sleep函數,作用是讓當前線程sleep一段時間,單位以毫秒計算;?
public static void sleep(long millis)?
2. 靜態方法Thread.currentThread(), 得到當前線程?
public static Thread currentThread()?
3. getName方法,得到當前線程名稱?
public final String getName()?

這個名稱可以在構造Thread的時候傳入, 也可以通過setName()方法設置;這個在多線程調試的時候是比較有用的,設置當前線程名,然后在log4j的輸出字符串格式里面加入%t,就可以在日志中打印當前線程名稱,方便看到當前的日志是從哪里來的;?

現在介紹下多線程里面另外一個重要的接口Runnable, 這個接口表示可以被一個線程執行的任務,事實上Thread類也實現了這個Runnable接口;?
這個接口只有一個函數, 實現者只要在里面調用代碼就可以了?
void run()?
同時, Thread類有個構造函數是傳入一個Runnable實現的;?
常用的一個用法就是通過匿名內部類來創建線程執行簡單任務,避免寫太多的類,外部需要的變量可以通過加final修飾符后傳入, 代碼例子如下:?

Java代碼??

public?static?void?testThreadWithRunnable()?? {??final?String?word?=?"hello,world";??new?Thread(new?Runnable()?{??@Override??public?void?run()?{??System.out.println(word);??}??}).start();?? }??public?static?void?main(String[]?args)?? {??//periodicalThreadTest();??testThreadWithRunnable();??}上面的代碼會打印?

hello,world

說一說java的concurrent包8–用在一個lock上的多個Condition?

concurrent系列的前一篇說到說一說java的concurrent包7–thread和runnable,現在繼續,今天介紹下Condtion這個接口,可以用在一個lock上的多個不同的情況;?

在jdk的線程同步代碼中,無論的synchronized關鍵字,或者是lock上的await/signal等,都只能在一個鎖上做同步通知;?
假設有3個線程,要對一個資源做同步,一般只能有一個鎖來做同步通知操作,那么通知的時候無法做到精確的通知3個線程中的某一個的;?
因為你調用了wait()/notify()的時候,具體的調度是jvm決定的;?

但是有的時候的確需要需要對一個鎖做多種不同情況的精確通知, 比如一個緩存,滿了和空了是兩種不同的情況,可以分別通知取數據的線程和放數據的線程;?

Condition的基本使用如下:?
* Condition是個接口,基本的方法就是await()和signal()方法;?
* Condition依賴于Lock接口,生成一個Condition的基本代碼是lock.newCondition()?
* 調用Condition的await()和signal()方法,都必須在lock保護之內,就是說必須在lock.lock()和lock.unlock之間才可以?
* 和Object.wait()方法一樣,每次調用Condition的await()方法的時候,當前線程就自動釋放了對當前鎖的擁有權?

當然,Condition其實是個接口,上面說的這幾點,在實現Condition的時候可以自由控制一點;但是jdk的javadoc說了,如果有啥特別的實現,必須要清楚的說明的;?

下一節我會結合具體的代碼來介紹下Condition的使用;

說一說java的concurrent包9–Condition的代碼例子BoundedBuffer?

面說了Condition的基本含義,今天這篇說下Condition的一個代碼例子;?
javadoc里面對Condition有一個絕佳的例子,BoundedBuffer類,就是一個線程安全的有界限的緩存;非常巧妙的利用了Condition,根據來通知不同的線程做不同的事情;?
下面先看下具體代碼:?

Java代碼??

class?BoundedBuffer?{??final?Lock?lock?=?new?ReentrantLock();??final?Condition?notFull??=?lock.newCondition();???final?Condition?notEmpty?=?lock.newCondition();???final?Object[]?items?=?new?Object[100];??int?putptr,?takeptr,?count;??public?void?put(Object?x)?throws?InterruptedException?{??lock.lock();??try?{??while?(count?==?items.length)???notFull.await();??items[putptr]?=?x;???if?(++putptr?==?items.length)?putptr?=?0;??++count;??notEmpty.signal();??}?finally?{??lock.unlock();??}??}??public?Object?take()?throws?InterruptedException?{??lock.lock();??try?{??while?(count?==?0)???notEmpty.await();??Object?x?=?items[takeptr];???if?(++takeptr?==?items.length)?takeptr?=?0;??--count;??notFull.signal();??return?x;??}?finally?{??lock.unlock();??}??}???}代碼意思不復雜,一個有界的buffer,里面是個數組,可以往里面放數據和取數據;?
由于該buffer被多個線程共享,所以每次放和取操作的時候都用一個lock保護起來;?
每次取數據(take)的時候,?
a. 如果當前個數是0(用一個count計數), 那么就調用notEmpty.await等待,鎖就釋放了;?
b. 取數據的索引專門有一個,每次向前一步; 如果到頭了就從0開始循環使用?
c.如果有數據,那就取一個數據,將count減1,同時調用notfull.signal(),?

每次放數據(put)的時候?
a.如果count和length相等,也就是滿了,那就調用notFull.await等待,釋放了鎖; 等待有一些take()調用完成之后才會進入?
b. 放數據也有一個索引putptr, 放入數據; 如果到頭了也從0開始循環使用?

c. 調用notempty.signal(); 如果有線程在take()的時候await住了,那么就會被通知到,可以繼續進行操作

說一說java的concurrent包10–Condition和BoundedBuffer的測試代碼

前面一篇說了Condition和BoundedBuffer的基本代碼,下面寫一個簡單的程序測試下這個BoundedBuffer;?

前面一篇說了Condition和BoundedBuffer的基本代碼,下面寫一個簡單的程序測試下這個BoundedBuffer;?

這段程序的目的是測試先put()后take()的操作,?
1. 我將BoundedBuffer的大小設置成5,同時在每次進入notFull和notEmpty的await()的時候打印一下表示當前線程正在等待;?
2. 先開啟10個線程做put()操作,預計有5個線程可以完成,另外5個會進入等待?
3. 主線程sleep10秒中,然后啟動10個線程做take()操作;?

這個時候,首先第一個take()必然成功完成,在這之前等待的5個put()線程都不會被喚醒, 接下來的事情就不好說了;?
剩下的5個put()線程和9個take()線程中的任何一個都可能會被jvm調度;?
比如可能出現?
a. 開始take()的時候,有5個連續的take()線程完成操作; 然后又進入put()和take()交替的情況?
b. 第一個take()之后,立刻會有一個put()線程被notFull().signal()喚醒; 然后繼續有take()和put()交替的情況;?

其中take()線程也可能進入notEmpty.await()操作;?
但是任何時候,未完成的take()線程始終>=未完成的put()線程, 這個也是很自然的;?



Java代碼??

package?com.hetaoblog.concurrent.test;??import?java.util.Date;??import?java.util.concurrent.CountDownLatch;??import?java.util.concurrent.locks.Condition;??import?java.util.concurrent.locks.Lock;??import?java.util.concurrent.locks.ReentrantLock;??import?org.junit.Test;??public?class?BoundedBufferTest?{??@Test??public?void?testPutTake()??{??final?BoundedBuffer?bb?=?new?BoundedBuffer();??int?count?=?10;??final?CountDownLatch?c?=?new?CountDownLatch(count?*?2);??System.out.println(new?Date()?+?"?now?try?to?call?put?for?"?+?count?);??for(int?i?=?0;?i?<?count?;?++i)??{??final?int?index?=?i;??try?{??Thread?t?=?new?Thread(new?Runnable()?{??@Override??public?void?run()?{??try?{??bb.put(index);??System.out.println(new?Date()?+?"??put?finished:??"?+?index);??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??c.countDown();??}??});??t.start();??}?catch?(Exception?e)?{??e.printStackTrace();??}??}??try?{??System.out.println(new?Date()?+?"?main?thread?is?going?to?sleep?for?10?seconds");??Thread.sleep(10?*?1000);??}?catch?(InterruptedException?e1)?{??e1.printStackTrace();??}??System.out.println(new?Date()?+?"?now?try?to?take?for?count:?"?+?count);??for(int?i?=0;?i?<?count;?++i)??{??Thread?t=?new?Thread(new?Runnable()?{??@Override??public?void?run()?{??try?{??Object?o?=?bb.take();??System.out.println(new?Date()?+?"?take?get:?"?+?o);??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??c.countDown();??}??});??t.start();??}??try?{??System.out.println(new?Date()?+?":?main?thread?is?to?wait?for?all?threads");??c.await();??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??System.out.println(new?Date()?+?"?all?threads?finished");??}??}??class?BoundedBuffer?{??final?Lock?lock?=?new?ReentrantLock();??final?Condition?notFull??=?lock.newCondition();???final?Condition?notEmpty?=?lock.newCondition();???final?Object[]?items?=?new?Object[5];??int?putptr,?takeptr,?count;??public?void?put(Object?x)?throws?InterruptedException?{??lock.lock();??try?{??while?(count?==?items.length)???{??System.out.println(new?Date()?+?"?put??is?to?wait....");??notFull.await();??}??items[putptr]?=?x;???if?(++putptr?==?items.length)?putptr?=?0;??++count;??notEmpty.signal();??}?finally?{??lock.unlock();??}??}??public?Object?take()?throws?InterruptedException?{??lock.lock();??try?{??while?(count?==?0)??{??System.out.println(new?Date()?+?"?take?is?going?to?wait..");??notEmpty.await();??}??Object?x?=?items[takeptr];???if?(++takeptr?==?items.length)?takeptr?=?0;??--count;??notFull.signal();??return?x;??}?finally?{??lock.unlock();??}??}???}下面是這段程序在我機器上的運行結果:?

這是其中一個執行結果,正好對應前面說的情況a, 5個take()先完成;這里出現了take()線程調用notEmpty.await()的情況?
Thu Mar 15 21:15:13 CST 2012 now try to call put for 10?
Thu Mar 15 21:15:13 CST 2012 put finished: 0?
Thu Mar 15 21:15:13 CST 2012 put finished: 2?
Thu Mar 15 21:15:13 CST 2012 put finished: 3?
Thu Mar 15 21:15:13 CST 2012 put finished: 1?
Thu Mar 15 21:15:13 CST 2012 main thread is going to sleep for 10 seconds?
Thu Mar 15 21:15:13 CST 2012 put finished: 4?
Thu Mar 15 21:15:13 CST 2012 put is to wait....?
Thu Mar 15 21:15:13 CST 2012 put is to wait....?
Thu Mar 15 21:15:13 CST 2012 put is to wait....?
Thu Mar 15 21:15:13 CST 2012 put is to wait....?
Thu Mar 15 21:15:13 CST 2012 put is to wait....?
Thu Mar 15 21:15:23 CST 2012 now try to take for count: 10?
Thu Mar 15 21:15:23 CST 2012 take get: 3?
Thu Mar 15 21:15:23 CST 2012 take get: 2?
Thu Mar 15 21:15:23 CST 2012 take get: 1?
Thu Mar 15 21:15:23 CST 2012 take get: 0?
Thu Mar 15 21:15:23 CST 2012 take get: 4?
Thu Mar 15 21:15:23 CST 2012 put finished: 5?
Thu Mar 15 21:15:23 CST 2012: main thread is to wait for all threads?
Thu Mar 15 21:15:23 CST 2012 take is going to wait..?
Thu Mar 15 21:15:23 CST 2012 take get: 5?
Thu Mar 15 21:15:23 CST 2012 put finished: 6?
Thu Mar 15 21:15:23 CST 2012 put finished: 8?
Thu Mar 15 21:15:23 CST 2012 put finished: 7?
Thu Mar 15 21:15:23 CST 2012 put finished: 9?
Thu Mar 15 21:15:23 CST 2012 take get: 6?
Thu Mar 15 21:15:23 CST 2012 take get: 7?
Thu Mar 15 21:15:23 CST 2012 take get: 8?
Thu Mar 15 21:15:23 CST 2012 take get: 9?
Thu Mar 15 21:15:23 CST 2012 all threads finished?

這是另一個執行結果:?
Thu Mar 15 21:02:49 CST 2012 now try to call put for 10?
Thu Mar 15 21:02:49 CST 2012 put finished: 3?
Thu Mar 15 21:02:49 CST 2012 put finished: 1?
Thu Mar 15 21:02:49 CST 2012 put finished: 0?
Thu Mar 15 21:02:49 CST 2012 put finished: 2?
Thu Mar 15 21:02:49 CST 2012 put finished: 4?
Thu Mar 15 21:02:49 CST 2012 put is to wait....?
Thu Mar 15 21:02:49 CST 2012 put is to wait....?
Thu Mar 15 21:02:49 CST 2012 put is to wait....?
Thu Mar 15 21:02:49 CST 2012 main thread is going to sleep for 10 seconds?
Thu Mar 15 21:02:49 CST 2012 put is to wait....?
Thu Mar 15 21:02:49 CST 2012 put is to wait....?
Thu Mar 15 21:02:59 CST 2012 now try to take for count: 10?
Thu Mar 15 21:02:59 CST 2012 take get: 1?
Thu Mar 15 21:02:59 CST 2012 take get: 0?
Thu Mar 15 21:02:59 CST 2012 take get: 3?
Thu Mar 15 21:02:59 CST 2012 take get: 4?
Thu Mar 15 21:02:59 CST 2012: main thread is to wait for all threads?
Thu Mar 15 21:02:59 CST 2012 take is going to wait..?
Thu Mar 15 21:02:59 CST 2012 take is going to wait..?
Thu Mar 15 21:02:59 CST 2012 put finished: 5?
Thu Mar 15 21:02:59 CST 2012 take get: 2?
Thu Mar 15 21:02:59 CST 2012 take get: 5?
Thu Mar 15 21:02:59 CST 2012 take is going to wait..?
Thu Mar 15 21:02:59 CST 2012 take is going to wait..?
Thu Mar 15 21:02:59 CST 2012 put finished: 7?
Thu Mar 15 21:02:59 CST 2012 put finished: 6?
Thu Mar 15 21:02:59 CST 2012 put finished: 8?
Thu Mar 15 21:02:59 CST 2012 put finished: 9?
Thu Mar 15 21:02:59 CST 2012 take get: 7?
Thu Mar 15 21:02:59 CST 2012 take get: 6?
Thu Mar 15 21:02:59 CST 2012 take get: 8?
Thu Mar 15 21:02:59 CST 2012 take get: 9?
Thu Mar 15 21:02:59 CST 2012 all threads finished?

執行結果2:?
Thu Mar 15 21:14:30 CST 2012 now try to call put for 10?
Thu Mar 15 21:14:30 CST 2012 main thread is going to sleep for 10 seconds?
Thu Mar 15 21:14:30 CST 2012 put finished: 8?
Thu Mar 15 21:14:30 CST 2012 put finished: 6?
Thu Mar 15 21:14:30 CST 2012 put finished: 2?
Thu Mar 15 21:14:30 CST 2012 put finished: 0?
Thu Mar 15 21:14:30 CST 2012 put finished: 4?
Thu Mar 15 21:14:30 CST 2012 put is to wait....?
Thu Mar 15 21:14:30 CST 2012 put is to wait....?
Thu Mar 15 21:14:30 CST 2012 put is to wait....?
Thu Mar 15 21:14:30 CST 2012 put is to wait....?
Thu Mar 15 21:14:30 CST 2012 put is to wait....?
Thu Mar 15 21:14:40 CST 2012 now try to take for count: 10?
Thu Mar 15 21:14:40 CST 2012 take get: 8?
Thu Mar 15 21:14:40 CST 2012 take get: 6?
Thu Mar 15 21:14:40 CST 2012 take get: 4?
Thu Mar 15 21:14:40 CST 2012 take get: 2?
Thu Mar 15 21:14:40 CST 2012: main thread is to wait for all threads?
Thu Mar 15 21:14:40 CST 2012 take get: 0?
Thu Mar 15 21:14:40 CST 2012 take is going to wait..?
Thu Mar 15 21:14:40 CST 2012 take is going to wait..?
Thu Mar 15 21:14:40 CST 2012 take is going to wait..?
Thu Mar 15 21:14:40 CST 2012 put finished: 1?
Thu Mar 15 21:14:40 CST 2012 put finished: 5?
Thu Mar 15 21:14:40 CST 2012 put finished: 3?
Thu Mar 15 21:14:40 CST 2012 put finished: 9?
Thu Mar 15 21:14:40 CST 2012 take get: 1?
Thu Mar 15 21:14:40 CST 2012 put finished: 7?
Thu Mar 15 21:14:40 CST 2012 take get: 5?
Thu Mar 15 21:14:40 CST 2012 take get: 3?
Thu Mar 15 21:14:40 CST 2012 take get: 7?
Thu Mar 15 21:14:40 CST 2012 take get: 9?
Thu Mar 15 21:14:40 CST 2012 all threads finished?

在幾次不同的執行中,始終可以觀察到任何時候,未完成的take()線程數>= 未完成的put()線程; 在未完成的線程數相等的情況下,即使jvm首先調度到了take()線程,也會進入notEmpty.await()釋放鎖,進入等待

說一說java的concurrent包11–Condition和BoundedBuffer的測試代碼2?

前面一篇說了一個Condition和BoundedBuffer的測試代碼例子,前面測試的是先put()再take()的操作,這篇說一下先take()再put()的操作;?

前面一篇說了一個Condition和BoundedBuffer的測試代碼例子,前面測試的是先put()再take()的操作,這篇說一下先take()再put()的操作;?
當然,必須先要說明的是,這篇和前面這篇在打印日志的時候其實是有錯誤的,這個錯誤在前面一篇并不明顯,不會導致明顯的問題;?
但是同樣的原因導致現在這個先take()再put()的操作會出現明顯的錯誤,看上去會顯得不可思議;?
具體情況留到下一篇詳細說明,這里先上測試目的,測試代碼和運行結果;?
同時說明多線程編程需要非常謹慎,否則極易出錯?

測試目的:?
1. 我將BoundedBuffer的大小設置成5,同時在每次進入notFull和notEmpty的await()的時候打印一下表示當前線程正在等待;?
2. 先開啟10個線程做take()操作,由于開始BoundedBuffer里面沒有東西,所以10個線程全部調用await進入等待?
3. 主線程sleep10秒中,然后啟動10個線程做put()操作;?
在第一個put()完成之后,接下來應該會有部分put()線程和take()線程先后完成;?
理論上,?
a. 任何一個元素的put()都會發生在take()之前;?
b. 如果X表示某個操作成功的次數,在X(put)-X(take)<5的時候,put線程不會進入等待狀態?


下面是測試代碼:?



Java代碼??

????@Test??public?void?testTakePut()??{??final?BoundedBuffer?bb?=?new?BoundedBuffer();??int?count?=?10;??final?CountDownLatch?c?=?new?CountDownLatch(count?*?2);??System.out.println(new?Date()?+?"?first?try?to?call?take?for?count:?"?+?count);??for(int?i?=0;?i?<?count;?++i)??{??final?int?index?=?i;??Thread?t=?new?Thread(new?Runnable()?{??@Override??public?void?run()?{??try?{??Thread.currentThread().setName("?TAKE?"?+?index);??Object?o?=?bb.take();??System.out.println(new?Date()?+?"?"?+?"?take?get:?"?+?o?);??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??c.countDown();??}??});??t.start();??}??try?{??System.out.println(new?Date()?+?"?main?thread?is?going?to?sleep?for?10?seconds");??Thread.sleep(10?*?1000);??}?catch?(InterruptedException?e1)?{??e1.printStackTrace();??}??System.out.println(new?Date()?+?"?now?try?to?call?put?for?"?+?count?);??for(int?i?=?0;?i?<?count?;?++i)??{??final?int?index?=?i;??try?{??Thread?t?=?new?Thread(new?Runnable()?{??@Override??public?void?run()?{??Thread.currentThread().setName("?PUT?"?+?index);??try?{??bb.put(index);??System.out.println(new?Date()?+?"?"?+?"??put?finished:??"?+?index?);??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??c.countDown();??}??});??t.start();??}?catch?(Exception?e)?{??e.printStackTrace();??}??}??try?{??System.out.println(new?Date()?+?":?main?thread?is?to?wait?for?all?threads");??c.await();??}?catch?(InterruptedException?e)?{??e.printStackTrace();??}??System.out.println(new?Date()?+?"?all?threads?finished");??}??class?BoundedBuffer?{??final?Lock?lock?=?new?ReentrantLock();??final?Condition?notFull??=?lock.newCondition();???final?Condition?notEmpty?=?lock.newCondition();???final?Object[]?items?=?new?Object[5];??int?putptr,?takeptr,?count;??public?void?put(Object?x)?throws?InterruptedException?{??lock.lock();??try?{??while?(count?==?items.length)???{??System.out.println(new?Date()?+?"?"?+?Thread.currentThread().getName()?+?"?put??is?to?wait....:?"?+?System.currentTimeMillis());????notFull.await();??}??items[putptr]?=?x;???if?(++putptr?==?items.length)?putptr?=?0;??++count;??notEmpty.signal();??}?finally?{??lock.unlock();??}??}??public?Object?take()?throws?InterruptedException?{??lock.lock();??try?{??while?(count?==?0)??{??System.out.println(new?Date()?+?"?"?+?Thread.currentThread().getName()?+?"?take?is?going?to?wait..?"?+?System.currentTimeMillis());????notEmpty.await();??}??Object?x?=?items[takeptr];???if?(++takeptr?==?items.length)?takeptr?=?0;??--count;??notFull.signal();??return?x;??}?finally?{??lock.unlock();??}??}???}運行結果1:?
Fri Mar 16 20:50:10 CST 2012 first try to call take for count: 10?
Fri Mar 16 20:50:10 CST 2012 TAKE 0 take is going to wait..?
Fri Mar 16 20:50:10 CST 2012 TAKE 1 take is going to wait..?
Fri Mar 16 20:50:10 CST 2012 TAKE 2 take is going to wait..?
Fri Mar 16 20:50:10 CST 2012 TAKE 3 take is going to wait..?
Fri Mar 16 20:50:10 CST 2012 TAKE 5 take is going to wait..?
Fri Mar 16 20:50:10 CST 2012 main thread is going to sleep for 10 seconds?
Fri Mar 16 20:50:10 CST 2012 TAKE 4 take is going to wait..?
Fri Mar 16 20:50:10 CST 2012 TAKE 7 take is going to wait..?
Fri Mar 16 20:50:10 CST 2012 TAKE 6 take is going to wait..?
Fri Mar 16 20:50:10 CST 2012 TAKE 9 take is going to wait..?
Fri Mar 16 20:50:10 CST 2012 TAKE 8 take is going to wait..?
Fri Mar 16 20:50:20 CST 2012 now try to call put for 10?
Fri Mar 16 20:50:20 CST 2012: main thread is to wait for all threads?
Fri Mar 16 20:50:20 CST 2012 PUT 7 put finished: 7?
Fri Mar 16 20:50:20 CST 2012 PUT 9 put finished: 9?
Fri Mar 16 20:50:20 CST 2012 PUT 8 put finished: 8?
Fri Mar 16 20:50:20 CST 2012 PUT 3 put is to wait....?
Fri Mar 16 20:50:20 CST 2012 PUT 1 put is to wait....?
Fri Mar 16 20:50:20 CST 2012 PUT 5 put finished: 5?
Fri Mar 16 20:50:20 CST 2012 PUT 4 put is to wait....?
Fri Mar 16 20:50:20 CST 2012 TAKE 0 take get: 8?
Fri Mar 16 20:50:20 CST 2012 TAKE 2 take get: 9?
Fri Mar 16 20:50:20 CST 2012 TAKE 3 take get: 0?
Fri Mar 16 20:50:20 CST 2012 TAKE 5 take get: 6?
Fri Mar 16 20:50:20 CST 2012 TAKE 4 take get: 5?
Fri Mar 16 20:50:20 CST 2012 PUT 2 put finished: 2?
Fri Mar 16 20:50:20 CST 2012 PUT 3 put finished: 3?
Fri Mar 16 20:50:20 CST 2012 PUT 1 put finished: 1?
Fri Mar 16 20:50:20 CST 2012 TAKE 7 take get: 2?
Fri Mar 16 20:50:20 CST 2012 TAKE 6 take get: 3?
Fri Mar 16 20:50:20 CST 2012 TAKE 9 take get: 1?
Fri Mar 16 20:50:20 CST 2012 TAKE 8 take get: 4?
Fri Mar 16 20:50:20 CST 2012 PUT 6 put finished: 6?
Fri Mar 16 20:50:20 CST 2012 PUT 0 put finished: 0?
Fri Mar 16 20:50:20 CST 2012 PUT 4 put finished: 4?
Fri Mar 16 20:50:20 CST 2012 TAKE 1 take get: 7?
Fri Mar 16 20:50:20 CST 2012 all threads finished?

注意到紅色部分:?
第一個加為紅色是因為按照打印結果,put()只完成了3次,就開始有put()進入等待了,而BoundedBuffer的大小是5,理論上應該沒有滿的!?
第二個加為紅色是因為元素4竟然先被take,然后再被put!?顯然程序有地方出錯了!具體原因分析,歡迎關注核桃博客:)

轉載于:https://my.oschina.net/u/1185331/blog/502350

總結

以上是生活随笔為你收集整理的java concurrent包介绍及使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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

天天干天天操天天入 | 91精品国自产在线观看 | 久视频在线播放 | 日韩av午夜 | 亚洲精品视频在线观看网站 | 久久亚洲影视 | 九九热免费在线观看 | 在线欧美中文字幕 | 在线观看视频福利 | 午夜精品一区二区三区四区 | 亚洲精品乱码久久久久久写真 | 在线观看国产日韩欧美 | 92国产精品久久久久首页 | 日韩精品一卡 | 三级动图 | 国产999精品久久久久久 | 国产涩图 | 中文字幕黄色网址 | 日本久久高清视频 | 久久综合福利 | 国产亚洲一级高清 | 综合影视 | 精品久久久影院 | 黄色av一区二区三区 | 国产免费影院 | 欧美日韩视频免费 | 国产美女视频网站 | 亚洲国产日韩欧美在线 | 五月开心婷婷网 | av中文天堂| 欧美激情综合色综合啪啪五月 | 免费国产一区二区视频 | 人人爱在线视频 | 草莓视频在线观看免费观看 | 日韩高清精品一区二区 | 四川bbb搡bbb爽爽视频 | 国产三级精品三级在线观看 | 日韩免费在线观看 | 五月激情在线 | 日韩乱码中文字幕 | 97色在线观看免费视频 | 在线中文字幕一区二区 | 久久国产美女视频 | 四虎永久精品在线 | 五月天色丁香 | 久草av在线播放 | 精品国产欧美一区二区三区不卡 | 久久成人免费 | 国产99久久精品 | 色a综合 | 久草在线国产 | 一本一道久久a久久综合蜜桃 | 天天曰天天 | 一级黄色片在线免费看 | 国产精品电影在线 | 欧美日韩在线观看视频 | 国产亚洲免费观看 | 免费h精品视频在线播放 | 国产视频 亚洲视频 | 久久久高清| 亚洲精品美女 | 国产精品一区久久久久 | 日韩精品一区二区三区水蜜桃 | 亚洲影院一区 | 日日爱网站 | av电影中文字幕在线观看 | 久久av影视| 色就色,综合激情 | 亚洲精品无 | 久久久片 | 亚洲精品中文在线资源 | 69av在线视频 | 肉色欧美久久久久久久免费看 | 狠狠做深爱婷婷综合一区 | 国产黄视频在线观看 | 亚洲国产天堂av | 免费久久99精品国产 | 99精品视频免费看 | 又爽又黄又无遮挡网站动态图 | 久久五月天色综合 | 黄色网址av | 免费看黄色小说的网站 | 欧美久久成人 | 国产在线播放不卡 | 精品久久久免费 | 三级在线视频观看 | 久久人人看 | 久久激情综合网 | 婷婷六月天天 | 中文字幕在线播放第一页 | 一区二区视频在线免费观看 | 欧美另类交在线观看 | 人人爽影院 | 91九色蝌蚪视频在线 | 在线中文字幕播放 | 欧美日本高清视频 | 波多野结衣日韩 | 亚洲欧美视频在线播放 | 国产精品男女视频 | 亚洲第一久久久 | 天天插狠狠干 | 中文字幕二区三区 | 国产最新福利 | 亚洲va在线va天堂va偷拍 | 久久精品国产成人 | 色狠狠综合 | 四虎在线免费观看 | 美女网站黄在线观看 | 国产尤物在线观看 | 96精品视频 | 就要色综合 | 91精品第一页 | 婷婷在线视频观看 | 91大神dom调教在线观看 | www黄在线| 午夜精品久久久久 | 成人精品久久久 | 国产精品免费久久久久久 | 国产午夜一级毛片 | 天天色成人 | 最近中文字幕高清字幕免费mv | 中文在线资源 | 精品人妖videos欧美人妖 | 亚洲理论在线 | 久久久久国产a免费观看rela | 国产 亚洲 欧美 在线 | 香蕉成人在线视频 | 日本丰满少妇免费一区 | av网站在线免费观看 | 91精品国产一区二区三区 | 激情五月综合网 | 99视频这里只有 | 天堂资源在线观看视频 | 亚洲国产av精品毛片鲁大师 | 久久婷婷色综合 | 在线播放精品一区二区三区 | 五月婷婷激情网 | 超碰最新网址 | 中文av在线天堂 | 国产美女精品在线 | 91麻豆精品国产91久久久无限制版 | 久久av高清 | 四虎最新域名 | 西西444www大胆高清视频 | 欧美色道 | 亚洲狠狠操 | 久久99久久99精品免观看粉嫩 | 五月婷婷一级片 | 国产在线高清 | 九九九在线| 91资源在线| 国产精品亚洲精品 | 午夜性生活片 | 天天弄天天干 | 亚洲国产欧洲综合997久久, | 国产一区二区免费在线观看 | 久久久免费精品 | 久久艹艹| 日韩精品在线观看av | 国产在线a免费观看 | 最新日韩视频 | 久久久久久久国产精品 | 久久色亚洲 | 中文字幕在线成人 | 中文字幕日本特黄aa毛片 | 中文字幕资源在线 | 黄色的网站在线 | 天天射天天干天天操 | www.天天成人国产电影 | 国产乱对白刺激视频不卡 | 在线激情影院一区 | 亚洲一级黄色片 | 欧美极度另类性三渗透 | 91亚洲精品久久久蜜桃借种 | 激情大尺度视频 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 久久一区二区免费视频 | av中文字幕第一页 | 狠狠干狠狠操 | 中文在线a√在线 | 在线观看国产日韩 | 天天爱天天爽 | 中文字幕在线免费看线人 | 手机看片国产日韩 | 波多野结衣在线播放视频 | 国产成人精品免费在线观看 | 国产福利电影网址 | 亚洲国产精品电影在线观看 | 国产精品永久免费在线 | 亚洲午夜久久久久久久久电影网 | 国产人成看黄久久久久久久久 | 亚洲成人在线免费 | 亚州精品一二三区 | 黄在线免费看 | 欧美激情h | 亚洲精品影院在线观看 | 91av手机在线观看 | 黄色免费电影网站 | 免费高清在线视频一区· | 黄色片亚洲 | 日韩精品在线免费观看 | 91完整视频 | 国产精品18久久久久久久 | 日韩免费福利 | av在线网站免费观看 | 欧美韩日在线 | 亚洲精品短视频 | 一本一本久久a久久精品牛牛影视 | 在线观看黄色av | 色婷婷狠狠五月综合天色拍 | 国产精品久久亚洲 | 肉色欧美久久久久久久免费看 | 婷婷伊人网 | 99久久精品国产毛片 | 国产理论一区二区三区 | 美女免费网视频 | 日日爱夜夜爱 | www色av| 黄色软件大全网站 | 97超碰资源总站 | 久久久福利| 久久精品久久综合 | 国产精品毛片一区视频播不卡 | 成年人app网址 | 婷婷色狠狠 | 国产精品原创在线 | 日本黄色免费观看 | 免费看成人 | 欧美日韩国产一区二区三区 | 99视频在线免费观看 | 国产精品99在线播放 | 日韩激情视频 | 亚洲国产午夜视频 | 色婷婷激情四射 | 成人精品一区二区三区中文字幕 | 99高清视频有精品视频 | 91成人精品国产刺激国语对白 | 日韩在线不卡 | 九九久久久久久久久激情 | 91视视频在线直接观看在线看网页在线看 | 999成人| 九九久久免费视频 | 91桃色视频 | 九九涩涩av台湾日本热热 | 国产精品久久精品国产 | 国产精品va在线观看入 | 特级黄色电影 | 国产男女无遮挡猛进猛出在线观看 | 四虎影视成人精品国库在线观看 | 波多野结衣视频一区 | 97av.com| 亚洲视频在线观看 | 久久综合久久88 | 91丨九色丨蝌蚪丨对白 | 国产精品igao视频网入口 | 欧美性大战 | 亚洲在线成人精品 | 国产精品美女免费 | 91精品国产综合久久福利不卡 | 日韩免费播放 | 久久久久久久久久久久久国产精品 | 91香蕉视频好色先生 | 98精品国产自产在线观看 | 亚洲视频久久久 | 人人玩人人爽 | 免费高清影视 | 国产一区自拍视频 | 少妇啪啪av入口 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 日韩在线第一区 | 亚洲电影自拍 | 91丨精品丨蝌蚪丨白丝jk | 国产精品中文在线 | 日韩av手机在线观看 | 射久久| 日日日操操 | 在线观看电影av | 97在线观看| av资源在线观看 | 免费观看国产精品 | 国产在线观看免费av | 91亚洲综合 | 在线三级播放 | 国产一级片播放 | av 一区 二区 久久 | 日日干 天天干 | 黄免费网站 | 一级成人网 | 色婷婷综合久久久中文字幕 | 夜夜操网 | 亚洲精品国产精品国自产观看浪潮 | 日p在线观看 | 色天天天 | 狠狠狠狠狠干 | 欧美午夜精品久久久久 | 欧美一进一出抽搐大尺度视频 | 午夜体验区 | 久色婷婷 | 国产伦精品一区二区三区免费 | 国产一区二区精品在线 | 亚洲精品美女 | 亚洲欧美国产精品va在线观看 | 日韩中文三级 | 天天射综合 | 亚洲人成人天堂h久久 | 亚洲在线国产 | 美女视频黄色免费 | 成 人 黄 色视频免费播放 | 欧美日韩在线观看不卡 | 在线看片成人 | 午夜视频一区二区 | 日韩精品视频免费看 | 欧美成人高清 | 一本一道波多野毛片中文在线 | 99精品热视频| 黄色一级免费 | a在线观看视频 | 国产中文字幕一区二区三区 | 色网站在线免费 | 在线亚洲午夜片av大片 | 九九热免费观看 | 在线观看不卡视频 | 日韩免费一区 | 69国产精品成人在线播放 | 午夜视频欧美 | 久久伊人爱 | 久久久久久97三级 | 久草精品在线观看 | 久久久久国产成人精品亚洲午夜 | 999精品 | 久久一精品 | 日夜夜精品视频 | 日韩在线视频免费观看 | 精品夜夜嗨av一区二区三区 | 美女网站在线观看 | 综合中文字幕 | 毛片网站在线观看 | av日韩不卡 | 亚洲理论电影 | 伊人影院99 | 成年美女黄网站色大片免费看 | 久久99精品久久久久久久久久久久 | 日韩有码中文字幕在线 | 久草在线高清视频 | 黄网站免费久久 | 中文字幕亚洲精品日韩 | 国产精品99久久99久久久二8 | 偷拍精偷拍精品欧洲亚洲网站 | 久久艹人人 | 精品久久久久久亚洲综合网站 | 一区二区视频在线看 | 国产91丝袜在线播放动漫 | 天天操夜夜逼 | 久久免费视频1 | 99r在线视频 | 91精品爽啪蜜夜国产在线播放 | 美女免费网视频 | 国产精品毛片一区二区在线看 | 中文字幕在线免费播放 | 黄色成年网站 | 女人18毛片90分钟 | 日日夜夜免费精品 | 99久久精品国产亚洲 | 国产亚洲一区二区在线观看 | 日韩av中文字幕在线免费观看 | 99视频在线精品国自产拍免费观看 | 成人黄色免费在线观看 | 日韩在线电影一区二区 | 91免费看黄| 欧美日本不卡 | 国产美女在线观看 | 日本三级在线观看中文字 | 91丨九色丨高潮 | 毛片网免费 | 麻豆手机在线 | 亚洲九九九在线观看 | 久久99精品国产99久久6尤 | 久久99国产精品久久 | 亚洲欧洲精品一区二区精品久久久 | 精品在线观看国产 | 免费观看xxxx9999片 | 色停停五月天 | 午夜12点 | 国产资源免费在线观看 | 亚洲精品日韩av | 精品视频在线看 | 91成人短视频在线观看 | 99久久精品午夜一区二区小说 | 狠狠干网站 | 国产精品久久久一区二区三区网站 | 操综合 | 精品一二区 | 综合天天网 | 免费黄色在线网站 | 久草在线一免费新视频 | 日韩 精品 一区 国产 麻豆 | 91人人爱| 国产精品毛片一区视频 | 久久永久免费视频 | 天天操操操操操操 | 中文字幕在线观看播放 | 天天射天天干 | 808电影 | 欧美午夜激情网 | 欧美日韩国内在线 | 中中文字幕av | 伊人国产在线播放 | 中文字幕在线字幕中文 | www免费在线观看 | 免费av片在线 | www.com黄| 99国产精品一区二区 | 久久国产午夜精品理论片最新版本 | www操操操 | 日韩精品91偷拍在线观看 | 免费亚洲精品视频 | 99久久婷婷国产综合精品 | 4438全国亚洲精品观看视频 | 91成人免费观看视频 | 久久久福利| 亚洲综合成人婷婷小说 | 国产高清在线视频 | 日韩久久精品一区二区 | 日韩91av | 国内外成人免费在线视频 | 日本视频久久久 | 99精品色 | 男女免费视频观看 | 国产精品欧美久久久久久 | 国产91成人在在线播放 | 美女网站色 | 狠狠色丁香婷婷综合橹88 | 天天射日 | 国产免费专区 | 日韩毛片在线一区二区毛片 | 久草青青在线观看 | 高清av免费观看 | 色视频在线观看免费 | 97超碰总站 | 99精品在线免费在线观看 | 日韩性久久 | 欧美孕妇与黑人孕交 | 久久久久美女 | 91最新在线视频 | 日韩欧美一级二级 | 99精品国产高清在线观看 | 欧美日韩激情网 | 91久久丝袜国产露脸动漫 | 中文字幕欧美三区 | 色婷婷狠狠18 | 欧美日韩网站 | 精品国产精品久久一区免费式 | 久久一区精品 | 中文字幕久久精品 | 欧美日韩免费在线视频 | 国产免费一区二区三区网站免费 | 成人a视频| 9999毛片| www.黄色网.com| 高清国产午夜精品久久久久久 | 九九免费在线视频 | 欧美精品亚州精品 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 精品免费久久久久久 | 色是在线视频 | ww视频在线观看 | 午夜少妇一区二区三区 | 在线观看色网 | 中文字幕在线观看不卡 | 午夜黄色大片 | 亚洲视频第一页 | 国内精品久久久久久久影视麻豆 | 久久久国产毛片 | 91九色免费视频 | 在线观看视频一区二区 | 午夜精品久久久久久 | av一级在线 | 亚洲成成品网站 | 久久久精品午夜 | a黄色片| 黄a在线看| 国产成在线观看免费视频 | 黄色一区二区在线观看 | 99在线免费视频 | 免费三级大片 | 午夜成人免费电影 | 人人澡人人澡人人 | 亚洲欧美在线视频免费 | 久久99精品久久久久久三级 | 日韩色在线 | 最新av电影网址 | 欧美在线视频一区二区三区 | 久久久久福利视频 | 天天干天天射天天爽 | av中文字幕日韩 | 91精品国产三级a在线观看 | 久久久久免费电影 | 在线观看免费国产小视频 | 人人插人人费 | 亚洲国产大片 | 国产视频在线免费 | 国产一区二区在线免费播放 | 精品一区中文字幕 | 日韩网页 | 91尤物在线播放 | 中文字幕在线观看你懂的 | 中文字幕人成人 | 国产精品久久久久久久久软件 | 欧美色图88 | 日韩久久一区二区 | 色婷婷www | 四虎天堂 | 日韩精品一区二区三区电影 | 久久久久久看片 | 久草视频精品 | 国产最新精品视频 | 热久久这里只有精品 | 国产精品岛国久久久久久久久红粉 | 亚洲免费在线看 | 99riav1国产精品视频 | 婷婷九月激情 | 热99在线| 日本中文字幕在线一区 | 国产成人区 | 日韩高清免费在线观看 | 天天做天天干 | 青春草免费视频 | 久9在线 | 日韩中文字幕视频在线观看 | 久久久综合香蕉尹人综合网 | 伊人日日干 | 成人午夜精品福利免费 | 成人免费亚洲 | 精品a在线 | 亚洲播播 | 在线观看免费一区 | 天天干天天做天天爱 | av黄色影院 | 久久久久国产精品免费网站 | 成人av一级片 | www.av中文字幕.com | 在线观看亚洲电影 | 久久久国产精品成人免费 | 日韩在线观看视频中文字幕 | 欧美日韩在线视频免费 | 五月婷婷综合网 | av免费看av| 欧美精品一区二区三区一线天视频 | 91三级在线观看 | 91九色网站| 免费观看一级视频 | 成人在线播放免费观看 | 极品美女被弄高潮视频网站 | avcom在线 | 国产精品成人一区二区三区吃奶 | 久久99精品久久久久久三级 | 91麻豆精品国产91久久久无限制版 | 五月婷婷综合在线观看 | 色姑娘综合天天 | 欧美另类一二三四区 | av中文字幕在线免费观看 | 日本最新中文字幕 | 在线观看av国产 | 中国成人一区 | 国产一级淫片免费看 | 亚洲人成免费网站 | 黄色动态图xx | 国产高清久久久 | 超碰在线97观看 | 狠狠干夜夜 | 国产中文字幕在线播放 | 男女激情免费网站 | 亚洲va在线va天堂va偷拍 | 91正在播放 | 四虎影视成人永久免费观看亚洲欧美 | 久久精品一区二区三区四区 | 激情视频二区 | 久久久久久久久久久高潮一区二区 | 亚洲精品乱码久久久久久蜜桃不爽 | 中文字幕免费观看视频 | 欧美午夜性生活 | 在线综合色| 97福利在线 | 久久综合桃花 | 日韩激情精品 | 欧美久久99| 久草网站在线观看 | 亚洲精品色视频 | 精品久久五月天 | 欧美一区二区在线看 | 国产不卡精品 | 国产一区二区在线影院 | 国产精品一区二区久久久 | 久久久久久免费毛片精品 | 国产婷婷视频在线 | 丁香花中文字幕 | 国产在线观看不卡 | 99久久精品免费看 | 91亚洲精品乱码久久久久久蜜桃 | 日本久久综合视频 | 国产亚州精品视频 | 亚洲久久视频 | 一区二区高清在线 | 久久久久久久18 | 精品国产乱码一区二区三区在线 | 欧美日韩亚洲在线 | 婷婷天天色 | 91av网址 | 亚洲婷久久 | 国产视频高清 | 天天艹天天干天天 | 亚洲一区二区三区在线看 | av播放在线 | 国产在线观看一 | 日韩视频在线播放 | 国产一区二区三区网站 | 欧美三人交 | 久99久在线视频 | 欧美一区二区免费在线观看 | 亚洲精品一区二区18漫画 | 999亚洲国产996395 | 91看片看淫黄大片 | 久久超级碰 | 婷婷精品在线 | 天天操 夜夜操 | 欧美三级高清 | 干天天 | 成人黄色小说视频 | 欧美日韩国产网站 | 97品白浆高清久久久久久 | 亚洲免费精彩视频 | 2022中文字幕在线观看 | 久久黄色免费视频 | 日韩视| 亚洲v欧美v国产v在线观看 | 国产做aⅴ在线视频播放 | 综合激情av | 日韩伦理片hd | 日本精品视频在线观看 | 高清中文字幕av | 久久久久久久久久久成人 | 久久99国产精品免费 | 久久成视频 | 亚洲国产一区二区精品专区 | 国产午夜影院 | 日本aa在线 | 久草在线视频在线观看 | 国外成人在线视频网站 | 91久久奴性调教 | 免费午夜av | 一级理论片在线观看 | 亚洲好视频 | 日本中文字幕网站 | a国产精品 | 国产精品一区二区白浆 | 91成人在线观看高潮 | 久久久久麻豆v国产 | 热精品 | 日本久久久久久久久久 | 日韩欧美精品一区二区三区经典 | 久久任你操| 91最新视频在线观看 | 免费看三级黄色片 | 在线韩国电影免费观影完整版 | 亚洲精区二区三区四区麻豆 | 精品国产一区二区三区日日嗨 | 操久久免费视频 | 人人干人人艹 | 久久久久国产一区二区三区四区 | 97人人艹 | 免费在线国产精品 | 国产无套一区二区三区久久 | 手机看片99 | 在线中文字幕视频 | 国内精品久久影院 | 欧美最新另类人妖 | 97久久精品午夜一区二区 | 狠狠躁18三区二区一区ai明星 | 国产成人在线综合 | 日本公妇色中文字幕 | 18做爰免费视频网站 | 天天爽夜夜操 | 日韩一级理论片 | 国产中文字幕在线观看 | 日韩久久网站 | 亚洲乱码精品久久久久 | 精品国产美女 | 亚洲欧美激情插 | 久久精品亚洲一区二区三区观看模式 | 在线小视频你懂得 | 欧美激情视频一二区 | 国产主播99| 日韩欧美99 | 国产精品久久久久久久久久久久久久 | 亚洲精品激情 | 色97在线 | 国产精品com | 日韩在线不卡av | 国产成人黄色在线 | 亚洲开心激情 | 精品无人国产偷自产在线 | 玖玖玖精品| 337p欧美 | 国内精品一区二区 | 亚洲精品国产日韩 | 久久久久女人精品毛片 | 五月天伊人网 | 国产精品 日韩精品 | 99r在线 | 亚洲精品黄色在线观看 | 人人狠狠 | 午夜精品久久久久久久99 | 成年人视频在线免费播放 | 免费黄色网止 | 九九精品毛片 | 婷婷久久综合九色综合 | 免费在线观看黄网站 | 97在线观看视频免费 | 97超碰在线久草超碰在线观看 | 欧美日韩高清一区二区 国产亚洲免费看 | 婷婷丁香激情网 | 精品国产人成亚洲区 | 岛国大片免费视频 | 国产视频网站在线观看 | 国产在线精品一区二区不卡了 | 国产流白浆高潮在线观看 | 成人亚洲欧美 | 国产资源中文字幕 | 91精品视频导航 | 亚洲成人精品国产 | 亚洲高清激情 | 欧美成人一二区 | 欧美在线视频a | 久久久久这里只有精品 | 337p西西人体大胆瓣开下部 | 国产免费影院 | 日韩精品在线视频 | 久草精品免费 | 亚洲精品乱码久久久久v最新版 | 成人黄色电影视频 | 国产精品视频内 | 香蕉网站在线观看 | 日韩大片在线 | 亚洲视频网站在线观看 | 天天爱天天操 | 美女免费视频观看网站 | 国产成人精品一区在线 | 中文字幕在线观看视频网站 | 国产资源免费在线观看 | 亚洲成人精品久久久 | 中文字幕精品一区二区三区电影 | 日韩一级黄色av | 日韩区欧美久久久无人区 | 国产亚洲精品v | 黄色动态图xx| 五月天高清欧美mv | 69久久99精品久久久久婷婷 | 久久久精品网 | 在线观看国产一区 | 91成人精品 | 天天干夜夜想 | 国产精品3 | 成人看片 | 日本中文字幕电影在线免费观看 | 五月婷婷开心中文字幕 | 91伊人久久大香线蕉蜜芽人口 | 国产资源站 | 蜜臀aⅴ国产精品久久久国产 | 日日夜精品 | 成人观看视频 | 亚洲欧美国产精品va在线观看 | 亚洲国产日韩一区 | 999久久久免费视频 午夜国产在线观看 | 精品99在线观看 | 国产 精品 资源 | 五月天久久婷婷 | 久久精品中文字幕 | 天天综合网天天 | 波多野结衣在线播放视频 | 国产精品高清一区二区三区 | 亚洲撸撸 | 亚洲黄在线观看 | 日本黄色大片免费看 | 91视频大全| 国产无遮挡又黄又爽馒头漫画 | 在线观看免费色 | 午夜久久美女 | 国产成人精品午夜在线播放 | 日韩精品高清视频 | 国产精品激情偷乱一区二区∴ | 色中文字幕在线观看 | 国产99爱| 久久久久久免费视频 | 91精品国产综合久久福利不卡 | 亚洲精品日韩一区二区电影 | 手机看片午夜 | 五月婷婷中文网 | 久久免费精彩视频 | 天堂在线视频中文网 | 亚洲高清视频在线观看免费 | 麻豆91在线观看 | 日韩色综合网 | 在线观看理论 | 久久精品xxx| 中文字幕色在线 | 麻豆视频在线看 | 狠狠狠狠狠色综合 | 免费在线观看亚洲视频 | 人人搞人人干 | 91片在线观看| 中文av字幕在线观看 | 久久狠狠干 | 亚洲国产免费看 | 韩日电影在线观看 | 欧美analxxxx| 69国产在线观看 | 狠狠操狠狠操 | 欧美一区日韩精品 | 在线观看av黄色 | 看av免费网站 | 91精品久久久久久粉嫩 | 91最新视频在线观看 | a级片在线播放 | 欧美成人999 | 麻花豆传媒mv在线观看网站 | 国产日韩av在线 | 国产一级大片免费看 | 狠狠操操操 | 黄网站色欧美视频 | 精品久久久久国产 | 日本公乱妇视频 | 九九免费在线观看视频 | 中字幕视频在线永久在线观看免费 | 国产精品美女久久久 | 九草在线视频 | 男女激情片在线观看 | 国内精自线一二区永久 | 蜜桃av人人夜夜澡人人爽 | 青青河边草观看完整版高清 | 天堂av网在线 | 四虎成人精品在永久免费 | 综合色亚洲 | 91av视频导航 | 国产精品美女久久久久久久久久久 | 亚洲人成人在线 | jizz欧美性9 国产一区高清在线观看 | 成人黄色电影在线观看 | 中文字幕在线观看你懂的 | 99国产视频在线 | 国产资源在线播放 | 亚洲区另类春色综合小说校园片 | 亚洲欧洲精品一区 | 国产亚洲91 | 亚洲一区不卡视频 | 国产在线观看免费观看 | 日韩av电影免费在线观看 | 精品国产视频一区 | 日本黄色免费看 | 亚洲精品国产成人av在线 | 最近中文字幕完整视频高清1 | 亚洲在线视频免费 | 日韩电影一区二区在线观看 | 最新av在线播放 | 国产精品扒开做爽爽的视频 | 一本色道久久精品 | 免费视频国产 | 亚洲区另类春色综合小说 | 在线精品视频在线观看高清 | 精品亚洲午夜久久久久91 | 久久这里只有精品久久 | 色五丁香 | 日韩中出在线 | 日本久久电影 | 91色视频| 91福利国产在线观看 | 久久精品小视频 | 久久99久久久久 | 91成人精品 | 免费网站污 | 粉嫩av一区二区三区免费 | 久久久久国产一区二区 | 国产一区二区网址 | 久草在线手机观看 | 亚洲一区二区精品在线 | 国产精品九九久久久久久久 | 久久久www成人免费精品 | 午夜.dj高清免费观看视频 | 在线视频电影 | 在线激情小视频 | 99精品免费网 | 国内精品美女在线观看 | 国产精品久久一卡二卡 | 亚洲精品免费在线 | 国内精品久久久久影院男同志 | 国产一区免费视频 | 国产资源在线观看 | 国产中文字幕在线 | 精品a级片 | 91在线欧美| 99c视频高清免费观看 | av东方在线 | 亚洲精品国精品久久99热一 | 97成人精品视频在线播放 | 日日干天天爽 | 三级黄色欧美 | 久草久视频 | 最新在线你懂的 | 99国产精品久久久久久久久久 | 欧美精品久久久久久久久免 | 色视频成人在线观看免 | 91精品啪在线观看国产 | 国产精品一区二区在线免费观看 | 亚洲国产精久久久久久久 | 麻豆传媒电影在线观看 | 91免费网址 | 日韩三级视频在线看 | 日日日日干 | 国产不卡av在线 | 精品亚洲一区二区三区 | 狠狠婷婷 | www.久久色.com| 久草在线资源网 | 国产精品成人一区二区三区吃奶 | 激情网综合 | 香蕉久草在线 | 久久国产视频网站 | 久草久视频 | 国产一级不卡视频 | 国产成人一区二区三区免费看 | 网站免费黄色 | 精品黄色片 | 97超级碰碰碰视频在线观看 | 黄色成人免费电影 | 黄视频色网站 | 日韩黄色一级电影 | 欧美成人基地 | 97视频在线观看免费 | 亚洲电影图片小说 | 2019免费中文字幕 | 国产精品久久一区二区无卡 | 亚洲一区 av| 在线观看中文字幕第一页 | 激情综合站 | 国产精美视频 | 人人干人人超 | 午夜精品久久久久久久99 | 欧美日韩精品在线 | 亚洲精品网站在线 | 久久综合狠狠综合久久综合88 | 日韩大片在线播放 | 在线视频一二三 | 国产一区二区三区四区大秀 | 久草色在线观看 | 欧美日产在线观看 | 亚洲人成在线电影 | 久久久久久久久久久电影 | 日韩影视精品 | 国产精品久久久久久久久久久免费 | 一区av在线播放 | 亚洲黄色免费在线 | 丁香婷婷深情五月亚洲 | 91av视频免费在线观看 | 91九色性视频| 免费无遮挡动漫网站 | 美女视频a美女大全免费下载蜜臀 | 一区二区电影在线观看 | 色网站中文字幕 | 69国产精品视频免费观看 | 五月婷婷综合久久 | 中文字幕文字幕一区二区 | 亚洲另类交 | 亚洲理论在线 | 欧美精品亚洲精品 | 亚洲精品色婷婷 | 精品视频免费看 | 国产最新在线 | 欧美激精品| 美女久久久久久久久久久 | 五月婷婷视频在线 | 久久亚洲欧美日韩精品专区 | 丁香在线视频 | 久久久久成人精品亚洲国产 | 国产色视频一区二区三区qq号 | 97碰碰碰| 岛国大片免费视频 | 日韩手机在线观看 | 日本中文字幕久久 | 国产亚洲精品久久久网站好莱 | 99精品国产福利在线观看免费 | 亚洲国产成人在线播放 | 日日麻批40分钟视频免费观看 | 91干干干 | 中文字幕日韩有码 | 欧美天堂久久 | 久久久久久久久久久综合 | 久 久久影院 | 黄色在线看网站 | 91av视频网站 |