2010-11-04 48 views
3

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

回答

2

否 - 如果每个线程都使用自己的阵列副本,那么您有四个单独的阵列碰巧包含相同的数据,但不会发生共享。

如果您有一个数组,并且所有四个线程都在该数组上运行,至少两个线程同时使用相同数据的可能性将会共享。在这种情况下,您需要进行同步,以确保只有其中一方尝试(例如)在任何时间写入任何特定位置(或者如果某人正在读取另一个文字,则该文字是以原子方式完成的,在写之前完全读取,或者完全在写之后 - 但不允许两者重叠)。

+0

除了不好的编程风格在运行方法中编写所有功能的缺点是什么?如果我创建并使用run方法中的所有数据结构,那么每个线程将维护它自己的结构副本,并且不需要同步。 – simpleguy 2010-11-04 16:44:17

+0

将所有代码放在run方法中,并将其分解为多个其他函数应该不会对同步的要求(或缺乏)产生任何显着影响。 – 2010-11-04 16:56:43

+0

性能会更快,共享数据结构或每个拥有自己数据结构的线程?另外,哪种编程风格更好还是取决于上下文?我假设每个线程维护资源的单独副本时会有内存开销? – simpleguy 2010-11-04 17:09:41

1

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

0

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

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

+0

是的,我的坏在那里。我调用Thread.start(),然后调用run() – simpleguy 2010-11-04 16:39:43

0

这取决于你的意思是“在运行方法中,我使用了一个数组”(使用压力)?如果你已经将数组的引用传递给线程,那么是的,同步将阻止同时访问数组。然而,如果你在线程中创建了一个数组实例,那么你有4个单独的数组实例,同步没有效果。

+0

我在run方法内部创建一个数组。如果在当前上下文中不需要同步,那么让它有什么意义?我知道在run方法中编写所有功能是不好的编程风格,但主要问题是什么? – simpleguy 2010-11-04 16:38:49

+0

在您当前的上下文中,您可以放弃同步,因为您有单独的数组副本。如果你想使用同步,你可以在一个普通的地方声明数组(主类从你产生4个线程或者把数组作为另一个类的成员变量,然后把类的实例传递给线程)。你可以用同步声明一个方法,然后在其中完成所有重量级的活动。只需调用此方法即可,因为它是同步的。只有一个线程可以在任何时间点执行它。 – prashant 2010-11-04 16:51:02

+0

这意味着如果我创建并使用run方法中的所有数据结构,那么每个线程都会维护它自己的结构副本,并且不需要同步? – simpleguy 2010-11-04 16:56:55