中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么實現悲觀鎖與樂觀鎖

發布時間:2021-06-30 17:23:13 來源:億速云 閱讀:133 作者:Leah 欄目:大數據

這篇文章將為大家詳細講解有關Java中怎么實現悲觀鎖與樂觀鎖,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

悲觀鎖

假設會發生并發沖突;在整個數據處理過程中,將數據處于鎖定狀態。 獨占鎖是一種悲觀鎖,synchronized就是一種獨占鎖,它假設最壞的情況,并且只有在確保其它線程不會造成干擾的情況下執行,會導致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。

樂觀鎖

假設不會發生并發沖突;處理數據時不加鎖,如果處理失敗產生沖突就重試,直到成功為止。 當數據爭用不嚴重時,樂觀鎖效果更好。比如CAS就是一種樂觀鎖思想的應用。

互斥同步/阻塞同步(悲觀策略)

同步是指在多個線程并發訪問共享數據時,保證共享數據在同一個時刻只被一個(或者是一些,使用信號量的時候)線程使用。 臨界區(CriticalSection)、互斥量(Mutex)和信號量(Semaphore)都是主要的互斥實現方式。

synchronized

synchronized是Java中基本的互斥同步手段,synchronized關鍵字經過編譯之后,會在同步塊的前后分別形成monitorenter和monitorexit這兩個字節碼指令,這兩個字節碼都需要一個reference類型的參數來指明要鎖定和解鎖的對象。如果Java程序中的synchronized明確指定了對象參數,那就是這個對象的reference;如果沒有明確指定,那就根據synchronized修飾的是實例方法還是類方法,去取對應的對象實例或Class對象來作為鎖對 象。

ReentrantLock

重入鎖(ReentrantLock)是JDK1.5中JUC提供的另一種互斥同步手段,在基本用法上,ReentrantLock與synchronized很相似,他們都具備一樣的線程重入特性,只是代碼寫法上有點區別,一個表現為API層面的互斥鎖(lock()和unlock()方法配合try/finally語句塊來完成),另一個表現為原生語法層面的互斥鎖。不過,相比synchronized,ReentrantLock增加了一些高級功能,主要有以下3項:等待可中斷、可實現公平鎖,以及鎖可以綁定多個條件。

等待可中斷

等待可中斷是指當持有鎖的線程長期不釋放鎖的時候,正在等待的線程可以選擇放棄等待,改為處理其他事情,可中斷特性對處理執行時間非常長的同步塊很有幫助。

公平鎖

公平鎖是指多個線程在等待同一個鎖時,必須按照申請鎖的時間順序來依次獲得鎖;而非公平鎖則不保證這一點,在鎖被釋放時,任何一個等待鎖的線程都有機會獲得鎖。 synchronized中的鎖是非公平的,ReentrantLock默認情況下也是非公平的,但可以通過帶布爾值的構造函數要求使用公平鎖。

綁定多個條件

鎖綁定多個條件是指一個ReentrantLock對象可以同時綁定多個Condition對象,而在synchronized中,鎖對象的wait()和notify()或notifyAll()方法可以實現一個隱含的條件,如果要和多于一個的條件關聯的時候,就不得不額外地添加一個鎖,而ReentrantLock則無須這樣做,只需要多次調用newCondition()方法即可。

非阻塞同步(樂觀策略)

互斥同步最主要的問題就是進行線程阻塞和喚醒所帶來的性能問題,因此這種同步也稱為阻塞同步(Blocking Synchronization)。 非阻塞同步是一種不需要把線程掛起的樂觀的并發策略,先進行操作,如果沒有其他線程爭用共享數據,那操作就成功了;如果共享數據有爭用,產生了沖突,那就再采取其他的補償措施(最常見的補償措施就是不斷地重試,直到成功為止)。

比較并交換CAS(Compare-and-Swap)

CAS指令需要有3個操作數,分別是內存位置(在Java中可以簡單理解為變量的內存地址,用V表示)、舊的預期值(用A表示)和新值(用B表示)。CAS指令執行時,當且僅當V符合舊預期值A時,處理器用新值B更新V的值,否則它就不執行更新,但是無論是否更新了V的值,都會返回V的舊值,上述的處理過程是一個原子操作。 JDK1.5之后,Java程序中才可以使用CAS操作,該操作由sun.misc.Unsafe類里面的 compareAndSwapInt()和compareAndSwapLong()等幾個方法包裝提供,虛擬機在內部對這些方法做了特殊處理,即時編譯出來的結果就是一條平臺相關的處理器CAS指令,沒有方法調用的過程,或者可以認為是無條件內聯進去了

ABA問題

如果一個變量V初次讀取的時候是A值,并且在準備賦值的時候檢查到它仍然為A值,那我們就能說它的值沒有被其他線程改變過了嗎?如果在這段期間它的值曾經被改成了B,后來又被改回為A,那CAS操作就會誤認為它從來沒有被改變過。 J.U.C包為了解決這個問題,提供了一個帶有標記的原子引用類”AtomicStampedReference”,它可以通過控制變量值的版本來保證CAS的正確性。 大部分情況下ABA問題不會影響程序并發的正確性,如果需要解決ABA問題,改用傳統的互斥同步可能會比原子類更高效。

關于Java中怎么實現悲觀鎖與樂觀鎖就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇左市| 泌阳县| 团风县| 平度市| 方正县| 黄平县| 阳江市| 游戏| 仁化县| 博野县| 且末县| 汶上县| 南投县| 卢湾区| 衡山县| 惠水县| 左云县| 抚远县| 济阳县| 雷波县| 托克逊县| 翼城县| 沁水县| 灵丘县| 河西区| 香河县| 岳普湖县| 九龙城区| 汉阴县| 凤冈县| 嵊泗县| 集贤县| 贺兰县| 江陵县| 乡宁县| 开江县| 确山县| 阿坝| 南召县| 靖州| 白山市|