繁体   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