Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关键词同步与同步概念_Java_Multithreading_Concurrency - Fatal编程技术网

Java 关键词同步与同步概念

Java 关键词同步与同步概念,java,multithreading,concurrency,Java,Multithreading,Concurrency,我一直在研究Java中的并发性,我没有看到关键字synchronized和同步概念之间的关系 为了便于解释,请接受它 public class MyClass { int Counter = 0; public synchronized void incrementation(Int newValue){ Counter += newValue; } } 如果我在方法增量中每次授予一个线程访问权限,那么同步在哪里?函数签名中的synchronized关键字一次只允许

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

为了便于解释,请接受它

public class MyClass {

  int Counter = 0;

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

}

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

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


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

如果由JVM或JVM生成的代码执行同步,则同步。你能澄清你的疑问是什么吗?请注意,当你使用
synchronized
关键字时,同步只发生在同一个实例中。不清楚为什么人们会对此投反对票。对于试图理解Java并发性的人来说,这是一个完全合理的问题。感谢您的考虑。我的困惑不是关于这个资源的建议。我一直在寻找一个名为“synchronized”的逻辑,只要每次线程进入这个方法,它就会锁定它,直到“完成作业”。如果每次只有一个线程使用它,我认为没有理由将此块称为“已同步”。考虑到这个问题,我意识到,如果一个或多个线程可以使用此代码块,我们有理由将其称为“已同步”。如果我错了,请纠正我。