亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

synchronized、volatile、ReentrantLock的區別是什么

發布時間:2023-04-20 16:00:35 來源:億速云 閱讀:100 作者:iii 欄目:開發技術

這篇文章主要講解了“synchronized、volatile、ReentrantLock的區別是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“synchronized、volatile、ReentrantLock的區別是什么”吧!

并發編程特性

  1. 原子性:對共享資源的一組操作,要么成功要么失敗,不會出現部分成功部分失敗的情況。

  2. 可見性: 當線程獲取到瑣時,會拷貝一份共享資源到本地內存,釋放鎖時會將共享資源刷新到主內存中。可見性是指當共享資源發生變化時,其他線程都能夠看到這個變化。

  3. 有序性:為了提高效率,編譯器和處理器會對代碼進行指令重排,單線程的情況下,指令重拍不會受到影響,多線程情況下可能會影響代碼執行的正確性。有序性是指代碼編寫順序和執行順序是一致的。

volatile

volatile 是JVM提供的最輕量級的同步機制,編譯器不會對其進行優化。

特性:

  • volatile 只保證共享資源的可見性有序性

  • 使用volatile修飾共享資源時,如果共享資源變化時,會直接將緩存中的數據寫回到主內存中去,數據也是從主內存中讀取,從而保證了可見性。

  • volatile 底層是通過操作系統的內存屏障來實現的,由于使?了內存屏障,所以會禁?指令重排,從而就保證了有序性。

作用的地方:

volatile 只能用來修飾成員變量。

public class VolatileTest {
    
    private volatile static String staticVolatile;
    
    private volatile String memberVolatile;
}

synchronized

synchronized關鍵字是java提供的內置鎖來保證我們對共享資源的同步,它會自動加鎖和釋放鎖,它的鎖是非公平鎖, synchronized關鍵字標記的地方會被編譯器進行優化。synchronized會使線程串行執行,可能會造成線程阻塞。

特性

  • synchronized關鍵字使線程串行化執行,所以保證了并發安全的3個特性,并且還擁有以下兩個特性:

  • 互斥性:同時只有一個線程能夠訪問synchronized方法或者同步代碼塊。

  • 可重入性synchronized是可重入鎖,通俗解釋可重入鎖就是當一個線程獲取到了某個對象鎖或者類鎖之后,這個線程在未釋放鎖之前,再調用該鎖的其他synchronized方法或代碼塊時,不用再次重新獲得鎖。

作用的地方

synchronized關鍵字可用來修飾方法或者代碼塊。

修飾方法,分為實例方法和靜態方法

  • 修飾實例方法,對象鎖

public  synchronized void objectMethods(){
   .....
}
  • 修飾靜態方法,類鎖

public static  synchronized void staticMethods(){
   .....
 }

修飾代碼塊

obj為對象的引用 對象鎖

public  void objectMethods(){
	synchronized (obj){
	}
}

Object 為某個類 類鎖

public  void classLock(){
	synchronized (Object.class){
	}
}

ReentrantLock

Lock 是 Java 5提供的一個具有鎖機制的接口,ReentrantLockLock的一個實現,內部是通過AQS(AbstractQueuedSynchronizer)實現的。ReentrantLock翻譯過來是可重入鎖,它和synchronized類似,ReentrantLock 需要手動加鎖和釋放鎖, 相對于synchronized它更加靈活,提供了更多的方法。 ReentrantLock 有公平鎖和非公平鎖兩種方式,默認是使用公平鎖。

特性

ReentrantLock 是可重入的同步鎖,所以它除了具有并發編程的三大特性,還具有可重入性。

作用的地方

ReentrantLock 是一個類,它既可以作為成員變量,也可以作為局部變量使用。做為成員變量和局部變量時,使用的方式有一點點不同,不管使用哪種方式,最后都別忘了要調用unlock() 方法手動釋放鎖。

做為成員變量使用格式:

private Lock globalLock = new ReentrantLock();

public void globalLock(){
    if (globalLock.tryLock()) {
        try {
        } catch (Exception e) {
          
        }finally {
            globalLock.unlock();
        }
    }
}

上面的tryLock() 方法是嘗試獲取鎖,如果獲取成功返回true,否則返回false,也可以換成加了等待時間的 boolean tryLock(long time, TimeUnit unit) 方法,在設定的等待時間內獲取鎖成功則返回true,否則false。

做為局部變量使用格式:

public void lock(){
     Lock lock = new ReentrantLock();
     lock.lock();
     try {

     }finally {
         lock.unlock();
     }
 }

對比

簡單對比一下三者之間的區別:


volatilesynchronizedReentrantLock
是否是關鍵字
是否需要手動加鎖/釋放鎖
是否能保證并發安全
是否是公平鎖\有公平鎖和非公平鎖兩種實現
是否會阻塞線程
JVM是否會對其優化
特性可見性、有序性可見性、有序性、原子性可見性、有序性、原子性
使用的地方成員變量方法、代碼塊成員變量、局部變量

感謝各位的閱讀,以上就是“synchronized、volatile、ReentrantLock的區別是什么”的內容了,經過本文的學習后,相信大家對synchronized、volatile、ReentrantLock的區別是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

武义县| 察隅县| 留坝县| 鹿泉市| 定兴县| 镇原县| 凤山县| 舒城县| 道真| 郴州市| 绥滨县| 麻江县| 嘉兴市| 富平县| 黄梅县| 岫岩| 集贤县| 乐山市| 伽师县| 珲春市| 乐都县| 内丘县| 西城区| 阿荣旗| 寿阳县| 昔阳县| 浪卡子县| 禄劝| 江孜县| 武汉市| 民丰县| 东至县| 廊坊市| 万宁市| 逊克县| 香港| 雷山县| 金乡县| 灵石县| 瓮安县| 宜良县|