我一直在研究Java中的并发性,我还没有看到关键字synchronized和同步概念之间的关系。
为了便于解释,请点击
public class MyClass {
int Counter = 0;
public synchronized void incrementation(Int newValue){
Counter += newValue;
}
}
如果我每次在方法增量中授予对一个线程的访问权限,那么同步是什么?
答案 0 :(得分:1)
函数签名中的synchronized
关键字一次只允许一个线程运行该函数。这会同步对Counter
变量的多线程访问。
在这种特殊情况下,Counter
的增量在机器代码中可能实现为从存储器到处理器寄存器的值的读取,处理器寄存器中数字的增量以及写入增加的值返回内存。如果没有同步,在不同处理器上运行的两个线程可以同时执行此操作,从内存中读取相同的值,每个值在各自的处理器中递增该值,并且将相同的递增值写回内存。这将导致内存中仅增加1,尽管事实上两个线程实际上增加了该值。使用synchronized
关键字可确保线程按顺序访问内存值;如果两个线程试图同时进行增量,它们轮流进行,并且内存中的最终值最终递增两次,以反映增加该值的线程数。