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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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_Thread Safety - Fatal编程技术网

Java 同时共享同一函数的多个线程

Java 同时共享同一函数的多个线程,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,例如,如果我们创建了3个线程T1、T2和T3,分别调用它们中的同一个函数或过程,那么如果我们调用它们一段时间T1.start()T2.start()T3.start()是否有效??或者我们需要同步它们???只有在不同线程中读取/写入相同的变量(状态)时才需要同步。如果方法只使用局部变量,则不需要同步它们。如果不同步函数,则同步它们对资源的访问 如果任何函数修改公共资源*,而其他函数需要访问它(无论是读还是写),则需要同步对该资源的访问。否则,不需要添加同步。 *资源可以是成员变量,静态或非静态

例如,如果我们创建了3个线程T1、T2和T3,分别调用它们中的同一个函数或过程,那么如果我们调用它们一段时间
T1.start()T2.start()T3.start()
是否有效??或者我们需要同步它们???

只有在不同线程中读取/写入相同的变量(状态)时才需要同步。如果方法只使用局部变量,则不需要同步它们。

如果不同步函数,则同步它们对资源的访问

如果任何函数修改公共资源*,而其他函数需要访问它(无论是读还是写),则需要同步对该资源的访问。否则,不需要添加同步。

*资源可以是成员变量,静态或非静态,内存中的对象,操作系统对象,如文件或套接字,集合等等。

我有一个
向量
,我正在考虑创建5个
线程
,同时向
向量
添加元素,所以我猜我的想法是不可行的???@GhassenBellagha添加到向量会使集合无效,所以你是对的,如果没有同步,你不能使用向量。如果您计划仅在向量末尾添加元素,则可以使用,而无需额外的同步。因此,在这种情况下,不需要
线程
,我的意思是我可以调用普通函数,而不是
线程
,因为它似乎给出相同的结果!?即使使用
阻塞队列
线程
也不会并行工作,因此它与一条又一条指令的工作指令相同@GhassenBellagha当然,这些线程将并行工作。只有写作不会并行进行,但其他一切都会并行进行。考虑这一点:你有五个线程读取文件,构造对象,并将它们添加到队列中。读取文件和构建对象将并行进行;添加到队列将阻塞。另一个线程可能正在从该队列的另一端读取数据,阻止数据可用。它也可以与其他线程并行工作。请注意,
java.util.Vector
已经同步,对于写入同一
Vector
的多个线程,不需要额外的同步。