线程安全和方法参数
Thread safety and method arguments
我有一个 class Helper
,只有一个方法 int findBiggestNumber(int [] array)
,没有实例变量。
如果我创建一个对象 Helper h = new Helper();
并让 10 个不同的线程使用该对象的唯一方法 findBiggestNumber
来查找数组的最大数,它们会相互干扰吗?
我担心的是,例如当 findBiggestNumber
中的参数引用线程 8 中的数组时,线程 1 开始计算其数组的最大数字。在我的示例中会发生这种情况吗?
不,你描述的问题不可能发生。由于您的 Helper class 没有成员,因此它是线程安全的。
当可变(可变)数据在多个线程之间共享时,会出现线程安全问题。但是在您的示例中,Helper 不包含任何将在多个线程之间共享的数据(即变量),因为每个线程都会将自己的数据(int[] 数组)传递到 Helper 的 findBiggestNumber() 方法中。
如果没有 findBiggestNumber
的实现,就不可能说它是否是线程安全的,因为您可能会改变作为参数传递的数组。如果是这样,并且您将同一个数组传递给多个线程,则可能存在竞争条件;否则,它是线程安全的。
findBiggestNumber
也可能正在修改全局或静态数据,这也会使其线程不安全。
我有一个 class Helper
,只有一个方法 int findBiggestNumber(int [] array)
,没有实例变量。
如果我创建一个对象 Helper h = new Helper();
并让 10 个不同的线程使用该对象的唯一方法 findBiggestNumber
来查找数组的最大数,它们会相互干扰吗?
我担心的是,例如当 findBiggestNumber
中的参数引用线程 8 中的数组时,线程 1 开始计算其数组的最大数字。在我的示例中会发生这种情况吗?
不,你描述的问题不可能发生。由于您的 Helper class 没有成员,因此它是线程安全的。
当可变(可变)数据在多个线程之间共享时,会出现线程安全问题。但是在您的示例中,Helper 不包含任何将在多个线程之间共享的数据(即变量),因为每个线程都会将自己的数据(int[] 数组)传递到 Helper 的 findBiggestNumber() 方法中。
如果没有 findBiggestNumber
的实现,就不可能说它是否是线程安全的,因为您可能会改变作为参数传递的数组。如果是这样,并且您将同一个数组传递给多个线程,则可能存在竞争条件;否则,它是线程安全的。
findBiggestNumber
也可能正在修改全局或静态数据,这也会使其线程不安全。