内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Java自增操作的原子性是什么

這期內容當中小編將會給大家?guī)碛嘘PJava自增操作的原子性是什么,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯專業(yè)做網站、成都網站設計,集網站策劃、網站設計、網站制作于一體,網站seo、網站優(yōu)化、網站營銷、軟文營銷等專業(yè)人才根據搜索規(guī)律編程設計,讓網站在運行后,在搜索中有好的表現,專業(yè)設計制作為您帶來效益的網站!讓網站建設為您創(chuàng)造效益。

最近在工作中和一個同事因為自增是不是原子性操作爭論的面紅耳赤,那Java的自增操作到底是不是原子性操作呢,答案是否的,即Java的自增操作不是原子性操作。

1.首先我們先看看Bruce Eckel是怎么說的:

In the JVM an increment is not atomic and involves both a read and a write. (via the latest Java Performance Tuning Newsletter)

意思很簡單,就是說在jvm中自增不是原子性操作,它包含一個讀操作和一個寫操作。

2.以上可能還不能讓你信服,要想讓人心服口服,就必須用代碼說話。正如FaceBook的文化一樣:代碼贏得爭論。那我們就看一段代碼:

以下的代碼是用100個線程同時執(zhí)行自增操作,每個線程自增100次,如果自增操作是原子性操作的話,那么執(zhí)行完amount的值為10,000。運行代碼之后,你會發(fā)現amount的值小于10,000,這就說明自增操作不是原子性的

/**   *    * @author renrun.wu   */ public class MultiThread implements Runnable {      private int count;      private int amount = 1;            public MultiThread() {           count = 100;      }            public MultiThread(int count) {          this.count = count;      }            @Override     public void run() {          for (int i = 0; i < count; i++) {              amount++;          }      }            public static void main(String[] args) {          ExecutorService executorService = Executors.newCachedThreadPool();          MultiThread multiThread =new MultiThread();          for (int i = 0; i < 100; i++) {              executorService.execute(multiThread);          }          executorService.shutdown();                    try {              Thread.sleep(60000);          } catch (InterruptedException e) {              e.printStackTrace();          }          System.out.println(multiThread.amount);      }  }

3.如果以上還不能讓你信服的話,也沒關系。我們就把自增操作反編譯出來,看看java字節(jié)碼是怎么操作的

以下是一個簡單的自增操作代碼

public class Increment {      private int id = 0;       public void getNext(){          id++;      }  }

我們看看反編譯之后的Java字節(jié)碼,主要關注getNext()方法內部的Java字節(jié)碼。

public class Increment extends java.lang.Object{      public Increment();        Code:  :   aload_0  :   invokespecial   #1; //Method java/lang/Object."<init>":()V  :   aload_0  :   iconst_0  :   putfield        #2; //Field id:I  :   return      public void getNext();        Code:  :   aload_0   //加載局部變量表index為0的變量,在這里是this   :   dup                 //將當前棧頂的對象引用復制一份  :   getfield        #2; //Field id:I,獲取id的值,并將其值壓入棧頂  :   iconst_1            //將int型的值1壓入棧頂  :   iadd                //將棧頂兩個int類型的元素相加,并將其值壓入棧頂  :   putfield        #2; //Field id:I,將棧頂的值賦值給id  :  return      }

很明顯,我們能夠看到在getNext()方法內部,對于類變量id有一個先取值后加一再賦值的過程。因此,我們可以很肯定的說Java中的自增操作不是原子性的。

4.也許你會問,那局部變量的自增操作是否是原子性的。好,我們在看看一下代碼:

public class Increment {      public void getNext(){      int id = 0;          id++;      }  }

我們再看看反編譯之后的Java字節(jié)碼,主要還是關注getNext()方法內部的Java字節(jié)碼。

public class Increment extends java.lang.Object{  public Increment();    Code:  :   aload_0  :   invokespecial   #1; //Method java/lang/Object."<init>":()V  :   return  public void getNext();    Code:  :   iconst_0  :   istore_1  :   iinc    1, 1 :   return  }

與全局變量的自增操作相比,很明顯局部變量的自增操作少了getfield與putfield操作。而且對于局部變量來說,它無論如何都不會涉及到多線程的操作,因此局部變量的自增操作是否是原子操作也就顯得不那么重要了。

上述就是小編為大家分享的Java自增操作的原子性是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯行業(yè)資訊頻道。

新聞名稱:Java自增操作的原子性是什么
網站路徑:http://www.rwnh.cn/article36/gjhhpg.html

成都網站建設公司_創(chuàng)新互聯,為您提供手機網站建設、微信小程序、全網營銷推廣、服務器托管、品牌網站建設小程序開發(fā)

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都seo排名網站優(yōu)化
江都市| 定南县| 蒙阴县| 正镶白旗| 安宁市| 沭阳县| 油尖旺区| 香河县| 曲靖市| 海口市| 民和| 公主岭市| 石林| 石林| 张家界市| 大冶市| 河津市| 三原县| 治多县| 嘉祥县| 涿鹿县| 温宿县| 桂林市| 海城市| 凉城县| 贵港市| 岐山县| 砚山县| 乡宁县| 曲麻莱县| 安福县| 四平市| 潞西市| 东海县| 台南县| 托克托县| 汝阳县| 宝坻区| 龙州县| 新河县| 乌什县|