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

詳解Java并發(fā)編程之volatile關(guān)鍵字

 更新時(shí)間:2021年11月22日 16:06:30   作者:smileNicky  
這篇文章主要為大家介紹了Java并發(fā)編程之volatile關(guān)鍵字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

1、volatile是什么?

首先簡(jiǎn)單說(shuō)一下,volatile是什么?volatile是Java中的一個(gè)關(guān)鍵字,也是一種同步機(jī)制。volatile為了保證變量的可見(jiàn)性,通過(guò)volatile修飾的變量具有共享性。修改了volatile修飾的變量,其它線程是可以讀取到最新的值的

2、并發(fā)編程的三大特性

并發(fā)編程有三個(gè)重要特性:原子行、可見(jiàn)性有序性

原子性:原子性是指一個(gè)或者多個(gè)操作,要么全部執(zhí)行且執(zhí)行過(guò)程不會(huì)被其它操作打斷,要么全部不執(zhí)行。

可見(jiàn)性:可見(jiàn)性是指共享變量對(duì)于多個(gè)線程都是可見(jiàn)的,也即一個(gè)線程修改了變量,其它線程馬上就能知道

有序性:有序性是指程序的執(zhí)行順序按照代碼的先后順便執(zhí)行

3、什么是指令重排序?

假如我們寫一個(gè)程序,我們會(huì)期待這些語(yǔ)句的實(shí)際執(zhí)行順便和代碼的順序是一致的,大部分情況是一致的,但實(shí)際上,編譯器、JVM 或者 CPU 都有可能出于優(yōu)化等目的,對(duì)執(zhí)行的順序進(jìn)行調(diào)整,這個(gè)就是指令重排序

重排序的好處:提高處理速度

代碼順序如圖:

在這里插入圖片描述

指令重排后,a=100; a= a+100會(huì)提到一起執(zhí)行,效率提高

在這里插入圖片描述

上面的例子,是可以提高執(zhí)行效率,但是有時(shí)候指令重排是會(huì)導(dǎo)致問(wèn)題的,如下代碼例子,代碼順序是先初始化content,然后設(shè)置標(biāo)識(shí)為true,線程B檢測(cè)到為true之后,調(diào)用content的方法

在這里插入圖片描述

如果指令重排后,這種情況就會(huì)出現(xiàn)沒(méi)初始化完成,就直接調(diào)用conten的方法

在這里插入圖片描述

所以,指令重排有好處也有壞處,一般可能是cpu、編譯器或者是內(nèi)存會(huì)進(jìn)行指令重排,為了避免指令重排,保證并發(fā)編程的有序性,有時(shí)候需要使用synchronized或者volatile等等方式避免。volatile可以避免指令重排,保證并發(fā)編程的有序性,依賴于操作系統(tǒng)的內(nèi)存屏障

4、volatile有什么作用?

從前面的學(xué)習(xí)也可以指定,volatile關(guān)鍵字是可以保證并發(fā)編程的有序性和可見(jiàn)性的

保證可見(jiàn)性

volatile保證可見(jiàn)性:

使用volatile變量時(shí),必須重新從主內(nèi)存加載到工作內(nèi)存修改volatile變量后,必須馬上同步回主內(nèi)存

可見(jiàn)性涉及到Java內(nèi)存模型,詳細(xì)可以參考我上篇博客:鏈接

java內(nèi)存模型(JMM)結(jié)構(gòu)圖,每個(gè)Java線程都有自己的工作內(nèi)存,volatile修飾的變量,修改后,會(huì)自動(dòng)同步到主內(nèi)存;每個(gè)線程讀取時(shí)都會(huì)從主內(nèi)存先讀取到工作內(nèi)存的副本

在這里插入圖片描述

注意:volatile只能保證變量的可見(jiàn)性,對(duì)于一個(gè)Java對(duì)象是不能保證的,要去對(duì)象具體的屬性設(shè)置volatile

保證有序性

對(duì)于并發(fā)編程的有序性問(wèn)題,前面已經(jīng)做了比較詳細(xì)的描述,主要是cpu、jvm、內(nèi)存都會(huì)對(duì)代碼執(zhí)行順序進(jìn)行指令重排序,加上volatile可以保證有序性,避免指令重排,依賴于操作系統(tǒng)的內(nèi)存屏障?

