java volatile關(guān)鍵字使用方法及注意事項(xiàng)
java volatile關(guān)鍵字使用方法及注意事項(xiàng)
什么是volatile關(guān)鍵字
volatile 關(guān)鍵字在多線程程序中起著很重要的作用。當(dāng)多個(gè)線程操作同一個(gè)變量時(shí),每個(gè)線程將擁有對那個(gè)變量的本地緩存拷貝,因此,當(dāng)某一個(gè)線程修改了這個(gè)變量的值時(shí),實(shí)際上修改的是它本地緩存中的變量值,而不是主內(nèi)存中的變量值,操作這個(gè)變量的其他線程并不知道這個(gè)變量的值被改變了。為了避免這種情況,我們可以用 valatile 關(guān)鍵字聲明這個(gè)變量,用 valatile 聲明了這個(gè)變量之后,變量將不在本地緩存中保存,而在主內(nèi)存中保存,當(dāng)有線程修改了它的值以后,它的更新值將被更新到主內(nèi)存當(dāng)中,隨后,其他線程也能訪問更新后的值。當(dāng)一個(gè)變量被聲明為 volatile 后,java 內(nèi)存模型確保所有使用該變量的線程能看到相同的、一致的值。
volatile關(guān)鍵字使用
首先,創(chuàng)建 VolatileData 類,代碼如下:
public class VolatileData {
//聲明為volatile類型
private volatile int counter = 0;
/**
* 返回counter變量的值
* @return
*/
public int getCounter() {
return counter;
}
/**
* 自增counter變量的值
*/
public void increaseCounter() {
++counter;
}
}
接下來創(chuàng)建 VolatileThread 類,代碼如下:
public class VolatileThread extends Thread {
private final VolatileData volatileData;
public VolatileThread(VolatileData volatileData) {
this.volatileData = volatileData;
}
/**
* 調(diào)用VolatileData類中的兩個(gè)方法,進(jìn)行取值和自增操作
*/
@Override
public void run() {
int oldValue = volatileData.getCounter();
System.out.println("[Thread " + Thread.currentThread().getId() + "]: Old value = " + oldValue);
volatileData.increaseCounter();
int newValue = volatileData.getCounter();
System.out.println("[Thread " + Thread.currentThread().getId() + "]: New value = " + newValue);
}
}
最后,創(chuàng)建 VolatileMain 類,對以上程序進(jìn)行測試,代碼如下:
public class VolatileMain {
private final static int TOTAL_THREADS = 2;
public static void main(String[] args) throws InterruptedException {
VolatileData volatileData = new VolatileData();
Thread[] threads = new Thread[TOTAL_THREADS];
for(int i = 0; i < TOTAL_THREADS; ++i)
threads[i] = new VolatileThread(volatileData);
//開始讀取變量值的操作
for(int i = 0; i < TOTAL_THREADS; ++i)
threads[i].start();
//等待所有線程操作終止
for(int i = 0; i < TOTAL_THREADS; ++i)
threads[i].join();
}
}
在 VolatileMain 類中,使用了兩個(gè)線程來訪問 volatile 變量,輸出如下:
[Thread 10]: Old value = 0 [Thread 11]: Old value = 0 [Thread 10]: New value = 1 [Thread 11]: New value = 2
從輸出可以看到,首先,兩個(gè)線程都輸出了相同的值,接著,在 increaseCounter 方法被調(diào)用之后,兩個(gè)線程都訪問和輸出了最新的 volatile 變量的值。
happens-before 關(guān)系
在使用 volatile 關(guān)鍵字時(shí),不得不提一下 java 內(nèi)存模型的 happens-before 關(guān)系。happens-before 關(guān)系是 java 內(nèi)存模型的一個(gè)重要方面。它建立在兩個(gè)不同的事件之間,使第一個(gè)事件對對象的所有改變都可以被第二個(gè)事件看到和反映出。比如當(dāng)一個(gè)線程對 volatile 變量進(jìn)行寫操作后,另一個(gè)線程隨后訪問該變量,happens-before 關(guān)系就建立了。因此,所有對 volatile 變量的改變對其他線程來說是可見的。
需要注意的
當(dāng)在程序中使用 volatile 關(guān)鍵字時(shí),我們必須注意以下幾點(diǎn):
- volatile 關(guān)鍵字并不能消除原子之間的同步操作的需要,因?yàn)閮?nèi)存一致性錯(cuò)誤仍然是可能的
- 使用原子變量比使用 synchronized 同步代碼更有效率,但是為了避免內(nèi)存一致性錯(cuò)誤,需要作出額外的努力
- volatile 關(guān)鍵字不能替代 synchronized 同步代碼塊和方法
以上就是關(guān)于java volatile關(guān)鍵字的使用方法,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 深入解析Java中volatile關(guān)鍵字的作用
- Java中volatile關(guān)鍵字的作用與用法詳解
- Java中Volatile關(guān)鍵字詳解及代碼示例
- Java中volatile關(guān)鍵字實(shí)現(xiàn)原理
- java多線程編程之慎重使用volatile關(guān)鍵字
- 談?wù)凧ava中Volatile關(guān)鍵字的理解
- 詳解Java面試官最愛問的volatile關(guān)鍵字
- 詳解Java線程編程中的volatile關(guān)鍵字的作用
- Java里volatile關(guān)鍵字是什么意思
- Java中volatile關(guān)鍵字的作用是什么舉例詳解
相關(guān)文章
詳解IDEA中MAVEN項(xiàng)目打JAR包的簡單方法
本篇文章主要介紹了詳解IDEA中MAVEN項(xiàng)目打JAR包的簡單方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
Mybatis錯(cuò)誤引起的程序啟動(dòng)卡死問題及解決
這篇文章主要介紹了Mybatis錯(cuò)誤引起的程序啟動(dòng)卡死問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
springcloud + mybatis + seate集成示例
本文主要介紹了springcloud + mybatis + seate集成示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
java圖片和文本同時(shí)提交到表單的實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于java實(shí)現(xiàn)圖片和文本同時(shí)提交到表單的相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2020-02-02
SpringCloud Gateway自動(dòng)裝配實(shí)現(xiàn)流程詳解
Spring Cloud Gateway旨在為微服務(wù)架構(gòu)提供一種簡單有效的、統(tǒng)一的 API 路由管理方式。Spring Cloud Gateway 作為 Spring Cloud 生態(tài)系中的網(wǎng)關(guān),它不僅提供統(tǒng)一的路由方式,并且基于 Filter 鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/埋點(diǎn)和限流等2022-10-10

