自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

初學(xué)Java多線程:慎重使用volatile關(guān)鍵字

開發(fā) 后端
學(xué)習(xí)Java多線程中會遇到使用volatile關(guān)鍵字的情況。volatile關(guān)鍵字用于聲明簡單類型變量,如int、float、boolean等數(shù)據(jù)類型。使用它有一定的限制。

volatile關(guān)鍵字相信了解Java多線程的讀者都很清楚它的作用。volatile關(guān)鍵字用于聲明簡單類型變量,如int、float、boolean等數(shù)據(jù)類型。如果這些簡單數(shù)據(jù)類型聲明為volatile,對它們的操作就會變成原子級別的。但這有一定的限制。例如,下面的例子中的n就不是原子級別的:

  1. package mythread;  
  2.  
  3. public class JoinThread extends Thread  
  4. {  
  5.     public static volatile int n = 0;  
  6.     public void run()  
  7.     {  
  8.         for (int i = 0; i < 10; i++)  
  9.             try 
  10.         {  
  11.                 n = n + 1;  
  12.                 sleep(3); // 為了使運(yùn)行結(jié)果更隨機(jī),延遲3毫秒  
  13.  
  14.             }  
  15.             catch (Exception e)  
  16.             {  
  17.             }  
  18.     }  
  19.  
  20.     public static void main(String[] args) throws Exception  
  21.     {  
  22.  
  23.         Thread threads[] = new Thread[100];  
  24.         for (int i = 0; i < threads.length; i++)  
  25.             // 建立100個線程  
  26.             threads[i] = new JoinThread();  
  27.         for (int i = 0; i < threads.length; i++)  
  28.             // 運(yùn)行剛才建立的100個線程  
  29.             threads[i].start();  
  30.         for (int i = 0; i < threads.length; i++)  
  31.             // 100個線程都執(zhí)行完后繼續(xù)  
  32.             threads[i].join();  
  33.         System.out.println("n=" + JoinThread.n);  
  34.     }  
  35. }  
  36.        

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

n = n + 1;
n++;

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

  1. package mythread;  
  2.  
  3. public class JoinThread extends Thread  
  4. {  
  5.     public static int n = 0;  
  6.  
  7.     public static synchronized void inc()  
  8.     {  
  9.         n++;  
  10.     }  
  11.     public void run()  
  12.     {  
  13.         for (int i = 0; i < 10; i++)  
  14.             try 
  15.             {  
  16.                 inc(); // n = n + 1 改成了 inc();  
  17.                 sleep(3); // 為了使運(yùn)行結(jié)果更隨機(jī),延遲3毫秒  
  18.  
  19.             }  
  20.             catch (Exception e)  
  21.             {  
  22.             }  
  23.     }  
  24.  
  25.     public static void main(String[] args) throws Exception  
  26.     {  
  27.  
  28.         Thread threads[] = new Thread[100];  
  29.         for (int i = 0; i < threads.length; i++)  
  30.             // 建立100個線程  
  31.             threads[i] = new JoinThread();  
  32.         for (int i = 0; i < threads.length; i++)  
  33.             // 運(yùn)行剛才建立的100個線程  
  34.             threads[i].start();  
  35.         for (int i = 0; i < threads.length; i++)  
  36.             // 100個線程都執(zhí)行完后繼續(xù)  
  37.             threads[i].join();  
  38.         System.out.println("n=" + JoinThread.n);  
  39.     }  
  40. }  

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

【編輯推薦】

  1. 初學(xué)Java多線程:join方法的使用
  2. 初學(xué)Java多線程:線程的生命周期
  3. 初學(xué)Java多線程:使用Runnable接口創(chuàng)建線程
  4. 初學(xué)Java多線程:用Thread類創(chuàng)建線程
  5. 初學(xué)Java多線程:線程簡介
責(zé)任編輯:yangsai 來源: 真的有外星人嗎
相關(guān)推薦

2009-06-29 18:26:11

Java多線程Synchronize同步類

2020-07-17 20:15:03

架構(gòu)JMMvolatile

2017-05-27 20:59:30

Java多線程synchronize

2022-06-29 08:05:25

Volatile關(guān)鍵字類型

2019-09-04 14:14:52

Java編程數(shù)據(jù)

2011-06-14 13:26:27

volatile

2010-03-15 18:11:38

Java多線程

2024-02-21 20:46:48

C++編程volatile

2011-06-21 09:50:51

volatile

2018-01-19 10:43:06

Java面試官volatile關(guān)鍵字

2022-08-17 07:53:10

Volatile關(guān)鍵字原子性

2020-11-11 08:45:48

Java

2023-06-26 08:02:34

JSR重排序volatile

2009-06-29 18:00:05

Java多線程Runnable接口創(chuàng)建線程

2019-12-20 15:19:41

Synchroinze線程安全

2009-06-29 17:49:47

Java多線程

2012-06-02 00:53:39

Javafinally

2009-06-29 18:08:51

Java多線程join方法

2024-03-15 08:18:25

volatileAtomic關(guān)鍵字

2016-09-19 21:53:30

Java并發(fā)編程解析volatile
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號