同步数据读/写主存储器

时间:2012-07-31 05:27:04

标签: java multithreading caching synchronization java-memory-model

当一个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的值?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

Memory effects of synchronization in Java

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

答案 2 :(得分:1)

方法或原子语句上的

1。 synchronized关键字会锁定对        通过只允许一个线程获得锁定,它可以修改的资源。

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

3。此外,在上面的示例中,如果threadA执行compute(),则threadB 无法访问{{ 1}}方法同时,因为它们都是同步方法,并且只有一个线程可以访问对象的所有同步方法,导致getResult() its not the method that is locked but the Object. Its

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