我们有一个场景,其中几个线程调用静态方法,如下所示:
public static boolean isEmpty(final String s) {
return s == null || s.length() < 1;
}
如果100个线程调用它会导致不一致的问题吗?
答案 0 :(得分:20)
没有。这不会遇到任何并发问题。
1)传入的参数是一个String,它是一个不可变的类(不能修改它的值)
2)该方法不会尝试修改任何共享状态
答案 1 :(得分:5)
该方法不访问任何共享状态。因此,不 - 它不会导致任何问题。
答案 2 :(得分:4)
不,因为没有共享状态。即使您使用相同的字符串s
调用此方法,它仍然是安全的,因为String
是不可变且线程安全的。
Apache Commons中的BTW StringUtils.isEmpty()
方法做同样的事情。
答案 3 :(得分:0)
's'是传递的变量,并且在100个线程调用它的情况下,方法中没有定义任何其他内容应该没有问题
答案 4 :(得分:0)
所以可以这样认为, 每当创建线程时,都会使用自己的堆栈来创建线程(我猜创建时堆栈的大小约为2MB)。因此,任何发生的执行实际上都发生在此线程堆栈的上下文中。 创建的任何变量都存在于堆中,但其引用却存在于堆栈中,但静态变量不在线程堆栈中。
您进行的任何函数调用实际上都被推送到线程堆栈上,无论是静态的还是非静态的。由于将完整方法压入堆栈,因此任何发生的变量创建都存在于堆栈中(同样是静态变量),并且只能由一个线程访问。
因此,所有方法在更改某些静态变量的状态之前都是线程安全的。