您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Java中怎么實現悲觀鎖與樂觀鎖,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
假設會發生并發沖突;在整個數據處理過程中,將數據處于鎖定狀態。 獨占鎖是一種悲觀鎖,synchronized就是一種獨占鎖,它假設最壞的情況,并且只有在確保其它線程不會造成干擾的情況下執行,會導致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。
假設不會發生并發沖突;處理數據時不加鎖,如果處理失敗產生沖突就重試,直到成功為止。 當數據爭用不嚴重時,樂觀鎖效果更好。比如CAS就是一種樂觀鎖思想的應用。
同步是指在多個線程并發訪問共享數據時,保證共享數據在同一個時刻只被一個(或者是一些,使用信號量的時候)線程使用。 臨界區(CriticalSection)、互斥量(Mutex)和信號量(Semaphore)都是主要的互斥實現方式。
synchronized是Java中基本的互斥同步手段,synchronized關鍵字經過編譯之后,會在同步塊的前后分別形成monitorenter和monitorexit這兩個字節碼指令,這兩個字節碼都需要一個reference類型的參數來指明要鎖定和解鎖的對象。如果Java程序中的synchronized明確指定了對象參數,那就是這個對象的reference;如果沒有明確指定,那就根據synchronized修飾的是實例方法還是類方法,去取對應的對象實例或Class對象來作為鎖對 象。
重入鎖(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指令需要有3個操作數,分別是內存位置(在Java中可以簡單理解為變量的內存地址,用V表示)、舊的預期值(用A表示)和新值(用B表示)。CAS指令執行時,當且僅當V符合舊預期值A時,處理器用新值B更新V的值,否則它就不執行更新,但是無論是否更新了V的值,都會返回V的舊值,上述的處理過程是一個原子操作。 JDK1.5之后,Java程序中才可以使用CAS操作,該操作由sun.misc.Unsafe類里面的 compareAndSwapInt()和compareAndSwapLong()等幾個方法包裝提供,虛擬機在內部對這些方法做了特殊處理,即時編譯出來的結果就是一條平臺相關的處理器CAS指令,沒有方法調用的過程,或者可以認為是無條件內聯進去了
如果一個變量V初次讀取的時候是A值,并且在準備賦值的時候檢查到它仍然為A值,那我們就能說它的值沒有被其他線程改變過了嗎?如果在這段期間它的值曾經被改成了B,后來又被改回為A,那CAS操作就會誤認為它從來沒有被改變過。 J.U.C包為了解決這個問題,提供了一個帶有標記的原子引用類”AtomicStampedReference”,它可以通過控制變量值的版本來保證CAS的正確性。 大部分情況下ABA問題不會影響程序并發的正確性,如果需要解決ABA問題,改用傳統的互斥同步可能會比原子類更高效。
關于Java中怎么實現悲觀鎖與樂觀鎖就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。