2011-06-21 65 views
1

下面是示例代碼函數變量值在多線程中共享?

Class Abc { 

    void method1(){ 
     ExecutorService threadPool = Executors.newFixedThreadPool(10); 
     for(int i=0;i<100;i++){ 
     threadPool.execute(new Runnable() { 
      doSomeThing(Param); 
     }); 
     } 
     threadPool.shutdown(); 
    } 

    void doSomeThing(Param param){ 
     Object ref1,ref2,ref3,ref4; 
    } 
} 

在這裏,我們在多線程執行所述方法的DoSomething()。 doSomeThing()方法有許多對象引用。

我的問題是,如果有任何線程更改對象引用的狀態,這種更改是否對其他線程可見?

如果是這樣,我需要做的,使線程有它自己的狀態。我知道我們可以通過在execute()中傳遞它來創建一個新的類實例來解決這個問題。我試圖用這種方式解決問題

+0

嘗試使用克隆。 ** ref1.Type ref = ref1.clone(); ** –

+0

做ref1,ref2等從參數中獲取它們的值嗎? – Marcelo

+0

是的,它是從參數 – Madhu

回答

0

每次調用doSomeThing都會得到自己的一組變量,無論它們是否在同一個線程中。

變量將等於您在每次調用中設置的值。

+0

獲取值你是否指的是函數變量ref1,ref2 ..即使doSomeThing()方法在具有相同Abc實例的多線程中運行,狀態也不會改變? – Madhu

+0

@Madhu:這取決於變量中的內容。 – SLaks

0

我的問題是,如果任何線程改變對象引用的國家將這種變化對其它線程可見?

而簡單的答案是肯定的。但是,這太簡單了,沒有幫助。

你在問什麼是多線程概念的基礎。實質上,如果你同時傳遞同一個對象到多個線程,那麼每個線程對對象所做的更改都必須仔細編排,否則你必須忍受不可預知的結果。