欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于synchronized、volatile、ReentrantLock的區(qū)別與對(duì)比

 更新時(shí)間:2023年04月20日 11:23:55   作者:索碼理  
這篇文章主要介紹了關(guān)于synchronized、volatile、ReentrantLock的區(qū)別與對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

聊之前先說(shuō)一下并發(fā)編程的3個(gè)特性。

并發(fā)編程特性

  1. 原子性:對(duì)共享資源的一組操作,要么成功要么失敗,不會(huì)出現(xiàn)部分成功部分失敗的情況。
  2. 可見(jiàn)性: 當(dāng)線程獲取到瑣時(shí),會(huì)拷貝一份共享資源到本地內(nèi)存,釋放鎖時(shí)會(huì)將共享資源刷新到主內(nèi)存中??梢?jiàn)性是指當(dāng)共享資源發(fā)生變化時(shí),其他線程都能夠看到這個(gè)變化。
  3. 有序性:為了提高效率,編譯器和處理器會(huì)對(duì)代碼進(jìn)行指令重排,單線程的情況下,指令重拍不會(huì)受到影響,多線程情況下可能會(huì)影響代碼執(zhí)行的正確性。有序性是指代碼編寫順序和執(zhí)行順序是一致的。

volatile

volatile 是JVM提供的最輕量級(jí)的同步機(jī)制,編譯器不會(huì)對(duì)其進(jìn)行優(yōu)化。

特性:

  • volatile 只保證共享資源的可見(jiàn)性有序性。
  • 使用volatile修飾共享資源時(shí),如果共享資源變化時(shí),會(huì)直接將緩存中的數(shù)據(jù)寫回到主內(nèi)存中去,數(shù)據(jù)也是從主內(nèi)存中讀取,從而保證了可見(jiàn)性。
  • volatile 底層是通過(guò)操作系統(tǒng)的內(nèi)存屏障來(lái)實(shí)現(xiàn)的,由于使?了內(nèi)存屏障,所以會(huì)禁?指令重排,從而就保證了有序性。

作用的地方:

volatile 只能用來(lái)修飾成員變量。

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

synchronized

synchronized關(guān)鍵字是java提供的內(nèi)置鎖來(lái)保證我們對(duì)共享資源的同步,它會(huì)自動(dòng)加鎖和釋放鎖,它的鎖是非公平鎖, synchronized關(guān)鍵字標(biāo)記的地方會(huì)被編譯器進(jìn)行優(yōu)化。synchronized會(huì)使線程串行執(zhí)行,可能會(huì)造成線程阻塞。

特性

  • synchronized關(guān)鍵字使線程串行化執(zhí)行,所以保證了并發(fā)安全的3個(gè)特性,并且還擁有以下兩個(gè)特性:
  • 互斥性:同時(shí)只有一個(gè)線程能夠訪問(wèn)synchronized方法或者同步代碼塊。
  • 可重入性synchronized是可重入鎖,通俗解釋可重入鎖就是當(dāng)一個(gè)線程獲取到了某個(gè)對(duì)象鎖或者類鎖之后,這個(gè)線程在未釋放鎖之前,再調(diào)用該鎖的其他synchronized方法或代碼塊時(shí),不用再次重新獲得鎖。

作用的地方

synchronized關(guān)鍵字可用來(lái)修飾方法或者代碼塊。

修飾方法,分為實(shí)例方法和靜態(tài)方法

  • 修飾實(shí)例方法,對(duì)象鎖
public  synchronized void objectMethods(){
   .....
}
  • 修飾靜態(tài)方法,類鎖
public static  synchronized void staticMethods(){
   .....
 }

修飾代碼塊

obj為對(duì)象的引用 對(duì)象鎖

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

Object 為某個(gè)類 類鎖

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

ReentrantLock

