【问题标题】:Are instance methods capable of being concurrently executed by default in java?实例方法是否能够在 java 中默认并发执行?
【发布时间】:2013-01-26 07:03:39
【问题描述】:

我知道 synchronized 关键字,但我想确保我有一个清晰的了解。

所以,如果我不使用 synchronized 关键字,一个实例变量可能会被两个线程覆盖,但如果我使用 synchronized 关键字,一次只能有 1 个线程进入该方法。对吧?

【问题讨论】:

  • @VictorSorokin 我认为标题中的问题实际上是:实例方法可以在java中默认并发执行吗? - 在这种情况下答案是肯定的。
  • 有人应该编辑问题
  • 新标题更好吗?

标签: java concurrency synchronized


【解决方案1】:

如果两个线程进入一个非同步的方法并更新一些共享状态,那么可能会导致不一致。

public synchronized void method(){ 
      //only one thread will be able to enter (IF SAME INSTANCE)
}

但它也建立了 happens-before 关系。这是多线程的可见性部分。

两个动作可以通过happens-before关系排序。如果一个 动作发生在另一个之前,然后第一个对和可见 在第二个之前订购。

Happens-beforeJLS.

【讨论】:

    【解决方案2】:

    如果我不使用同步关键字,一个实例变量可能会被两个线程覆盖

    它不会被“覆盖”,但它可以由两个线程同时执行,如果它不是为处理这种情况而设计的,可能会导致不一致。

    如果我使用 synchronized 关键字,一次只能有 1 个线程进入该方法。

    如果您使用synchronized 方法是正确的:该关键字提供了一定数量的保证,包括互斥。

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2014-02-19
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      相关资源
      最近更新 更多