最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java關(guān)鍵字volatile和synchronized作用和區(qū)別

 更新時(shí)間:2020年06月19日 11:41:24   作者:無盡循環(huán)  
這篇文章主要為大家詳細(xì)介紹了Java關(guān)鍵字volatile和synchronized的作用和區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

volatile是變量修飾符,而synchronized則是作用于一段代碼或方法;如下三句get代碼:

int i1;
int geti1() {return i1;}

volatile int i2;
int geti2() {return i2;}

int i3;
synchronized int geti3() {return i3;}


geti1() 得到存儲(chǔ)在當(dāng)前線程中i1的數(shù)值。多個(gè)線程有多個(gè)i1變量拷貝,而且這些i1之間可以相互不同。換句話說,另一個(gè)線程可能已經(jīng)改變了它線程內(nèi)的i1值,而這個(gè)值可以和當(dāng)前線程中的i1值不相同。 在Java內(nèi)存模型中,有main memory(主內(nèi)存區(qū)域),這里存放了變量目前的“準(zhǔn)確值”,每個(gè)線程也有自己的memory(例如寄存器)。為了性能,一個(gè)線程會(huì)在自己的memory中保存要訪問的變量的副本。這樣就會(huì)出現(xiàn)同一個(gè)變量在某個(gè)瞬間,在一個(gè)線程的memory中的值可能與另外一個(gè)線程memory的值,或者main memory的值不一致的情況。因此實(shí)際上存在一種可能:main memory的值i1值是1,線程1里的i1是2,線程2里的i1值是3,這在線程1和線程2都改變了他們各自的i1值,而且這個(gè)改變還沒來得及傳給main memory 或其他線程時(shí)就會(huì)發(fā)生。

geti2() 得到的是main memory的i2數(shù)值。一個(gè)變量聲明為volatile,就意味著這個(gè)變量是隨時(shí)會(huì)被其他線程修改的,因此不能將它c(diǎn)ache在線程memory中。換句話說,一個(gè)變量經(jīng)過volatile修飾后在所有線程中必須是同步的,任何線程中改變了它的值,所有其他線程立即獲得了相同的值。所以,volatile修飾的變量存取時(shí)比一般變量消耗的資源要多一點(diǎn),因?yàn)榫€程有它自己的變量拷貝更為高效。

geti3()方法被synchronized修飾,用synchronized來修飾一個(gè)方法或者一個(gè)貸款的時(shí)候,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼。既然volatile關(guān)鍵字已經(jīng)實(shí)現(xiàn)了線程間數(shù)據(jù)同步,又要synchronized干嘛呢?當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對(duì)象object中的這個(gè)synchronized(this)同步貸款時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊才能執(zhí)行該代碼塊。然而,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。尤其關(guān)鍵的是,當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí)候,其他線程對(duì)object中所有其他synchronized(this)同步代碼塊的訪問將被阻塞。當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),它就獲得了這個(gè)object的對(duì)象鎖,結(jié)果,其他線程對(duì)該對(duì)象所有同步代碼部分的訪問都被暫時(shí)阻塞。

總結(jié)一下區(qū)別:

一,volatile是變量修飾符,而synchronized則作用于一段代碼或者方法。

二,volatile只是在線程內(nèi)存和main memory(主內(nèi)存)間同步某個(gè)變量的值;而synchronized通過鎖定和解鎖某個(gè)監(jiān)視器同步所有變量的值。顯然synchronized要比volatile消耗更多資源。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Java實(shí)現(xiàn)價(jià)格加密與優(yōu)化功能

    使用Java實(shí)現(xiàn)價(jià)格加密與優(yōu)化功能

    在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)加密是一個(gè)非常重要的環(huán)節(jié),尤其是在處理敏感信息(如價(jià)格、用戶數(shù)據(jù)等)時(shí),本文將詳細(xì)介紹如何使用?Java?實(shí)現(xiàn)價(jià)格加密,并對(duì)代碼進(jìn)行優(yōu)化,需要的朋友可以參考下
    2025-01-01
  • springBoot?@Scheduled實(shí)現(xiàn)多個(gè)任務(wù)同時(shí)開始執(zhí)行

    springBoot?@Scheduled實(shí)現(xiàn)多個(gè)任務(wù)同時(shí)開始執(zhí)行

    這篇文章主要介紹了springBoot?@Scheduled實(shí)現(xiàn)多個(gè)任務(wù)同時(shí)開始執(zhí)行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 解決Spring Cloud feign GET請(qǐng)求無法用實(shí)體傳參的問題

    解決Spring Cloud feign GET請(qǐng)求無法用實(shí)體傳參的問題

    這篇文章主要介紹了解決Spring Cloud feign GET請(qǐng)求無法用實(shí)體傳參的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Java 注解@PostConstruct的原理及使用場(chǎng)景

    Java 注解@PostConstruct的原理及使用場(chǎng)景

    @PostConstruct 是 Java 中用于標(biāo)記初始化方法的注解,本文將詳細(xì)講解 @PostConstruct 的原理、使用場(chǎng)景及最佳實(shí)踐,感興趣的朋友一起看看吧
    2025-04-04
  • spring?boot整合mongo查詢converter異常排查記錄

    spring?boot整合mongo查詢converter異常排查記錄

    這篇文章主要為大家介紹了spring?boot整合mongo查詢時(shí)拋出converter異常的排查解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • 淺析SpringBoot中使用thymeleaf找不到.HTML文件的原因

    淺析SpringBoot中使用thymeleaf找不到.HTML文件的原因

    這篇文章主要介紹了SpringBoot中使用thymeleaf找不到.HTML文件的原因分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 詳解JVM的分代模型

    詳解JVM的分代模型

    這篇文章主要介紹了JVM的分代模型的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java虛擬機(jī)相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-10-10
  • BufferedReader中read()方法和readLine()方法的使用

    BufferedReader中read()方法和readLine()方法的使用

    這篇文章主要介紹了BufferedReader中read()方法和readLine()方法的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Spring?Boot?利用?XML?方式整合?MyBatis

    Spring?Boot?利用?XML?方式整合?MyBatis

    這篇文章主要介紹了Spring?Boot?利用?XML?方式整合?MyBatis,文章圍繞主題的相關(guān)資料展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,組要的小伙伴可以參考一下
    2022-05-05
  • 簡(jiǎn)單了解java等待喚醒機(jī)制原理及使用

    簡(jiǎn)單了解java等待喚醒機(jī)制原理及使用

    這篇文章主要介紹了簡(jiǎn)單了解java等待喚醒機(jī)制原理及使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

手游| 招远市| 教育| 教育| 米脂县| 乐山市| 武定县| 临沭县| 论坛| 阳新县| 子洲县| 桦川县| 海口市| 博客| 同江市| 绥芬河市| 阿合奇县| 合江县| 临猗县| 新泰市| 峡江县| 昭通市| 华蓥市| 庆阳市| 察隅县| 阿克陶县| 廊坊市| 西乡县| 喀什市| 蓬安县| 沙坪坝区| 古田县| 嫩江县| 巴里| 兴宁市| 汉源县| 二连浩特市| 循化| 镇平县| 都兰县| 花垣县|