【问题标题】:Keyword synchronized and synchronization conception关键字同步和同步概念
【发布时间】:2014-03-30 15:49:39
【问题描述】:

我一直在研究Java中的并发,我还没有看到关键字synchronized和同步概念之间的关系。

为了方便解释

public class MyClass {

  int Counter = 0;

  public synchronized void incrementation(Int newValue){
     Counter += newValue;
  }

}

如果我每次都在方法增量中授予对一个线程的访问权限,那么同步在哪里?

【问题讨论】:

  • 由 JVM 或 JVM 生成的代码执行的同步。你能澄清你的疑问吗?
  • 请注意,当您使用synchronized 关键字时,同步只会发生在同一个实例中。
  • 不清楚为什么人们不赞成这一点。对于试图理解 Java 并发的人来说,这是一个完全合理的问题。

标签: java multithreading concurrency


【解决方案1】:

函数签名中的synchronized 关键字一次只允许一个线程运行该函数。这会同步对Counter 变量的多线程访问。

在这种特殊情况下,Counter 的增量在机器代码中很可能实现为将值从内存读取到处理器寄存器、处理器寄存器中的数字增量以及写入增量值回到内存。如果没有同步,在不同处理器上运行的两个线程可以同时执行此操作,从内存中读取相同的值,每个线程在各自的处理器中递增该值,并将相同的递增值写回内存。这将导致内存中仅增加 1,尽管事实上两个线程实际上已经增加了该值。使用synchronized关键字确保线程顺序访问内存值;如果两个线程同时尝试递增,它们会轮流进行,最终内存中的值会递增两次,以反映递增该值的线程数。

【讨论】:

  • 感谢您的考虑。
  • 我的困惑不在于该资源的提议。我一直在寻找名称“同步”的逻辑,只要每次线程进入此方法时,它都会锁定该方法,直到“完成工作”。我认为没有充分的理由将此块称为“同步”,前提是每次只有一个线程使用它。
  • 考虑到这个问题,我意识到,只要一个或多个线程可以使用这段代码,我们就有充分的理由将其称为“同步”。如果我错了,请纠正我。
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多