JDK并發包

java高并發程序設計 - 網易云課堂

一、重入鎖

重入鎖是synchronized,Object.wait(),Object.notify()和替代品;

重入鎖的類是:java.util.concurrent.locks.ReentrantLock;

代碼如:

lock=new ReentrantLock();

lock.lock(); ? //加鎖

.....

lock.unlock();//解鎖

二、中斷響應

lock=new ReentrantLock();

lock2=new ReentrantLock();

lock.lockInterruptibly(); ?//請求鎖

.....

lock2.interrupt(); ? //發出中斷信號

三、鎖申請等待限時

lock.tryLock();返回值是boolean類型;接收兩個參數,一個表示等待時長,第二個表示記時單位;沒參數時,是不等待;如果獲取了鎖,返回true;

與lock.tryLock()對應的方法解鎖lock.unLock();

四、公平鎖

默認情況下,鎖是非公平的;synchronized實現的鎖就是非公平的;

lock=new ReentrantLock(true);這就是公平鎖,公平鎖耗資源;

五、ReenreantLock的幾個重要方法:

lock();獲得鎖,如果鎖已經被占用,則等待;

lockInterruptibly();獲得鎖,但優先響應中斷;

tryLock();嘗試獲得鎖,如果成功獲取,返回true;否則返回false;

tryLock(long time,TimeUnit unit);同上,只是在給定的時間內嘗試去獲得鎖;

unlock();釋放鎖;

六、重入鎖的好搭檔,Condition條件

await();使當前線程等待,同時釋放當前的鎖;當其它線程singal()之后,此線程會重新獲得鎖并繼續執行。

awaitUninterruptibly();與await()方法基本想同,但不會在等待過程中響應中斷;

singal()用于喚醒一個在等待中的線程;

七、信號量(semaphore)

信號量可以指定多個線程,同時訪問某一個資源;synchronized與重入鎖ReentrantLock,一次都只允許一個線程訪問一個資源;

其構造方法:

public Semaphore(int permits);參數表示可以申請多少個許可;

public Semphore(int permits,boolean fair);第二個參數表示是否公平;

acquire()嘗試獲得一個準入的許可,若無法獲得,則線程會等待,直到有線程釋放一個許可或者當前線程被中斷;

acquireUninterruptibly()方法與acquire()方法類似,但不響應中斷;

tryAcquire()嘗試獲得一個許可,如果成功返回true,失敗則返回false;

release()用于在線程訪問資源結束后,釋放一個許可;

八、讀寫分離鎖(ReadWriteLock)

ReentrantReadWriteLock

九、多線程控制工具類

倒計時器 CountDownLatch;

循環柵欄 CyclicBarrier;

十、線程阻塞工具類

LockSupport

十一、線程池

避免系統頻繁地創建和銷毀線程,可以讓創建的線程進行復用。

JDK提供了一套Executor框架,其本質就是一個線程池。

工廠方法:

newFixedThreadPool();返回一個固定線程數量的線程池。

newSingleThreadExecutor();返回只有一個線程的線程池;

newCachedThreadPool();

newSingleThreadScheduledExecutor();在給定的時間執行某任務。如在某個固定的延時之后執行,或者周期性執行某個任務;

十二、分而治之。Fork/Join框架

ForkJoinPool線程池

十三、JDK的并發容器

程序就是算法加數據結構;這些并發容器都是線程安全的。JDK提供的這些容器大部分在:java.util.concurrent包下。

并發集合:適合于多線程場合。

ConcurrentHashMap,一個線程安全的HashMap;

CopyOnWriteArrayList,用在讀多寫少的場合,是個線程安全的list,其性能好于Vector;

ConcurrentLinkedQueue,是個線程安全的LinkedList;

BlockingQueue,是個接口,JDK內部通過鏈表(LinkedBlockingQueue)、數組(ArrayBlockingQueue)等方式實現了這個接口,表示阻塞隊列,適用于數據共享的通道;

另外,Collections工具類可以將任意集合包裝成線程安全的集合;如:

Map p=Collections.synchronizedMap(new HashMap());

ConcurrentSkipListMap的數據是有序的;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容