Java 同步可能是一个注释吗?

Java 同步可能是一个注释吗?,java,Java,如果我们使用@synchronized注释而不是synchronized关键字,这会不会很糟糕?在这种情况下,注释是否更自然(因为您可以用非同步方法覆盖同步的方法-因此同步的方法本身不涉及方法本身,而是指定方法之外的内容(该方法以某种方式受到保护),因此它不是真正的关键字?)已同步用于代码块,您不能向代码块添加注释 您可以在方法甚至类上使用@synchronized,但Java最初引入时不支持注释 我认为它足够重要,值得拥有自己的关键词 可能作为synchronized的方法版本,是的。但是sy

如果我们使用
@synchronized
注释而不是
synchronized
关键字,这会不会很糟糕?在这种情况下,注释是否更自然(因为您可以用非同步方法覆盖
同步的
方法-因此
同步的
方法本身不涉及方法本身,而是指定方法之外的内容(该方法以某种方式受到保护),因此它不是真正的关键字?)已同步用于代码块,您不能向代码块添加注释

您可以在方法甚至类上使用
@synchronized
,但Java最初引入时不支持注释


我认为它足够重要,值得拥有自己的关键词

可能作为synchronized的方法版本,是的。但是synchronized的另一个用法允许您指定正在同步的监视器

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

这会很酷,但是注释不能完全替代
synchronized
关键字:存在不能用注释标记的同步块


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

同步转换实际上直接在字节码级别转换为monitorenter/monitorexit。如果您指定了要同步的内容,则无法使用批注进行同步:

synchronized (myLock) {
}

因此,对我来说,它是一个关键字是非常合理的。

那么,使用关键字来完成函数的工作是一个奇怪的决定吗?我们可能会有类似Object.synchronize(对象锁)的东西吗?我的意思是,synchronized可能不是一个真正的关键字?你说的重要到值得一个关键字,但是,一个函数是否如此重要以至于可以转换成关键字,我们可能有Object.startSynchronize(lock)和endSynchronize(lock)?使用lock()和unlock()的问题是否增加了可能忘记解锁的风险,因此需要像使用锁一样添加try/finally块(但随着复杂性的增加,更容易出错)对于闭包,这个问题应该减少,但这是在Java 8中,它可能不会像将来的版本那样高效和干净。对于SO来说,似乎过于理论化,没有真正的答案。@Jeff一个实际的原因,我有一个带同步方法的超类,然后忘记在子类。这当然是我的一个非常糟糕的(像往常一样)设计,但后来我觉得很奇怪,如果我们重写方法,我们不能忽略任何其他关键字。那么synchronized不是一个关键字,而是一种指定函数参数(参数是一块代码)的有趣方式,否则在Java中是不可能的?+1用于字节码(这意味着它不等同于一个方法调用)。@Frank Pavageau你能,可能的话,详细说明一下吗?@Alex我不是字节码或JVM内部的专家,但我是这样看待它的:事实上,有一个特定的指令用于进入(或退出)监视器允许JVM生成/执行非常特定的代码,而不是对方法调用进行特殊的大小写方法调用会放大问题。无论如何,由于操作码的数量有限,我认为设计师在添加2条特定指令之前考虑了一下。:-@Alex如果有方法来完成synchronized的工作,那只会增加更多的麻烦。然后,还需要用try-finally子句将每个块括起来,以确保在代码突然中止时正确退出监视器。