同步数据读/写主存储器

当一个synchronized方法完成时,它是否只将它修改的数据推送到主存储器或所有成员变量,类似于同步方法执行时,它是否只读取主内存所需的数据,还是清除所有缓存中的成员变量并从主内存中读取它们的值? 例如

public class SharedData { int a; int b; int c; int d; public SharedData() { a = b = c = d = 10; } public synchronized void compute() { a = b * 20; b = a + 10; } public synchronized int getResult() { return b*c; } } 

在上面的代码中,假设compute由threadA执行,getResult由threadB执行。 执行compute之后,threadA会用a和b更新主内存,还是会更新a,b,c和d。 在执行getResult之前,threadB只从主内存中获取b和c的值,还是清除缓存并获取所有成员变量a,b,c和d的值?

synchronized确保您拥有一致的数据视图。 这意味着您将读取最新值,其他缓存将获得最新值。 缓存非常智能,可以通过特殊总线相互通信(不是JLS要求的,但允许的话)。这种总线意味着它不需要触摸主存储器来获得一致的视图。

我认为以下主题应该回答你的问题。

Java中同步的记忆效应

实际上,整个缓存不会被刷新。

1. 在方法或primefaces语句上使用 synchronized关键字,通过只允许一个线程获得锁定,将锁定对它可以修改的资源的访问。

2.现在阻止将值缓存到变量中是由 volatile关键字完成的 。 使用volatile关键字将要求JVM创建访问实例变量的线程,以将其实例变量的副本与保存在内存中的变量进行协调。

3.此外,在上面的示例中,如果threadA执行compute() ,则threadB 无法 同时访问getResult()方法,因为它们都是同步方法,并且只有一个线程可以访问对象的所有同步方法 ,导致its not the method that is locked but the Object. Its its not the method that is locked but the Object. Its like this... Every object has one lock, and the thread which wants to access its synchronized block must get that lock

4.甚至每个类都有一个锁 ,用于保护类中静态变量关键状态。