1. 程式人生 > >Java中涉及線程和並發相關的內容

Java中涉及線程和並發相關的內容

lock incr 修飾 map 結果 volatil wait 所有 ati

1:線程池

與每次需要時都創建線程相比,線程池可以降低創建線程的開銷,這也是因為線程池在線程執行結束後進行的是回收操作,而不是真正的

銷毀線程。

2:ReentrantLock

ReentrantLock提供了tryLock方法,tryLock調用的時候,如果鎖被其他線程持有,那麽tryLock會立即返回,返回結果為false,如果鎖沒有被

其他線程持有,那麽當前調用線程會持有鎖,並且tryLock返回的結果是true,

lock.lock();

try {

//do something

} finally {

lock.unlock();

}

3:volatile

保證了同一個變量在多線程中的可見性,所以它更多是用於修飾作為開關狀態的變量,因為volatile保證了只有一份主存中的數據。

4:Atomics

public class Count {

private AtomicInteger counter = new AtomicInteger();

public int increase() {

return counter.incrementAndGet();

}

public int decrease() {

return counter.decrementAndGet();

}

}

AtomicInteger內部通過JNI的方式使用了硬件支持的CAS指令。

5:CountDownLatch

它是java.util.concurrent包中的一個類,它主要提供的機制是當多個(具體數量等於初始化CountDown時的count參數的值)線程都到達了預期狀態

或完成預期工作時觸發事件,其他線程可以等待這個事件來出發自己後續的工作,等待的線程可以是多個,即CountDownLatch是可以喚醒多個等待

的線程的,到達自己預期狀態的線程會調用CountDownLatch的countDown方法,而等待的線程會調用CountDownLatch的await方法

6:CyclicBarrier

循環屏障,CyclicBarrier可以協同多個線程,讓多個線程在這個屏障前等待,直到所有線程都到達了這個屏障時,再一起繼續執行後面的動作。

CyclicBarrier和CountDownLatch都是用於多個線程間的協調的,二者的一個很大的差別是,CountDownLatch是在多個線程都進行了latch.countDown

後才會觸發事件,喚醒await在latch上的線程,而執行countDown的線程,執行完countDown後,會繼續自己線程的工作;

CyclicBarrier是一個柵欄,用於同步所有調用await方法的線程,並且等所有線程都到了await方法,這些線程才一起返回繼續各自的工作,因為使用CyclicBarrier的線程都會阻塞在await方法上,所以在線程池中使用CyclicBarrier時要特別小心,如果線程池的線程 數過少,那麽就會發生死鎖了,

CyclicBarrier可以循環使用,CountDownLatch不能循環使用。

7:Semaphore

是用於管理信號量的,構造的時候傳入可供管理的信號量的數值,信號量對量管理的信號就像令牌,構造時傳入個數,總數就是控制並發的數量。

semaphore.acquire();

try {

//調用遠程通信的方法

} finally () {

semaphore.release();

}

8:Exchanger

Exchanger,從名字上講就是交換,它用於在兩個線程之間進行數據交換,線程會阻塞在Exchanger的exchange方法上,直到另一個線程也到了

同一個Exchanger的exchange方法時,二者進行交換,然後兩個線程會繼續執行自身相關的代碼。

9:Future和FutureTask

Future<HashMap> future = getDataFromRemote2();

//do something

HashMap data = (HashMap)future.get();

private Future<HashMap> getDateFromRemote2() {

return threadPool.submit(new Callable<HashMap>() {

public HashMap call() {

return getDataFromRemote();

}

});

}

思路:調用函數後馬上返回,然後繼續向下執行,急需要數據時再來用,或者說再來等待這個數據,具體實現方式有兩種,一個是用Future,另一個

使用回調。

參考鏈接:https://blog.csdn.net/woshisap/article/details/43119569

Java中涉及線程和並發相關的內容