2014-03-26 58 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. 做两个方法,一个是同步的,另一个是不同步的。根据您想要控制访问的方式将呼叫者更改为呼叫。
相关问题