是否可以将非同步方法称为同步?

时间:2014-03-26 02:37:28

标签: java multithreading runnable synchronized

我的课程ClassApublic void doSomething()方法。 ClassA广泛用于不同的应用程序;有些需要synchronized,有些则不需要。还有一种情况是,当我不需要时,我不希望与调用synchronized方法相关联(微小但非零)性能损失。

假设ClassB将调用doSomething()并要求此synchronized,但ClassC不需要此ClassB。在我的程序设计中,我可以通过哪些方式实现这一目标?

将方法放在private synchronized void doSomething() { this.classAInstance.doSomething(); }

中是否足够
ClassC

因此无需将doSomething() synchronized指定为{{1}}?

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:2)

请记住,这纯粹是一项学术活动。我没有看到为什么资源需要选择性同步访问的任何实际原因。要么你需要它,要么你不需要它。如果你必须这样做,那么你需要在几个月后进行长时间的故障排除。如果可以,我会重新考虑设计。

所以, 你说 - '有些需要同步,有些则不需要'

我认为这意味着您确切地知道代码中需要同步访问的每个部分,并且可以将其与需要节省此开销的代码区分开来。如果是这样的话:您有两种选择:

  1. 一起摆脱方法的synchronized修饰符,并在调用之前让所有需要同步的调用者进行同步。因此:

    synchronized (classAInstance){
        classAInstance.doSomething();  // the doSomething() is non-synchronised
    }
    
  2. 调用此方法且不需要同步访问的代码中的那些部分可以直接调用该方法。

    1. 制作两个方法,一个是同步的,另一个是未同步的。根据您希望控制访问权限的方式更改要呼叫的呼叫者。