簡體   English   中英

是否可以將非同步方法稱為已同步?

[英]Is it possible to call a non-synchronized method as synchronized?

我有一個ClassA類,該類具有public void doSomething()方法。 ClassA廣泛用於不同的應用程序中。 有些要求synchronized而另一些則不需要。 同樣,在不需要時,我不希望與調用synchronized方法相關的(微小但非零)性能下降。

假設ClassB將調用doSomething()並要求此方法是synchronized ,而ClassC則不需要此方法。 在程序設計中我可以通過哪些方式實現這一目標?

ClassB擁有該方法是否足夠:

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

從而避免了需要將ClassCdoSomething()指定為已synchronized

當需要在同步和不同步的情況下使用相同的類時,一種常見的方法是創建一個接口,並提供兩種實現-帶有實際實現的非同步類,以及添加同步的瘦包裝器。

這是一個簡單的示例:假設您正在構建一個具有兩個操作的類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();
    }
}

請記住,這純粹是一項學術活動。 我看不出任何資源為什么需要選擇性同步訪問的實際原因。 您是否需要它,或者您不需要。 如果必須執行此操作,則需要花費數月的時間進行長時間的故障排除。 如果可以的話,我會重新考慮設計。

因此,您說-“有些要求同步,而另一些則不需要”

我認為這意味着您完全知道需要同步訪問的代碼的每個部分,並且可以將其與需要節省此開銷的代碼區分開。 如果是這樣:您有兩種選擇:

  1. 一起擺脫方法的synced修飾符,並在調用之前獲取所有需要同步的調用方才能進行同步。 從而:

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

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

  1. 進行兩種方法,一種是同步的,另一種是不同步的。 根據您希望控制訪問的方式將呼叫者更改為呼叫者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM