91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

洱源县| 奉新县| 庄浪县| 德州市| 安福县| 徐州市| 乌鲁木齐市| 平原县| 扎兰屯市| 湟源县| 西乌珠穆沁旗| 嘉祥县| 叶城县| 突泉县| 桂阳县| 达州市| 大新县| 永平县| 和田市| 伊宁县| 海原县| 景泰县| 盱眙县| 泰兴市| 南投市| 白朗县| 兴安县| 信阳市| 讷河市| 两当县| 连州市| 林口县| 伊宁县| 涡阳县| 吉木乃县| 拉孜县| 星子县| 班玛县| 济南市| 子洲县| 和龙市|