自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java 開發(fā)實戰(zhàn)—一起來認(rèn)識volatile機制

開發(fā) 前端
不論是求職面試還是項目實際開發(fā),volatile都是一個需要掌握的知識點,今天,我們就一起來認(rèn)識volatile機制,從實戰(zhàn)中精進我們的能力吧。

現(xiàn)如今,我們處于一個新興技術(shù)高速發(fā)展的時代,各個產(chǎn)業(yè)對于開發(fā)人員的需求更多、更高。因此,無論是在入門階段還是進階階段都需要學(xué)習(xí)大量的專業(yè)知識,不斷提高對Java的認(rèn)識是必要的。

不論是求職面試還是項目實際開發(fā),volatile都是一個需要掌握的知識點,今天,我們就一起來認(rèn)識volatile機制,從實戰(zhàn)中精進我們的能力吧。

[[404609]]

何為Volatile?為什么要用Volatile?

java是面向?qū)ο蟮母呒壘幊陶Z言,Java 語言包含兩種內(nèi)在的同步機制:同步塊(或方法)和 volatile 變量,volatile是Java提供的一種輕量級的同步機制。

在Java多線程的開發(fā)中有三種特性:原子性、可見性、有序性,使用volatile不會引起線程上下文的切換和調(diào)度,可以保證內(nèi)存可見性和防止指令重排序。

基本用法

在Java語言里,volatile關(guān)鍵字是用來修飾變量的,方式如下入所示。表示:該變量需要直接存儲到主內(nèi)存中。

  1. public class SharedClass { 
  2. public volatile int counter = 0

被volatile關(guān)鍵字修飾的 int counter 變量會直接存儲到主內(nèi)存中。并且所有關(guān)于該變量的讀操作,都會直接從主內(nèi)存中讀取,而不是直接從CPU緩存。

理解 volatile 關(guān)鍵字

對于初學(xué)者來說,volatile只是簡單的了解,只知道volatile作用就是“保證可見性”、“禁止指令重排序”,但是仍然存在一些誤區(qū)。

變量可見性問題(Variable Visibility Problem) : volatile可以保證變量變化在多線程間的可見性。

一個多線程應(yīng)用中,出于計算性能的考慮,每個線程默認(rèn)是從主內(nèi)存將該變量拷貝到線程所在CPU的緩存中,然后進行讀寫操作的。現(xiàn)在電腦基本都是多核CPU,不同的線程可能運行的不同的核上,而每個核都會有自己的緩存空間。

volatile的出現(xiàn),就是為了解決線程間不可見性,通過 volatile 修飾的變量,都會變得線程間可見。

解決多線程不可見的方式就是:

  • 通過 volatile 修飾的變量,所有關(guān)于該變量的讀操作,都會直接從主內(nèi)存中讀取,而不是 CPU 自己的緩存。而所有該變量的寫操都會寫到主內(nèi)存上。
  • 因為主內(nèi)存是所有 CPU 共享的,理所當(dāng)然即使是不同 CPU 上的線程也能看到其他線程對該變量的修改了。volatile不僅僅只保證 volatile變量的可見性,volatile 在可見性上所做的工作,實際上比保證 volatile 變量的可見性更多。

特性及原理

(1) 可見性

任意一個線程修改了 volatile 修飾的變量,其他線程可以馬上識別到最新值。實現(xiàn)可見性的原理如下。

  • 步驟 1:修改本地內(nèi)存,強制刷回主內(nèi)存。
  • 步驟 2:強制讓其他線程的工作內(nèi)存失效過期。(此部分更多的屬于MESI協(xié)議)

(2) 互斥性

同一時刻只允許一個線程操作 volatile 變量,volatile 修飾的變量在不加鎖的場景下也能實現(xiàn)有鎖的效果,類似于互斥鎖。上面的 VolatileFeaturesA.java 和下面的 VolatileFeaturesB.java 兩個類實現(xiàn)的功能是一樣的(除了 getAndAdd 方法)。

(3) 部分有序性

JVM 是使用內(nèi)存屏障來禁止指令重排,從而達到部分有序性效果,了解到內(nèi)存屏障類型,我們就可以解決那些因重排序引起的有序性問題。

什么是內(nèi)存屏障呢?內(nèi)存屏障其實就是一個CPU指令,在硬件層面上來說可以扥為兩種:Load Barrier 和 Store Barrier即讀屏障和寫屏障。主要有兩個作用:

  • 阻止屏障兩側(cè)的指令重排序;
  • 強制把寫緩沖區(qū)/高速緩存中的臟數(shù)據(jù)等寫回主內(nèi)存,讓緩存中相應(yīng)的數(shù)據(jù)失效。

在JVM層面上來說作用與上面的一樣,但是種類可以分為四種:

實現(xiàn)有序性的原理:

如果屬性使用了 volatile 修飾,在編譯的時候會在該屬性的前或后插入內(nèi)存屏障來禁止指令重排。

首先一個變量被volatile關(guān)鍵字修飾之后有兩個作用:

  • 對于寫操作:對變量更改完之后,要立刻寫回到主存中。
  • 對于讀操作:對變量讀取的時候,要從主存中讀,而不是緩存。

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2012-04-14 20:47:45

Android

2012-06-25 09:37:24

Web

2012-09-10 13:42:55

PHP項目管理

2020-06-11 18:35:23

C++編程語言

2012-11-08 17:33:53

智慧云

2009-07-14 16:35:57

Swing組件大全

2021-09-09 08:47:52

Dependency 安全漏洞工具

2009-10-29 16:32:34

Oracle表空間

2010-05-21 17:32:07

IIS服務(wù)器

2021-04-26 11:18:15

FedoraLinuxBug

2021-06-02 15:30:12

Synchronize并發(fā)多線程

2025-03-27 02:00:00

SPIJava接口

2011-09-07 22:59:07

聯(lián)想一體機

2022-05-20 12:14:50

ZuulSpringClou

2010-05-10 15:31:35

Unix文件

2023-06-28 07:49:02

2012-07-10 09:14:51

Web

2017-11-02 15:28:52

2009-09-09 09:23:37

服務(wù)器穩(wěn)定性

2017-11-02 14:39:54

點贊
收藏

51CTO技術(shù)棧公眾號