【问题标题】:Why is the synchronized keyword in Java called 'synchronized' instead of the more precise 'mutexed'?为什么 Java 中的同步关键字称为“同步”而不是更精确的“互斥”?
【发布时间】:2010-04-27 03:41:53
【问题描述】:

我听说在 Java 中选择使用“同步”这个词来描述互斥语句只是一个错误(编辑:“错误”在这里是一个错误的选择。请参阅编辑),但我想知道如果选择背后确实有原因。

[编辑]

在 Safyan 的 cmets 的推动下,我想补充一点,同步是建立线程之间时序关系的通用术语。它可以包括互斥和速率控制之类的东西(例如,两个线程以相同的速率做某事)。使用“同步”来表示互斥而不是更具体的关键字(如“互斥”)似乎不必要地模棱两可。

【问题讨论】:

标签: java synchronized


【解决方案1】:

这不是一个错误。它意味着它所说的;代码必须与其他线程同步以提供互斥。而且,事实上,术语 synchronized 可能比“mutex”更有意义,因为“mutex”意味着一种非常特殊类型的同步原语,并且 synchronized 关键字可以使用任意数量的线程同步原语来实现(带有主动轮询的测试和设置,信号量等)。

【讨论】:

  • 对我来说,“互斥”是“互斥”的常用缩写,而不是特定的原语,尽管它可能是特定语言中原语的名称。
  • @Edward,在 UNIX 和 Windows 中,互斥锁是一种特殊的原语,它支持锁定、解锁和 trylock。而 Java 监视器还支持等待和通知,它们是条件变量的各个方面。
  • @Safyan,很公平,但“同步”不是指在任务之间建立时序关系吗?互斥可能是一个重载的术语,但它似乎比“同步”更清楚。
  • @Edward,是的,那是真的......同步是沟通/协调事件的顺序/时间。但是,我认为这是完全有道理的;当你同步线程时,你对它们强加了一个顺序,以便它们一个接一个地执行一个动作,而不是执行交错的动作。
  • 嗯。同步的意思是“同时运行”。根据定义,同步代码是不同时运行的代码。所以不,这并不意味着它所说的。
【解决方案2】:

使用 synchronized 关键字代替 mutex 实际上是表达该术语的好方法。通过 mutex,我们不是很清楚,但是 synchronized 关键字本身就说明了它自己。 Synchronized 放置在实际上需要在所有想要访问该代码的线程之间同步的代码处。这就是为什么它被称为同步。

【讨论】:

    【解决方案3】:

    synchronized 关键字用于获取和释放 Monitor 上的锁。与 Mutex 一样,Monitor 用于并发控制,但它们并不相同。

    使用 synchronized 本身并没有错,但它可能是与多线程一起使用的低级构造,使用不当会很快导致多线程错误。

    【讨论】:

    • 我想你的意思是说,“使用同步本身。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多