3

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

4

4 回答 4

2

不——如果每个线程都使用自己的数组副本,那么您有四个单独的数组,它们恰好包含相同的数据,但没有发生共享。

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

于 2010-11-04T16:12:12.297 回答
1

只要您绝对确定数组是完全不同的(这里需要小心,因为根据您所做的事情可能存在指向同一对象的指针),那么您就不需要同步数组。

于 2010-11-04T16:12:58.163 回答
0

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

于 2010-11-04T16:20:40.203 回答
0

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

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

于 2010-11-04T16:14:17.917 回答