java volatile關(guān)鍵字使用方法及注意事項(xiàng)
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、做網(wǎng)站與策劃設(shè)計(jì),拉孜網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:拉孜等地區(qū)。拉孜做網(wǎng)站價(jià)格咨詢:18980820575
什么是volatile關(guān)鍵字
volatile 關(guān)鍵字在多線程程序中起著很重要的作用。當(dāng)多個(gè)線程操作同一個(gè)變量時(shí),每個(gè)線程將擁有對(duì)那個(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 類,對(duì)以上程序進(jìn)行測(cè)試,代碼如下:
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è)事件對(duì)對(duì)象的所有改變都可以被第二個(gè)事件看到和反映出。比如當(dāng)一個(gè)線程對(duì) volatile 變量進(jìn)行寫操作后,另一個(gè)線程隨后訪問該變量,happens-before 關(guān)系就建立了。因此,所有對(duì) volatile 變量的改變對(duì)其他線程來說是可見的。
需要注意的
當(dāng)在程序中使用 volatile 關(guān)鍵字時(shí),我們必須注意以下幾點(diǎn):
以上就是關(guān)于java volatile關(guān)鍵字的使用方法,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
新聞名稱:javavolatile關(guān)鍵字使用方法及注意事項(xiàng)
網(wǎng)站URL:http://jinyejixie.com/article34/ijcise.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、服務(wù)器托管、App設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、建站公司、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)