<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【Kevin原創】關于Java自增操作的原子性

      最近在工作中和一個同事因為自增是不是原子性操作爭論的面紅耳赤,那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個線程同時執行自增操作,每個線程自增100次,如果自增操作是原子性操作的話,那么執行完amount的值為10,000。運行代碼之后,你會發現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字節碼是怎么操作的

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

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

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

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

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

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

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

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

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

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

        參考資料:《深入java虛擬機》

        參考鏈接:http://madbean.com/2003/mb2003-44/

      posted @ 2012-05-02 22:01  wurr707  閱讀(5281)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 成人免费av色资源日日| 元码人妻精品一区二区三区9| 色综合网天天综合色中文| 色窝窝免费一区二区三区| 欧美videosdesexo吹潮| 国产在线乱子伦一区二区| 在线日韩日本国产亚洲| 亚洲成人精品综合在线| 国产精品天干天干综合网| 国产伦码精品一区二区| 沁水县| 国产一区二区三区不卡观| 欧美亚洲国产日韩电影在线| 日本中文字幕有码在线视频| 精品无码国产一区二区三区av| 草草线在成年免费视频2| 国产精品99中文字幕| 国产色婷婷亚洲99精品小说| 亚洲色最新高清AV网站| 尤物tv国产精品看片在线| 国产午精品午夜福利757视频播放| 逊克县| 国产综合久久久久久鬼色| 国产成人亚洲综合| 虎白女粉嫩尤物福利视频| 国内精品无码一区二区三区| 欧美色欧美亚洲高清在线观看| 国产精品中文第一字幕| 亚洲乱码一区二区三区视色| 国产95在线 | 亚洲| 国产精品国产三级国av| 日本少妇自慰免费完整版| 亚洲av男人电影天堂热app| 国产成人无码区免费内射一片色欲| 做暖暖视频在线看片免费| 在线天堂中文新版www| 黑人好猛厉害爽受不了好大撑| 免费人成在线观看网站| 黄色A级国产免费大片视频| 欧美日韩精品一区二区视频| 亚洲av综合色区在线观看|