2014-03-26 102 views
0

我有一個類ClassA,它有一個public void doSomething()方法。這ClassA廣泛應用於不同的應用;有些需要​​,其他則不需要。當我不需要這種方法時,我不希望調用​​方法時性能下降(很小但非零)。是否可以將非同步方法調用爲synchronized?

假設ClassB將調用doSomething()和要求,這是​​,但ClassC不需要這個。在我的程序設計中,我可以實現這些目標的方式是什麼?

是否足以在ClassB方法:

private synchronized void doSomething() { 
    this.classAInstance.doSomething(); 
} 

從而避免了需要指定ClassCdoSomething()爲​​?

+4

存在的缺乏理解什麼'synchronized'做在問題的根本顯示。你要麼需要貨幣安全,要麼你沒有,有時候沒有...... –

+0

@JarrodRoberson爲什麼我總是需要它? – user2763361

+2

因爲你需要它一些時間。 –

回答

4

當你需要使用同一個類並且沒有同步時,一種常見的方法是創建一個接口,並提供兩個實現 - 一個實際實現的非同步類和一個添加同步的薄包裝器。

下面是一個簡單的例子:假設您正在構建一個包含兩個操作的類 - getSomethingsetSomething。該接口可以是這樣的:

interface Demo { 
    void setSomething(Something value); 
    Something getSomething(); 
} 

現在不同步的實現可能是這樣的:

class DemoImpl implements Demo { 
    private Something theSomething; 
    public void setSomething(Something value) { 
     theSomething = value; 
    } 
    public Something getSomething() { 
     return theSomething; 
    } 
} 

最後,同步實施:

class SyncDemoImpl implements Demo { 
    private DemoImpl impl = new DemoImpl(); 
    public synchronized void setSomething(Something value) { 
     impl.setSomething(value); 
    } 
    public synchronized Something getSomething() { 
     return impl.getSomething(); 
    } 
} 
+0

或者更一般地說,一個線程安全的實現和一個非線程安全的實現,根據所使用的模式可能會有很大的不同。 – djechlin

2

記住,這純粹是一項學術活動。我沒有看到資源應該需要選擇性同步訪問的任何實際原因。要麼你需要它,要麼你不需要。如果你必須這樣做,你就可以在線上幾個月後進行長時間的故障排除。如果可以的話,我會重新考慮設計。

所以, 你說 - 「一些需要同步和別人不一樣」

我拿這意味着你知道你的代碼需要同步訪問的正是每個部分,並且可以從那些需要區別開來以節省此開銷。如果是這樣的:你有兩個選擇:

  1. 擺脫法的同步調節劑一起,得到需要同步調用之前同步的所有調用。因此:

    synchronized (classAInstance){ 
        classAInstance.doSomething(); // the doSomething() is non-synchronised 
    } 
    

代碼的那些部分是調用此方法並不需要同步訪問,可以直接調用該方法。

  1. 做兩個方法,一個是同步的,另一個是不同步的。根據您想要控制訪問的方式將呼叫者更改爲呼叫。
相關問題