<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            java語言

            java并發編程參考

            時間:2024-12-01 19:54:17 java語言 我要投稿
            • 相關推薦

            java并發編程參考

              在Java5.0之前,只有synchronized(內置鎖)和volatile. Java5.0后引入了顯示鎖ReentrantLock.

              ReentrantLock概況

              ReentrantLock是可重入的鎖,它不同于內置鎖, 它在每次使用都需要顯示的加鎖和解鎖, 而且提供了更高級的特性:公平鎖, 定時鎖, 有條件鎖, 可輪詢鎖, 可中斷鎖. 可以有效避免死鎖的活躍性問題.ReentrantLock實現了

              Lock接口:

              復制代碼 代碼如下:

              public interface Lock {

              //阻塞直到獲得鎖或者中斷

              void lock();

              //阻塞直到獲得鎖或者中斷拋異常

              void lockInterruptibly() throws InterruptedException;

              //只有鎖可用時才獲得,否則直接返回

              boolean tryLock();

              //只有鎖在指定時間內可用時才獲得,否則直接返回,中斷時拋異常

              boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

              void unlock();

              //返回一個綁定在這個鎖上的條件

              Condition newCondition();

              }

              Lock使用

              復制代碼 代碼如下:

              Lock lock = new ReentrantLock();

              lock.lock();

              try{

              //更新對象狀態

              }finally{

              //這里注意,一定要有finally代碼塊去解鎖

              //否則容易造成死鎖等活躍性問題

              lock.unlock();

              }

              ReentrantLock特性

              輪詢鎖的和定時鎖

              可輪詢和可定時的鎖請求是通過tryLock()方法實現的,和無條件獲取鎖不一樣. ReentrantLock可以有靈活的容錯機制.死鎖的很多情況是由于順序鎖引起的, 不同線程在試圖獲得鎖的時候阻塞,并且不釋放自己已經持有的鎖, 最后造成死鎖. tryLock()方法在試圖獲得鎖的時候,如果該鎖已經被其它線程持有,則按照設置方式立刻返回,而不是一直阻塞等下去,同時在返回后釋放自己持有的鎖.可以根據返回的結果進行重試或者取消,進而避免死鎖的發生.

              公平性

              ReentrantLock構造函數中提供公平性鎖和非公平鎖(默認)兩種選擇。所謂公平鎖,線程將按照他們發出請求的順序來獲取鎖,不允許插隊;但在非公平鎖上,則允許插隊:當一個線程發生獲取鎖的請求的時刻,如果這個鎖是可用的,那這個線程將跳過所在隊列里等待線程并獲得鎖。我們一般希望所有鎖是非公平的。因為當執行加鎖操作時,公平性將講由于線程掛起和恢復線程時開銷而極大的降低性能。考慮這么一種情況:A線程持有鎖,B線程請求這個鎖,因此B線程被掛起;A線程釋放這個鎖時,B線程將被喚醒,因此再次嘗試獲取鎖;與此同時,C線程也請求獲取這個鎖,那么C線程很可能在B線程被完全喚醒之前獲得、使用以及釋放這個鎖。這是種雙贏的局面,B獲取鎖的時刻(B被喚醒后才能獲取鎖)并沒有推遲,C更早地獲取了鎖,并且吞吐量也獲得了提高。在大多數情況下,非公平鎖的性能要高于公平鎖的性能。

              可中斷獲鎖獲取操作

              lockInterruptibly方法能夠在獲取鎖的同時保持對中斷的響應,因此無需創建其它類型的不可中斷阻塞操作。

              讀寫鎖ReadWriteLock

              ReentrantLock是一種標準的互斥鎖,每次最多只有一個線程能持有鎖。讀寫鎖不一樣,暴露了兩個Lock對象,其中一個用于讀操作,而另外一個用于寫操作。

              復制代碼 代碼如下:

              public interface ReadWriteLock {

              /**

              * Returns the lock used for reading.

              *

              * @return the lock used for reading.

              */

              Lock readLock();

              /**

              * Returns the lock used for writing.

              *

              * @return the lock used for writing.

              */

              Lock writeLock();

              }

              可選擇實現:

              1.釋放優先

              2.讀線程插隊

              3.重入性

              4.降級

              5.升級

              ReentrantReadWriteLock實現了ReadWriteLock接口,構造器提供了公平鎖和非公平鎖兩種創建方式。讀寫鎖適用于讀多寫少的情況,可以實現更好的并發性。

              示例

              復制代碼 代碼如下:

              public class ReadWriteMap{

              private Mapmap;

              private final ReadWriteLock lock = new ReentrantReadWriteLock();

              private final Lock readLock = lock.readLock();

              private final Lock writeLock = lock.writeLock();

              public ReadWriteMap(Mapmap) {

              this.map = map;

              }

              public V get(K key) {

              readLock.lock();

              try {

              return map.get(key);

              } finally {

              readLock.unlock();

              }

              }

              public void put(K key, V value) {

              writeLock.lock();

              try {

              map.put(key, value);

              } finally {

              writeLock.unlock();

              }

              }

              }

            【java并發編程參考】相關文章:

            Java并發編程:深入剖析ThreadLocal09-20

            java編程術語11-10

            java編程基礎07-26

            Java編程語言10-02

            Java中同步與并發的運用07-31

            java教程之Java編程基礎09-12

            Java編程環境的搭建06-03

            java編程規范介紹07-10

            java語法基本編程10-08

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院