2012-09-19 16 views
4

如果不是​​关键字我们有@Synchronized注释它会不好吗?在这种情况下注释是否更自然(因为您可以用非同步方法覆盖​​方法 - 因此​​对该方法本身没有提到任何内容,而是指定除了该方法之外的某些内容(该方法在某个特定所以它不是一个真正的关键字?)可能同步已注释?

+0

似乎对SO非常理论化,没有真正的答案。 – asteri

+0

@Jeff一个实际的原因,我有一个超类的同步方法,然后忘了让同一个方法在子类中同步。这当然是一个非常糟糕的(一如既往)我的设计,但后来我觉得有多奇怪,我认为我们不能忽略任何其他关键字,如果我们覆盖方法 –

回答

2

同步转换实际上直接转换为字节代码级的monitorenter/monitorexit。你指定什么同步,你不能做到这一点与注释:

synchronized (myLock) { 
} 

所以它非常有意义,我认为这是一个关键字。

+0

因此,然后同步不是一个关键字,而是一个有趣的方式来指定函数参数(参数是一个代码块),否则在Java中是不可能的? –

+0

提供字节码+1(这意味着它不等于方法调用)。 –

+0

@Frank Pavageau您可能会详细阐述一下吗? –

4

同步用于代码块,并且不能将注释添加到代码块。

您可能在方法或类上有@synchronized,但是Java在首次引入Java时不支持注释。

我认为它足够重要,值得拥有自己的关键字。 ;)

+0

你说的足够重要,值得一个关键字,但是,一个函数可以转换为关键字非常重要,我们可能会有Object.startSynchronize(lock)和endSynchronize(lock)? –

+2

使用lock()和unlock()的问题是您增加了可能忘记解锁的风险,因此您需要添加try/finally块,就像使用Lock一样(但增加了复杂性,使其更容易出错)关闭这个问题应该减少,但这是在Java 8中,它可能不会像版本来的那样高效和干净。 –

1

可能作为同步的方法版本,是的。但另一种使用synchronized可以让你指定你正在同步的显示器。

public void someMethod() 
{ 
    synchronized(this) 
    { 
    //sync code 
    } 
    //unsynced code. 
} 
2

这将是很酷,但注释不能完全替代​​关键字:有是同步的,不能标有注释块。

此外synchronized块接受用于同步的监视器。它可以动态提供,给我们一定的灵活性。注释不允许这样做,因为必须在编译时提供所有参数。

+0

那么让一个关键字来完成一个函数的工作是一个奇怪的决定?我们可能会有像Object.synchronize(对象锁)的东西会一样吗?我的意思是,同步可能不是一个真正的关键字? –