Lock 是 Java 5提供的一個(gè)具有鎖機(jī)制的接口,ReentrantLockLock的一個(gè)實(shí)現(xiàn),內(nèi)部是通過(guò)AQS(AbstractQueuedSynchronizer)實(shí)現(xiàn)的。ReentrantLock翻譯過(guò)來(lái)是可重入鎖,它和synchronized類似,ReentrantLock 需要手動(dòng)加鎖和釋放鎖, 相對(duì)于synchronized它更加靈活,提供了更多的方法。 ReentrantLock 有公平鎖和非公平鎖兩種方式,默認(rèn)是使用公平鎖。

特性

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

作用的地方

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

做為成員變量使用格式:

private Lock globalLock = new ReentrantLock();

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

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

做為局部變量使用格式:

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

     }finally {
         lock.unlock();
     }
 }

對(duì)比

簡(jiǎn)單對(duì)比一下三者之間的區(qū)別:

volatilesynchronizedReentrantLock
是否是關(guān)鍵字
是否需要手動(dòng)加鎖/釋放鎖
是否能保證并發(fā)安全
是否是公平鎖\有公平鎖和非公平鎖兩種實(shí)現(xiàn)
是否會(huì)阻塞線程
JVM是否會(huì)對(duì)其優(yōu)化
特性可見(jiàn)性、有序性可見(jiàn)性、有序性、原子性可見(jiàn)性、有序性、原子性
使用的地方成員變量方法、代碼塊成員變量、局部變量

到此這篇關(guān)于關(guān)于synchronized、volatile、ReentrantLock的區(qū)別與對(duì)比的文章就介紹到這了,更多相關(guān)synchronized、volatile、ReentrantLock的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)字符串匹配的示例代碼

    Java實(shí)現(xiàn)字符串匹配的示例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)字符串匹配,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • java中FileOutputStream中文亂碼問(wèn)題解決辦法

    java中FileOutputStream中文亂碼問(wèn)題解決辦法

    這篇文章主要介紹了java中FileOutputStream中文亂碼問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • hibernate查詢緩存詳細(xì)分析

    hibernate查詢緩存詳細(xì)分析

    這篇文章主要介紹了hibernate查詢緩存詳細(xì)分析,包括查詢緩存配置方法及關(guān)閉二級(jí)緩存的詳細(xì)介紹,需要的朋友參考下本文吧
    2017-09-09
  • Java中執(zhí)行docker命令的實(shí)現(xiàn)示例

    Java中執(zhí)行docker命令的實(shí)現(xiàn)示例

    本文主要介紹了Java中執(zhí)行docker命令的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • 使用maven-assembly-plugin如何打包多模塊項(xiàng)目

    使用maven-assembly-plugin如何打包多模塊項(xiàng)目

    這篇文章主要介紹了使用maven-assembly-plugin如何打包多模塊項(xiàng)目,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot3集成Quartz的示例代碼

    SpringBoot3集成Quartz的示例代碼

    Quartz由Java編寫的功能豐富的開源作業(yè)調(diào)度框架,可以集成到幾乎任何Java應(yīng)用程序中,并且能夠創(chuàng)建多個(gè)作業(yè)調(diào)度,在實(shí)際的業(yè)務(wù)中,有很多場(chǎng)景依賴定時(shí)任務(wù),比如常見(jiàn)的:訂單超時(shí)處理,業(yè)務(wù)識(shí)別和預(yù)警通知等,本文介紹了SpringBoot3如何集成Quartz
    2023-08-08
  • Java并發(fā)系列之Semaphore源碼分析

    Java并發(fā)系列之Semaphore源碼分析

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之Semaphore源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • mybatis-plus的SafetyEncryptProcessor安全加密處理示例解析

    mybatis-plus的SafetyEncryptProcessor安全加密處理示例解析

    這篇文章主要為大家介紹了mybatis-plus的SafetyEncryptProcessor安全加密處理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Spring Cloud Ribbon的踩坑記錄與原理詳析

    Spring Cloud Ribbon的踩坑記錄與原理詳析

    這篇文章主要給大家介紹了關(guān)于Spring Cloud Ribbon踩坑記錄與原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • Java import static及import原理區(qū)別解析

    Java import static及import原理區(qū)別解析

    這篇文章主要介紹了Java import static及import原理區(qū)別解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論