2016-05-13 44 views
0

我建立一個HTTP服務器(link),我使用是否調用同一類的兩個併發的主幹影響它自己的靜態變量?

Executors.newCachedThreadPool() 

到awswer我的請求。解析此類請求的處理程序運行下面的代碼:

IntFactorization.main(input); 

其中IntFactorization是這種方式的儀表類,我必須強制使用的主要方法。 instrumentation類具有靜態的所有這些方法和屬性。它的方法也是同步的。

主要IntFactorization的是這樣的:

public static void main(String[] args) { 

IntFactorization obj = new IntFactorization(); 

int i = 0; 



System.out.println("Factoring " + args[0] + "..."); 

ArrayList<BigInteger> factors = 

    obj.calcPrimeFactors(new BigInteger(args[0])); 

System.out.println(""); 

System.out.print("The prime factors of " + args[0] + " are "); 



for (BigInteger bi: factors) { 

    i++; 

    System.out.print(bi.toString()); 

    if (i == factors.size()) { 

    System.out.println("."); 

    } else { 

    System.out.print(", "); 

    } 

} 





System.out.println(""); 

} 

我的服務器必須同時awswer多個請求,併爲我們設置服務器執行人

Executors.newCachedThreadPool(); 

然而,分析結果我注意到了,相同的數字,其因式分解的結果並不總是相同的。 我認爲這可能是(但我希望你確認一下)代碼被靜態變量處理的事實意味着如果一個服務器運行兩個執行程序,那麼這些線程就會相互影響?

+0

我看不到在此代碼中使用的靜態變量。 – RealSkeptic

+0

@RealSkeptic此代碼是原始的非儀器化代碼。靜態變量由instrumentation類添加,同時調用syncronized靜態方法。 – user2934164

+0

類中只有一個「static」變量實例。所以如果兩個不同的線程訪問一個靜態變量(拋開線程問題),它們會相互影響。這可能是也可能不是所期望的。如果有人想要例如計算創建的線程數,那麼靜態變量將會很有用。如果每個實例化對象都需要自己的測量變量,那麼靜態計數器可能不合適。 – KevinO

回答

0

我不明白關於「儀表班」的那一點,但問題的標題很有趣。

Does invoking two concurrent mains of the same class influence its own static variables?

沒有什麼特別之處在Java語言中的public static void main(String[] args)方法。

標準JVM將調用帶有該名稱和參數簽名的方法,如果您在JVM命令行上給出了它的類名稱,那就是JVM。這不是Java。

除了main(...)可用作應用程序的入口點外,其他方面與其他任何靜態方法一樣。它將影響其類(或任何其他類)的靜態變量,如果這是它被寫入的內容。如果兩個或多個線程同時對main()進行重疊調用,就像兩個或多個線程同時對任意方法重複調用一樣。

+0

即使我用於更改靜態變量的方法都是同步的嗎? instrumentation類是一個用來測試一段代碼的類([link](https://en.wikipedia.org/wiki/Instrumentation_%28computer_programming%29)) – user2934164

+0

@ user2934164,我不明白你在問什麼。你說有一些靜態變量(你的代碼片段沒有顯示)。你說兩個線程調用一個名爲'main()'的方法。你不要說main()(或者main()中可以調用的任何東西)如何使用這些變量。如果兩個線程使用相同的變量,那麼它們當然可以「互相影響」。添加'synchronized'可能不會改變這一點,但'synchronized'(如果你正確使用它)_might_可以防止交互線程將_intentionally_共享數據放入一些「損壞」或「無效」狀態。 –

+0

好的我想我得到了答案。我猜想我必須改變我的解決方案的架構 – user2934164

相關問題