当前位置: 首页 > 知识库问答 >
问题:

同步数据读/写到/从主存储器

宋铭
2023-03-14

当同步方法完成时,它将仅将其修改的数据推送到主内存,还是将所有成员变量(类似地,当同步方法执行时,它将仅从主内存中读取所需的数据,还是清除缓存中的所有成员变量并从主内存中读取其值?例如

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 执行。执行计算后,线程 A 将使用 a 和 b 更新主内存,还是会更新 a、b、c 和 d。在执行 getResult 之前,threadB 将仅从主内存中获取 b 和 c 的值,还是会清除缓存并获取所有成员变量 a、b、c 和 d 的值?

共有3个答案

衡建中
2023-03-14

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

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

3.此外,在上面的示例中,如果< code>threadA执行< code>compute(),那么< code>threadB不能同时访问< code>getResult()方法,因为它们都是同步方法,并且只有一个线程可以访问对象的所有同步方法,因为< code >锁定的不是方法而是对象。它是这样的...每个对象都有一个锁,想要访问其同步块的线程必须获得那个锁

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

时修贤
2023-03-14

我认为下面的帖子可以回答你的问题。

Java中同步的内存效应

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

卢阳泽
2023-03-14

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

 类似资料:
  • 主要内容:本节引言:,1.Android文件的操作模式,2.文件的相关操作方法,3.文件读写的实现,4.读取SD卡上的文件,5.关于原生模拟器SD卡的问题,6.读取raw和assets文件夹下的文件,代码下载:,本节小结:本节引言: 嘿嘿,看到这个题目,相信部分读者会问,你前面的Fragment写完了吗?嗯,没写完,因为想例子,需要 一点时间,为了提高效率,所以决定像多线程一样,并发的来写教程,这样可能可以加快写教程的进度, 到现在为止,刚好写了60篇,离完成入门教程还很远呢,而前面也说过,想在

  • 问题内容: 我从php收到一个json数组 我想要的是将此数据 写入我的应用程序数据文件夹中或安全的任何位置。 还要从中读取此数据并将其转换为可以进一步编辑的有效数据。 谁能告诉我一种方法我怎么可能做这件事? 问题答案: 从文件中读取字符串时,将其转换为JsonObject或JsonArray

  • 我正在将数据从BigQuery读入dataproc spark集群。如果在我的例子中BigQuery表中的数据最初是从GCS加载的,那么如果BigQuery connector for dataproc(newAPIHadoopRDD)首先将数据下载到Google云存储桶中,那么直接从GCS读取数据是否更好?这两种方法有什么利弊吗?

  • 我有一个程序,其中我有一个父进程,我想创建3个子进程。 我还为每个共享内存创建了2个共享内存(IN、OUT)和1个信号量。 这个想法是: 父进程有3个整数,必须在共享内存中写入其中一个整数。然后其中一个子进程读取它,进行一些计算,并在共享内存(OUT)中写入一些内容,父进程从该内存读取结果。然后父进程将下一个整数添加到共享内存中,依此类推。 这是我的代码的一部分,我试图实现第一部分(从共享内存中写

  • “同步到数据库”功能让你比对物理模型和现有数据库或模式,显示它们之间结构的差异,并提供同步模型的结构到目标连接。 Navicat 提供一个向导,一步一步指导你完成任务: 选择“文件”->“同步到数据库”。 选择源数据库、模式,然后从现有的连接中选择目标连接、数据库、模式。 点击“选项”并选择比对或高级选项。 点击“比对”以显示源对象和目标对象之间的差异。 选择要同步的对象。 点击“部署”以生成一组

  • “同步到数据库”功能让你比对模型和现有数据库或模式,显示它们之间结构的差异,并提供同步模型的结构到目标连接。 Navicat 提供一个向导,一步一步指导你完成任务: 选择“文件”->“同步到数据库”。 选择源数据库、模式,然后从现有的连接中选择目标连接、数据库、模式。 点击“选项”并选择比对或高级选项。 点击“比对”以显示源对象和目标对象之间的差异。 选择要同步的对象。 点击“部署”以生成一组脚本