5

当一个同步方法完成后,是只把它修改过的数据推送到主存,还是把所有的成员变量都推送到主存,同理,同步方法执行时,是只从主存中读取它需要的数据还是清空所有的数据?缓存中的成员变量并从主存中读取它们的值?例如

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;
    }

}

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

4

3 回答 3

3

synchronized确保您拥有一致的数据视图。这意味着您将读取最新值,而其他缓存将获得最新值。缓存足够智能,可以通过特殊的总线相互通信(JLS 不需要,但允许这样做)这种总线意味着它不必接触主内存即可获得一致的视图。

于 2012-07-31T07:16:42.747 回答
2

我认为以下线程应该回答您的问题。

Java中同步的记忆效应

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

于 2012-07-31T05:56:26.880 回答
1

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

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

3.此外,在你上面的例子中,如果threadA执行compute(),则threadB 不能同时访问该getResult()方法,因为它们都是同步方法,并且只有一个线程可以访问对象的所有同步方法,导致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.甚至每个类都有一个锁,用来保护类中静态变量的关键状态。

于 2012-07-31T05:32:55.473 回答