Java中涉及線程和並發相關的內容
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中涉及線程和並發相關的內容