2010-08-30 88 views
2

我有一個靜態的方法如下:靜態方法導致的問題

public static void writeArticle(TypeA typeA, TypeB typeB) { 
    AWriter writer = AFactory.getWriter("aWriter"); 
    Article article = writer.newArticle(); 

    /* PARAMETER WRITE START */ 

    article.set("title", typeA.getTitle()); 
    article.set("author", typeB.getName()); 
    article.set("age", typeB.getAge()); 
    // … 
    /* more set statments here */ 
    writer.write(article); 
} 

可以將這個方法會導致作家會寫值混合文章有問題?也就是說,當2個類(Class A和ClassB)調用這個方法的時候,Article會從ClassA中獲得一些typeA值,而從ClassB中獲得一些typeA值?

+0

你有問題還是理論上的問題?如果你有問題,請描述它,而不是檢查你的AWriter類... – pgras 2010-08-30 09:48:07

+0

嘿pgras,放鬆。是的,我確實有一個問題。就像你'打字'一樣。只是開玩笑的人。是的,我在那裏問的問題確實發生在我的公司,而我試圖瞭解它是否可能。我確實需要在標題上添加一個問號。 – sarahTheButterFly 2010-08-30 11:36:21

回答

5

不是。你爲什麼認爲來自兩個不同電話的爭論會混淆?沒有理由認爲他們會這樣做。

如果這是一個多線程程序,您應該小心在線程之間共享對象;如果這些對象具有可變狀態(可以更改的成員變量),則應該注意兩個線程不會同時修改狀態。

+0

實際上涉及多線程。我提到的ClassB實際上是訪問實用程序靜態方法的應用程序,ClassB使用多線程邏輯,它也調用該方法。 ClassA是運行在同一平臺上的另一個應用程序,它沒有多線程邏輯。我只有線程的基本知識,所以我在這裏提出問題並尋求一些指導。 – sarahTheButterFly 2010-08-30 11:42:46

+0

你應該在適當的地方同步。這不是一個小問題,可以用兩句話來解釋......一個很好的教程可以在這裏找到:http://download.oracle.com/javase/tutorial/essential/concurrency/ – Jesper 2010-08-30 13:33:14

4

無論何時你說static,你都不會談論實例方法調用。應始終使用類名稱調用靜態方法。

靜態方法在實例級完全隔離。儘管它可能會寫一個混合值,但它是你想要它寫的不是它?

0

不會的。否則它會是地獄。

+0

你認爲這是一個有用的回答? – 2010-08-30 07:39:52

+0

@seanizer:對我來說似乎是一個好的答案。答案總是不必精心製作。事實上,他表達了要傳達的東西。 – bragboy 2010-08-30 07:41:06

+0

@Bragboy:那麼爲什麼你寫了一個更有幫助,更詳細的答案呢? – 2010-08-30 08:05:49

0

只有當這兩個呼叫都被訪問並改變了公共狀態時(例如,假定定義該方法的類別被稱爲ArticleWriter,則它們都將讀取並更改ArticleWriter的靜態字段。

0

這對你的代碼來說是不可能的。 typeA有方法getTitletypeB有方法getName。哪些領域混淆了?

0

這是從這段代碼中不可知的。要解決的第一個問題是該方法是否可能同時從兩個不同的線程中調用。如果是這樣,問題很可能是兩個線程同時修改同一個對象(文章或作者)。解決這個問題的最簡單方法是同步writeArticle()。

+1

是的,我有點知道解決方案。我只是想了解整個畫面。所以兩個線程正在修改哪個對象。他們只是傳遞參數,他們沒有分享任何東西。我懷疑的唯一地方就是寫作。或者你認爲這篇文章會有混合價值嗎? – sarahTheButterFly 2010-08-30 11:52:03

+0

就像我說過的,它從這段代碼片段中是不可知的。我的猜測,基於語義,問題在於: AFactory.getWriter(「aWriter」); 返回對同一個AWriter實例的引用,這意味着多個線程將共享該實例。如果你要讓多個線程同時運行相同的代碼,最安全的事情是讓它們使用它們需要的所有對象的單獨實例。如果他們*必須*有權訪問同一個對象,那麼您需要確保對該對象的訪問已正確同步。 – user434722 2010-09-03 08:41:21

3

不,方法參數和局部變量是線程安全的只要它們不引用共享對象