中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么使用volatile關鍵字

發布時間:2021-07-23 15:49:17 來源:億速云 閱讀:149 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關Java中怎么使用volatile關鍵字,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

volatile關鍵字用于聲明簡單類型變量,如int、float、boolean等數據類型。如果這些簡單數據類型聲明為volatile,對它們的操作就會變成原子級別的。但這有一定的限制。例如,下面的例子中的n就不是原子級別的:

package mythread;   public class JoinThread extends Thread  {      public static volatile int n = 0;      public void run()      {          for (int i = 0; i < 10; i++)              try         {                  n = n + 1;                  sleep(3); // 為了使運行結果更隨機,延遲3毫秒               }              catch (Exception e)              {              }      }       public static void main(String[] args) throws Exception      {           Thread threads[] = new Thread[100];          for (int i = 0; i < threads.length; i++)              // 建立100個線程              threads[i] = new JoinThread();          for (int i = 0; i < threads.length; i++)              // 運行剛才建立的100個線程              threads[i].start();          for (int i = 0; i < threads.length; i++)              // 100個線程都執行完后繼續              threads[i].join();          System.out.println("n=" + JoinThread.n);      }  }

如果對n的操作是原子級別的,***輸出的結果應該為n=1000,而在執行上面積代碼時,很多時侯輸出的n都小于1000,這說明n=n+1不是原子級別的操作。原因是聲明為volatile的簡單變量如果當前值由該變量以前的值相關,那么volatile關鍵字不起作用,也就是說如下的表達式都不是原子操作:

n = n + 1;
n++;

如果要想使這種情況變成原子操作,需要使用synchronized關鍵字,如上的代碼可以改成如下的形式:

package mythread;   public class JoinThread extends Thread  {      public static int n = 0;       public static synchronized void inc()      {          n++;      }      public void run()      {          for (int i = 0; i < 10; i++)              try             {                  inc(); // n = n + 1 改成了 inc();                  sleep(3); // 為了使運行結果更隨機,延遲3毫秒               }              catch (Exception e)              {              }      }       public static void main(String[] args) throws Exception      {           Thread threads[] = new Thread[100];          for (int i = 0; i < threads.length; i++)              // 建立100個線程              threads[i] = new JoinThread();          for (int i = 0; i < threads.length; i++)              // 運行剛才建立的100個線程              threads[i].start();          for (int i = 0; i < threads.length; i++)              // 100個線程都執行完后繼續              threads[i].join();          System.out.println("n=" + JoinThread.n);      }  }

上面的代碼將n=n+1改成了inc(),其中inc方法使用了synchronized關鍵字進行方法同步。因此,在使用volatile關鍵字時要慎重,并不是只要簡單類型變量使用volatile修飾,對這個變量的所有操作都是原來操作,當變量的值由自身的上一個決定時,如n=n+1、n++等,volatile關鍵字將失效,只有當變量的值和自身上一個值無關時對該變量的操作才是原子級別的,如n = m + 1,這個就是原級別的。所以在使用volatile關鍵時一定要謹慎,如果自己沒有把握,可以使用synchronized來代替volatile。

上述就是小編為大家分享的Java中怎么使用volatile關鍵字了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

米易县| 丹阳市| 磐安县| 泽库县| 枣庄市| 江孜县| 枣阳市| 永登县| 惠东县| 江阴市| 林西县| 高邑县| 靖远县| 德兴市| 黎川县| 河北省| 汉寿县| 花莲县| 老河口市| 休宁县| 裕民县| 崇左市| 铁岭市| 蓝山县| SHOW| 乐昌市| 巴东县| 化隆| 张家界市| 安达市| 桃园县| 芮城县| 许昌县| 达日县| 织金县| 石阡县| 巧家县| 新蔡县| 红原县| 简阳市| 县级市|