日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁編程開發(fā)java → Java多線程變量共享分析(Thread)

      Java多線程變量共享分析(Thread)

      前往專題相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2013/5/22 21:24:05字體大。A-A+

      作者:西西點(diǎn)擊:145次評(píng)論:0次標(biāo)簽: 多線程

      • 類型:服務(wù)器區(qū)大小:21KB語言:中文 評(píng)分:6.6
      • 標(biāo)簽:
      立即下載

      多線程對(duì)共享變量的訪問,通過瑣保證互斥訪問。本章主要討論如何在多線程間共享對(duì)象,保證其被安全訪問。在編寫多線程程序時(shí),最重要的就是搞清楚哪些變量是共享的,哪些變量是不共享的。也就是要分析清楚其中的原理呀。

      實(shí)現(xiàn)線程安全的方法之一是不在線程間共享變量,將變量的使用范圍限制在單個(gè)線程之內(nèi),即實(shí)現(xiàn)Thread Confinement。

      因?yàn)樽罱褂枚嗑程就看了一些,對(duì)使用Thread類的子類創(chuàng)建線程的情況,總結(jié)如下:

      1.方法體內(nèi)部定義的局部變量不共享

      這是因?yàn)榉椒▋?nèi)部定義的變量是在運(yùn)行時(shí)動(dòng)態(tài)生成的。每個(gè)線程都有一個(gè)自己的堆棧,用于保存運(yùn)行時(shí)的數(shù)據(jù)。

      最容易理解的就是遞歸調(diào)用時(shí)候,每次的入棧出棧操作。如下,每次調(diào)用時(shí),變量aa都是在運(yùn)行時(shí)堆棧上保存的,方法結(jié)束變量也就釋放了。

      public int fib(int n)
      {
          int aa;
          if(n==1 || n==0)
              return 1;
          else
              return fib(n-1)*n;
      }

      2.成員變量

      2.1 代碼示例

      成員變量需要看變量指向的是否為同一個(gè)對(duì)象。看下面的代碼示例:

      package file2;
      public class Analy {
          public static void main(String[] args) {
              Num i=new Num(0);    //新建對(duì)象,準(zhǔn)備傳遞給線程
              new OwnThread(i).start();    //新建線程,并啟動(dòng)
              new OwnThread(i).start();    //新建線程,并啟動(dòng)
              System.out.println("主線程中i的值變?yōu)榱耍?quot;+i.i);    //獲取目前對(duì)象i的數(shù)值
          }
      }
      
      class OwnThread extends Thread
      {
          Num id;    //申明對(duì)象,默認(rèn)null,就是沒有指向任何實(shí)體
          int sno;    //申明int變量。因?yàn)橄到y(tǒng)默認(rèn)初始化為0,所以應(yīng)該是定義一個(gè)int變量
          OwnThread(Num id)
          {
              this.id=id;
          }
          
          public void run()
          { 
              for(int i=0;i<5;i++)
              {
                  synchronized(this)
                  {
                      sno=id.i;    //保存id.i的數(shù)值,到線程私有變量sno
                      id.i++;
                      try {
                          Thread.sleep(1);
                      } 
                      catch (InterruptedException e) {}
                  }
                  System.out.println(this.getName()+","+sno);
              }
          }
      }
      
      class Num    //定義一個(gè)類
      {
          int i;
          Num(int i)
          {
              this.i=i;
          }
      }

      共享同一個(gè)對(duì)象,線程可以交互,執(zhí)行結(jié)果:

       

      2.2分析

      程序中主函數(shù)定義了Num對(duì)象的實(shí)例i,定義線程是傳遞到了Thread0和Thread1這樣三個(gè)變量就共享了一個(gè)Num對(duì)象的實(shí)例。而線程Thread0和線程Thread1又有自己的私有變量sno,可以用來保存某一時(shí)刻的共享變量的數(shù)值。

      注意:
      (1)Java中判斷對(duì)象是否為同一個(gè)對(duì)象使用地址判斷的。地址相同就是同一個(gè)對(duì)象,上面的三個(gè)就是同一個(gè)對(duì)象。

       (2)如果把上面的例子中共享的對(duì)象實(shí)例用基本數(shù)據(jù)類型替換是不行的。因?yàn)榛緮?shù)據(jù)類型程序會(huì)自動(dòng)的用默認(rèn)值初始化,也就是申明和定義時(shí)一起的。此時(shí)在mian函數(shù)中定義線程,傳遞的基本數(shù)據(jù)類型參數(shù),只能是初始化線程中的另一個(gè)對(duì)象,而不是同一個(gè)對(duì)象。

      3.總結(jié)

      總之,在多線程編程中,知道各個(gè)線程如何、怎么樣共享數(shù)據(jù)是很重要的。如上面的程序,可以在主線程和其他兩個(gè)子線程之間共享一個(gè)對(duì)象,來實(shí)現(xiàn)他們之間的交互處理。

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)