Java 同时共享同一函数的多个线程
例如,如果我们创建了3个线程T1、T2和T3,分别调用它们中的同一个函数或过程,那么如果我们调用它们一段时间Java 同时共享同一函数的多个线程,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,例如,如果我们创建了3个线程T1、T2和T3,分别调用它们中的同一个函数或过程,那么如果我们调用它们一段时间T1.start()T2.start()T3.start()是否有效??或者我们需要同步它们???只有在不同线程中读取/写入相同的变量(状态)时才需要同步。如果方法只使用局部变量,则不需要同步它们。如果不同步函数,则同步它们对资源的访问 如果任何函数修改公共资源*,而其他函数需要访问它(无论是读还是写),则需要同步对该资源的访问。否则,不需要添加同步。 *资源可以是成员变量,静态或非静态
T1.start()T2.start()T3.start()
是否有效??或者我们需要同步它们???只有在不同线程中读取/写入相同的变量(状态)时才需要同步。如果方法只使用局部变量,则不需要同步它们。如果不同步函数,则同步它们对资源的访问
如果任何函数修改公共资源*,而其他函数需要访问它(无论是读还是写),则需要同步对该资源的访问。否则,不需要添加同步。
*资源可以是成员变量,静态或非静态,内存中的对象,操作系统对象,如文件或套接字,集合等等。我有一个
向量
,我正在考虑创建5个线程
,同时向向量
添加元素,所以我猜我的想法是不可行的???@GhassenBellagha添加到向量会使集合无效,所以你是对的,如果没有同步,你不能使用向量。如果您计划仅在向量末尾添加元素,则可以使用,而无需额外的同步。因此,在这种情况下,不需要线程
,我的意思是我可以调用普通函数,而不是线程
,因为它似乎给出相同的结果!?即使使用阻塞队列
,线程
也不会并行工作,因此它与一条又一条指令的工作指令相同@GhassenBellagha当然,这些线程将并行工作。只有写作不会并行进行,但其他一切都会并行进行。考虑这一点:你有五个线程读取文件,构造对象,并将它们添加到队列中。读取文件和构建对象将并行进行;添加到队列将阻塞。另一个线程可能正在从该队列的另一端读取数据,阻止数据可用。它也可以与其他线程并行工作。请注意,java.util.Vector
已经同步,对于写入同一Vector
的多个线程,不需要额外的同步。