2012-11-22 170 views
5

您可以在下面看到Java類中的靜態變量counterJava靜態變量更新

問題是這個變量何時會重置?例如,當我重新啓動程序時,電腦。它可以重置的其他可能場景是什麼?

另一個問題是:這個變量增加的次數少於執行函數do()的次數的原因是什麼?例如,是否可以啓動類java Whatever的多個進程?或者它可能是多線程/服務器等的東西?

class Whatever { 

    static int counter = 0; 

    function do() { 
     counter++; 
     //... 
    } 

} 

其他問題:如果多個線程執行功能做的(),如何將計數器變量的行爲?它會少於執行函數do()的次數?

+0

在程序執行開始時,'static'變量只被初始化一次。 – Maroun

+0

你的'counter'是封裝私有的,所以同一個包中的任何類都可以給它賦一個任意值。 – jlordo

+0

順便說一下,'do'是一個保留關鍵字,*不能*用作方法名稱。 – jlordo

回答

2

當您重新啓動應用程序時,靜態變量將被重新初始化。

2

按照JLS

如果字段聲明爲靜態,存在的領域只有一個化身,無論有多少類的實例(可能是零)最終可能會被創建。當類初始化時,靜態字段有時稱爲類變量

因此,這會回答你的第一個問題。即正是當這個類被加載:)

根據第二個問題,不。如果該變量被聲明爲私有。然後唯一的訪問是通過封裝的方法。

靜態變量持續到JVM關閉。

0

1)加載類時,變量被設置(復位)。除了關閉JVM之外,一些服務器在不同的應用程序中加載類(例如,Tomcat webapps),其中一些允許重新啓動它們。

2)通過線程進行併發修改。但它應該很少,除非你使用它很多。使用​​作爲函數/塊。

+0

如果有多個線程訪問它,那麼計數器變量會如何呢?它會少於執行函數do()的次數? – jQguru

+0

是的。想'counter'是2; 'thread1'執行操作,計算++檢索2並加3,但在用3'thread2'替換2之前開始操作,檢索'counter'仍然是2,並計算結果爲3。最終兩個線程都將'counter'的值設置爲3,而其中一個應該將它設置爲4.它被稱爲併發或運行條件。 – SJuan76

1

counter不是私有變量。所以這個值可能會被其他類改變。

只要您的程序(或特別是容器/ jvm)重新被重置,該變量就會被重置。

0

問題是這個變量何時會重置?

靜態變量可以使用自定義reset()方法重置。如果您說重新啓動程序,理論上該變量將被初始化爲未重新初始化的值,因爲它不相同(重新啓動程序)。

0
class Foo { // in same package 
public static void main(String[] args) { 
    Whatever w = new Whatever(); 
    for (int i = 0; i < 1000; i++) { 
     w.do(); 
    } 
    Whatever.counter = -1; 
} 

這裏do()被調用1000次,但counter將在年底值。

我在你的榜樣使用do()喜歡你,但是請注意,是不是一個有效的方法的名稱,因爲它是while循環做關鍵字。

0

靜態變量意味着在程序執行過程中只有一個該字段的化身。它在類被初始化時加載。

對於第二個問題,您的變量不是線程安全的,因爲多個線程可以同時訪問它。 即使您的計數器不穩定,您仍然會面臨併發問題。 根據您的示例和要求,您有三個選項:

如果您唯一的要求是操縱變量,而其餘代碼不取決於您可以使用同步(用大炮殺死蒼蠅)或AtomicInteger(性能更好的選擇):

static synchronize int counter = 0; 
// or 
static AtomicInteger counter = new AtomicInteger(); 

如果你的代碼的其餘部分取決於你的櫃檯,你必須使用的鎖定對象或同步方法:

class Whatever { 

    static int counter = 0; 

    synchronize function do() { 
     counter++; 
     if(counter < 10){ 
      // do something 
     } 
    } 
} 

// or 

class Whatever { 

    static int counter = 0; 
    static final Object _lock = new Object(); 

    function do() { 
     synchronized (_lock) { 
      counter++; 
      if(counter < 10){ 
       // do something 
      } 
     } 
    } 
} 

這是運現在在我腦海中的tions,但可能還有更多。