Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于同步的重要性_Java_Multithreading_Synchronized - Fatal编程技术网

Java 关于同步的重要性

Java 关于同步的重要性,java,multithreading,synchronized,Java,Multithreading,Synchronized,这可能是一个愚蠢的问题,但我对Java中的多线程编程一无所知。我创建了4个线程,然后对它们调用了run方法。在run方法中,我使用一个数组,并将值分配给它的索引。我看到每个线程都在维护它自己的数组副本,并且没有线程不安全的行为。我只是想知道,在这种情况下,使用同步的意义是什么?(我以为它是用来控制对共享资源的访问。这里的数组不应该是一个共享数据结构吗?)不——如果每个线程都使用自己的数组副本,那么就有四个单独的数组恰好包含相同的数据,但没有分享 如果您有一个数组,并且所有四个线程都在该数组上运行

这可能是一个愚蠢的问题,但我对Java中的多线程编程一无所知。我创建了4个线程,然后对它们调用了run方法。在run方法中,我使用一个数组,并将值分配给它的索引。我看到每个线程都在维护它自己的数组副本,并且没有线程不安全的行为。我只是想知道,在这种情况下,使用同步的意义是什么?(我以为它是用来控制对共享资源的访问。这里的数组不应该是一个共享数据结构吗?)

不——如果每个线程都使用自己的数组副本,那么就有四个单独的数组恰好包含相同的数据,但没有分享


如果您有一个数组,并且所有四个线程都在该数组上运行,那么共享就是两个线程至少可以同时使用相同的数据。在这种情况下,您需要进行同步,以确保其中只有一个在任何时间尝试(例如)写入任何特定位置(或者,如果一个在读,另一个在写,那么写是原子化的,读要么完全在写之前发生,要么完全在写之后发生——但这两个过程不允许重叠)。

只要您完全确定数组是完全不同的(此处需要小心,因为可能会有指向同一对象的指针,具体取决于您所做的操作)那么您就不需要同步数组。

如果您的线程只对自己的私有数据执行操作,那么就不需要同步


顺便说一下,您说您在线程上“调用了run方法”;但是直接调用Thread.run()不会在新线程中执行您的逻辑;您需要调用Thread.start()(它在单独的线程中内部执行run())。

这取决于您所说的“在run方法中我正在使用数组”(强调使用)?如果您已将数组引用传递给线程,则“是”,同步将阻止对数组的同时访问。但是,如果您在线程中的数组上创建一个实例,则您有4个单独的数组实例,且同步无效。

我正在run方法内创建一个数组。如果当前上下文中不需要同步,则en拥有它有什么意义?我知道在run方法中写入所有功能是不好的编程风格,但主要问题是什么?在当前上下文中,您可以删除sync,因为您有单独的数组副本。如果要使用sync,可以在公共位置声明数组(从主类派生4个线程或将数组作为另一个类的成员变量,然后将该类的实例传递给线程)。您可以使用sync声明一个方法,然后在其中执行所有重量级活动。只需在run中调用此方法,因为它是sync。在任何一个时间点,只有一个线程能够执行它。这意味着如果我创建并使用run方法中的所有数据结构,则每个线程都将维护其自身的结构副本,而不进行同步需要进行同步?没错。Run是一个方法,其中声明的变量在该方法的作用域内。是的,我的错误在那里。我正在调用Thread.start(),它反过来调用Run()除了糟糕的编程风格之外,在run方法中编写所有功能的缺点是什么?如果我在run方法中创建并使用所有的数据结构,那么每个线程都将维护自己的结构副本,并且不需要同步。将所有代码放在run方法中,而不是在多个线程中拆分其他功能不应对同步要求(或缺少同步)产生任何重大影响。从性能角度看,共享数据结构或每个线程都有自己的数据结构,哪个更快?另外,哪个编程风格更好,还是取决于上下文?我假设每个线程维护一个单独的资源副本时会有内存开销?@simpleguy:这取决于。复制数据需要时间。所以does正在等待另一个线程。复制的时间是a(或多或少)固定的前期成本,而等待是一种持续的成本,取决于不同线程争夺同一数据的频率。至于哪个更好,这也取决于。如果您希望一个线程中的更改对其他线程可见,您只需要共享数据。否则,复制数据可能会简单得多(特别是如果所有线程都以类似方式访问数据)也可以提高速度。感谢您的回复,这是非常有见地的。