同步的数据的读/写/从主存储器(Synchronized data read/write to/fr

2019-09-20 12:39发布

当完成一个同步方法,它会推仅通过将其修饰以主存储器中的数据,或所有的成员变量,类似地,当一个同步方法执行时,将它的只读数据从主存储器需要或者将它清除所有在缓存中的成员变量和从主内存中读取它们的值? 例如

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

}

在上面的代码假定计算通过的ThreadA执行和的getResult由threadB执行。 计算的执行后,将的ThreadA更新与a和b的主存储器或将其更新的a,b,c和d。 和执行的getResult将threadB从主内存中得到的仅b值和C或将它清除缓存和所有成员变量a,b,c和d取值过吗?

Answer 1:

synchronized确保你有数据的一致视图。 这意味着你将阅读最新的价值以及其他高速缓存将获得最新的值。 缓存是足够聪明,通过一个特殊的总线互相交谈(由JLS要求的不是,但允许)该总线意味着它没有触摸主内存以获得一致的看法。



Answer 2:

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

在Java同步记忆效应

在实践中,整个高速缓存不对齐。



Answer 3:

1. 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.即使每个类都有一个锁 ,用来防止在类的静态变量的关键状态。



文章来源: Synchronized data read/write to/from main memory