并发访问实用程序静态方法

时间:2011-07-06 08:21:26

标签: java multithreading thread-safety

我们有一个场景,其中几个线程调用静态方法,如下所示:

public static boolean isEmpty(final String s) {
    return s == null || s.length() < 1;
}

如果100个线程调用它会导致不一致的问题吗?

5 个答案:

答案 0 :(得分:20)

没有。这不会遇到任何并发问题。

1)传入的参数是一个String,它是一个不可变的类(不能修改它的值)

2)该方法不会尝试修改任何共享状态

答案 1 :(得分:5)

该方法不访问任何共享状态。因此,不 - 它不会导致任何问题。

答案 2 :(得分:4)

不,因为没有共享状态。即使您使用相同的字符串s调用此方法,它仍然是安全的,因为String是不可变且线程安全的。

Apache Commons中的BTW StringUtils.isEmpty()方法做同样的事情。

答案 3 :(得分:0)

's'是传递的变量,并且在100个线程调用它的情况下,方法中没有定义任何其他内容应该没有问题

答案 4 :(得分:0)

所以可以这样认为, 每当创建线程时,都会使用自己的堆栈来创建线程(我猜创建时堆栈的大小约为2MB)。因此,任何发生的执行实际上都发生在此线程堆栈的上下文中。 创建的任何变量都存在于堆中,但其引用却存在于堆栈中,但静态变量不在线程堆栈中。

您进行的任何函数调用实际上都被推送到线程堆栈上,无论是静态的还是非静态的。由于将完整方法压入堆栈,因此任何发生的变量创建都存在于堆栈中(同样是静态变量),并且只能由一个线程访问。

因此,所有方法在更改某些静态变量的状态之前都是线程安全的。