5、volatile可以保證原子性?

volatitle只能保證單個(gè)變量的原子性,不能保證一系列操作的原子操作的,所以volatile是線程不安全的,不具有原子性

6、volatile 和 synchronized對(duì)比

volatile不可以保證線程安全,synchronized可以保證線程安全volatile是輕量的,而且是沒(méi)有鎖機(jī)制的,性能比synchronized好volatile不具有原子性,synchronized可以保證原子性

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java如何把文件夾打成壓縮包并導(dǎo)出

    Java如何把文件夾打成壓縮包并導(dǎo)出

    這篇文章主要介紹了Java如何把文件夾打成壓縮包并導(dǎo)出,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java基于jedisLock—redis分布式鎖實(shí)現(xiàn)示例代碼

    java基于jedisLock—redis分布式鎖實(shí)現(xiàn)示例代碼

    這篇文章主要介紹了jedisLock—redis分布式鎖實(shí)現(xiàn)示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Spring Data JPA進(jìn)行數(shù)據(jù)分頁(yè)與排序的方法

    Spring Data JPA進(jìn)行數(shù)據(jù)分頁(yè)與排序的方法

    這篇文章主要介紹了Spring Data JPA進(jìn)行數(shù)據(jù)分頁(yè)與排序的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java基礎(chǔ)之類型封裝器示例

    Java基礎(chǔ)之類型封裝器示例

    這篇文章主要介紹了Java基礎(chǔ)之類型封裝器,結(jié)合實(shí)例形式分析了java類型封裝相關(guān)原理與操作技巧,需要的朋友可以參考下
    2019-08-08
  • Java基礎(chǔ)-Java基本數(shù)據(jù)類型

    Java基礎(chǔ)-Java基本數(shù)據(jù)類型

    這篇文章主要介紹了Java基礎(chǔ)-Java基本數(shù)據(jù)類型,變量就是申請(qǐng)內(nèi)存來(lái)存儲(chǔ)值。也就是說(shuō),當(dāng)創(chuàng)建變量的時(shí)候,需要在內(nèi)存中申請(qǐng)空間,下面我們就來(lái)對(duì)Java基本數(shù)據(jù)類型作簡(jiǎn)單的介紹,需要的朋友可以參考一下
    2022-01-01
  • SpringCloud中的Eureka集群配置方法

    SpringCloud中的Eureka集群配置方法

    這篇文章主要介紹了SpringCloud中的Eureka集群配置,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • java中form以post、get方式提交數(shù)據(jù)中文亂碼問(wèn)題總結(jié)

    java中form以post、get方式提交數(shù)據(jù)中文亂碼問(wèn)題總結(jié)

    這篇文章主要介紹了java中form以post、get方式提交數(shù)據(jù)中文亂碼問(wèn)題總結(jié),需要的朋友可以參考下
    2014-10-10
  • 如何使用Java爬蟲(chóng)批量爬取圖片

    如何使用Java爬蟲(chóng)批量爬取圖片

    這篇文章主要介紹了如何使用Java爬蟲(chóng)批量爬取圖片,對(duì)于爬蟲(chóng)的入門來(lái)說(shuō),圖片相對(duì)來(lái)說(shuō)是比較容易獲取的,因?yàn)榇蟛糠謭D片都不是敏感數(shù)據(jù),所以不會(huì)遇到什么反爬措施,對(duì)于入門爬蟲(chóng)來(lái)說(shuō)是比較合適的,需要的朋友可以參考下
    2023-04-04
  • 教你用Java Swing實(shí)現(xiàn)自助取款機(jī)系統(tǒng)

    教你用Java Swing實(shí)現(xiàn)自助取款機(jī)系統(tǒng)

    今天給大家?guī)?lái)的是關(guān)于JAVA的相關(guān)知識(shí),文章圍繞著如何用Java Swing實(shí)現(xiàn)自助取款機(jī)系統(tǒng)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java如何從json字符串中獲取某個(gè)值詳解

    Java如何從json字符串中獲取某個(gè)值詳解

    Java開(kāi)發(fā)當(dāng)中經(jīng)常需要Json格式的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java如何從json字符串中獲取某個(gè)值的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評(píng)論