成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

  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個(gè)線程  
  26.             threads[i] = new JoinThread();  
  27.         for (int i = 0; i < threads.length; i++)  
  28.             // 運(yùn)行剛才建立的100個(gè)線程  
  29.             threads[i].start();  
  30.         for (int i = 0; i < threads.length; i++)  
  31.             // 100個(gè)線程都執(zhí)行完后繼續(xù)  
  32.             threads[i].join();  
  33.         System.out.println("n=" + JoinThread.n);  
  34.     }  
  35. }  
  36.        

如果對(duì)n的操作是原子級(jí)別的,***輸出的結(jié)果應(yīng)該為n=1000,而在執(zhí)行上面積代碼時(shí),很多時(shí)侯輸出的n都小于1000,這說(shuō)明n=n+1不是原子級(jí)別的操作。原因是聲明為volatile的簡(jiǎn)單變量如果當(dāng)前值由該變量以前的值相關(guān),那么volatile關(guān)鍵字不起作用,也就是說(shuō)如下的表達(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個(gè)線程  
  31.             threads[i] = new JoinThread();  
  32.         for (int i = 0; i < threads.length; i++)  
  33.             // 運(yùn)行剛才建立的100個(gè)線程  
  34.             threads[i].start();  
  35.         for (int i = 0; i < threads.length; i++)  
  36.             // 100個(gè)線程都執(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)鍵字時(shí)要慎重,并不是只要簡(jiǎn)單類型變量使用volatile修飾,對(duì)這個(gè)變量的所有操作都是原來(lái)操作,當(dāng)變量的值由自身的上一個(gè)決定時(shí),如n=n+1、n++等,volatile關(guān)鍵字將失效,只有當(dāng)變量的值和自身上一個(gè)值無(wú)關(guān)時(shí)對(duì)該變量的操作才是原子級(jí)別的,如n = m + 1,這個(gè)就是原級(jí)別的。所以在使用volatile關(guān)鍵時(shí)一定要謹(jǐn)慎,如果自己沒(méi)有把握,可以使用synchronized來(lái)代替volatile。

【編輯推薦】

  1. 初學(xué)Java多線程:join方法的使用
  2. 初學(xué)Java多線程:線程的生命周期
  3. 初學(xué)Java多線程:使用Runnable接口創(chuàng)建線程
  4. 初學(xué)Java多線程:用Thread類創(chuàng)建線程
  5. 初學(xué)Java多線程:線程簡(jiǎn)介
責(zé)任編輯:yangsai 來(lái)源: 真的有外星人嗎
相關(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

2025-06-13 08:00:00

Java并發(fā)編程volatile

2022-06-29 08:05:25

Volatile關(guān)鍵字類型

2011-06-14 13:26:27

volatile

2019-09-04 14:14:52

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

2010-03-15 18:11:38

Java多線程

2024-02-21 20:46:48

C++編程volatile

2011-06-21 09:50:51

volatile

2022-08-17 07:53:10

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

2018-01-19 10:43:06

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

2023-06-26 08:02:34

JSR重排序volatile

2020-11-11 08:45:48

Java

2019-12-20 15:19:41

Synchroinze線程安全

2009-06-29 18:00:05

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

2009-06-29 17:49:47

Java多線程

2012-06-02 00:53:39

Javafinally

2024-03-15 08:18:25

volatileAtomic關(guān)鍵字

2016-09-19 21:53:30

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

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

主站蜘蛛池模板: 91精品国产综合久久久久久 | 欧美中文字幕一区二区三区 | 国产欧美一区二区三区在线看 | 亚洲欧美日韩在线 | 久久黄色| 亚洲精品一| v片网站| 在线日韩精品视频 | 久久夜夜| 欧美精品在线一区 | 久久久久久国模大尺度人体 | 中文字幕av在线一二三区 | 求个av网址 | 成人免费视频观看视频 | 欧美综合久久 | 9999在线视频| 中文字幕成人av | 久久久久亚洲视频 | 国产精品福利视频 | 日本一区二区三区在线观看 | 一区二区三区精品 | 欧美日韩大陆 | 伦理午夜电影免费观看 | 日韩精品一区二区三区中文在线 | 国产精品99久久免费观看 | 亚洲综合在线一区 | 国产精品久久久久无码av | 国产成人99久久亚洲综合精品 | 粉嫩高清一区二区三区 | 国产在线视频一区 | 一级欧美一级日韩片 | 最新国产精品精品视频 | 亚洲国产一区二区在线 | 亚洲免费在线视频 | 激情小视频 | 中文字幕久久精品 | 日韩精品一区二区三区视频播放 | 亚州中文 | 午夜免费电影 | 欧美不卡 | 羞羞视频网页 |