java的concurrent包
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
最近在網(wǎng)上看到一個(gè)將concurrent包的系列文章,仔細(xì)讀了一遍,感覺不錯(cuò)。
分享一下:http://www.hetaoblog.com/myblogs/post/%E8%AF%B4%E4%B8%80%E8%AF%B4java%E7%9A%84concurrent%E5%8C%851-%E6%95%B4%E4%BD%93%E4%BB%8B%E7%BB%8D.jhtml
Concurrent包主要有三個(gè)package組成。java.util.concurrent:提供大部分關(guān)于并發(fā)的接口和類,如BlockingQueue,Callable,ConcurrentHashMap,ExecutorService, Semaphore等。
java.util.concurrent.atomic:提供所有原子操作的類, 如AtomicInteger, AtomicLong等;?
java.util.concurrent.locks:提供鎖相關(guān)的類, 如Lock, ReentrantLock, ReadWriteLock, Condition等;
?CountDownLatch
?CountDownLatch等待多個(gè)線程完成執(zhí)行,這個(gè)類會(huì)等待多個(gè)子線程結(jié)束后才開始執(zhí)行主線程的其他操作。直接上一個(gè)例子。
@Testpublic void testCountDown(){int count = 10;final CountDownLatch l = new CountDownLatch(count);for (int i = 0; i < count; ++i){final int index = i;new Thread(new Runnable() {@Overridepublic void run() {try {Thread.currentThread().sleep(3 * 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");} 這個(gè)例子中,結(jié)束語句會(huì)在所有線程結(jié)束后再執(zhí)行,否則會(huì)一直await。
Atomic類
Atomic相關(guān)類是線程安全的,支持無阻塞無鎖定的操作set(),get(),getAndSet(), getAndIncrement(),getAndDecrement(),getAndAdd()
ReentrantLock類
之前一直是使用synchronized關(guān)鍵字來保證線程間的同步。concurrent包提供了ReentrantLock類,該類提供lock()和unlock()方法
1. 是更好的性能,?
2. 提供同一個(gè)lock對(duì)象上不同condition的信號(hào)通知?
3. 還提供lockInterruptibly這樣支持響應(yīng)中斷的加鎖過程,意思是說你試圖去加鎖,但是當(dāng)前鎖被其他線程hold住,然后你這個(gè)線程可以被中斷;
這里直接上下相關(guān)lock操作的代碼
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;}} 可以看到,這里在++操作之前先lock了,然后再執(zhí)行了unlock操作。
ReadWriteLock
讀鎖可以有很多個(gè)鎖同時(shí)上鎖,只要當(dāng)前沒有寫鎖;?
寫鎖是排他的,上了寫鎖,其他線程既不能上讀鎖,也不能上寫鎖;同樣,需要上寫鎖的前提是既沒有讀鎖,也沒有寫鎖;
試圖獲得寫鎖的線程只有當(dāng)另外一個(gè)線程將讀鎖釋放了以后才可以獲得
@Testpublic 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 threadnew Thread(new Runnable() {@Overridepublic void run() {System.out.println(new Date() + "now to get rlock");rlock.lock();try {Thread.currentThread().sleep(3 * 1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(new Date() + "now to unlock rlock");rlock.unlock();l.countDown();}}).start();// start w threadnew Thread(new Runnable() {@Overridepublic 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");}
總結(jié)一下。這里是concurrent包中常用的幾個(gè)類。集中涉及了多線程,并發(fā)控制,鎖的相關(guān)機(jī)制。
轉(zhuǎn)載于:https://my.oschina.net/zimingforever/blog/143914
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java的concurrent包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数独 php
- 下一篇: 中国五大顶级域名7月第一周增3.2万 美