日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中volatile关键字---学习笔记

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中volatile关键字---学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

volatile關鍵字的作用
在java內存模型中,線程之間共享堆內存(對應主內存),但又各自擁有自己的本地內存——棧內存,線程的棧內存中緩存有共享變量的副本,但如果是被volatile修飾的變量,線程每次都直接從堆內存中讀取最新值,并在操作完成時將新值寫入堆內存。

但需要注意的一點是:volatile關鍵字只能保證主存中的變量值是最新的,并不能保證操作的原子性,因此它不能代替synchronized。像簡單的i++也不是原子操作,它包括了read(i),inc(i),write(i)的過程,可能:當一個線程剛從主存中讀取出i的最新值還未進行下一步操作時,另一個線程正往主存中寫入新值,此時就會出現線程不安全的情況。

什么是線程安全?
通俗的解釋就是:有多個線程在同時運行一段代碼,如果每次運行的結果和單線程運行的結果一樣,而且其他的變量值也和預期的一樣,這樣叫做線程安全。例子:一個線程安全的計數器類的同一個實例對象在被多個線程使用的情況下也不會出現計算失誤。

volatile擁有可見性但是不具有原子性的驗證
這里通過創建1000個線程對同一個計數器Counter進行++操作來驗證volatile的線程安全性。為了排除main thread最后讀取count值時,尚有線程沒有結束的情況,這里引入 Java concurrent包里面的一個同步輔助類CountDownLatch,通過countDown()方法和await()方法來保證main thread最后讀取到的count值是主存中最新的。

CountDownLatch latch = new CountDownLatch(1000); //用給定的計數次數1000進行初始化。
latch.countDown(); //此操作是原子操作,即同時只允許有一個線程去減這個計數器里面的值。
latch.await();//在計數器latch里面的值變為0之前一直處于阻塞狀態。

import java.util.concurrent.CountDownLatch;public class Counter {public volatile static int count = 0;CountDownLatch latch = new CountDownLatch(1000); public static void inc() {count++;}//1000 threads start simultaneously for i ++ calculations, to see the actual results ;public void test() throws InterruptedException {for (int i = 0; i < 1000; i++) {new Thread(new Runnable() {@Overridepublic void run() {Counter.inc();}}).start();latch.countDown(); //Ensure that all threads have been completed ;System.out.println("Come here " + (i + 1) + " times");}latch.await(); //Until 1000 threads complete before reading the counter value inside ;System.out.println(Thread.currentThread().getName() + " thread : " + Counter.count);}//Here the value of each run are likely to differ , possibly 1000 ;public static void main(String[] args) {try {new Counter().test();} catch (InterruptedException e) {e.printStackTrace();}} }

運行結果:

測試結果說明:java中的volatile關鍵字只可保證讀取可見性但并不是線程安全的,在實際使用過程中,我們要具體情況具體分析。

總結

以上是生活随笔為你收集整理的java中volatile关键字---学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。