首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果非同步静态方法不修改静态类变量,那么它们是线程安全的吗?

如果非同步静态方法不修改静态类变量,那么它们是线程安全的吗?
EN

Stack Overflow用户
提问于 2011-03-03 05:00:29
回答 5查看 63.3K关注 0票数 145

我想知道你是否有一个静态方法是不是同步的,但是不是修改任何静态变量,它是线程安全的吗?如果该方法在其内部创建局部变量怎么办?例如,下面的代码是线程安全的吗?

代码语言:javascript
复制
public static String[] makeStringArray( String a, String b ){
    return new String[]{ a, b };
}

因此,如果我有两个线程连续且并发地调用这个方法,一个线程调用狗(比如"great dane“和"bull”),另一个线程调用猫(比如"persian“和"siamese"),我会得到猫和狗在同一个数组中吗?或者猫和狗永远不会同时在同一个方法调用中?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-03 05:01:37

这个方法是100%线程安全的,即使它不是static。当你需要在线程之间共享数据时,线程安全的问题就出现了--你必须注意原子性、可见性等。

此方法仅对驻留在堆栈上的参数和对堆上不可变对象的引用进行操作。堆栈本质上是线程的本地堆栈,因此永远不会发生数据共享。

不可变对象(在本例中为String)也是线程安全的,因为一旦创建,它们就不能更改,并且所有线程都看到相同的值。另一方面,如果该方法接受(可变的) Date,那么您可能会遇到问题。两个线程可以同时修改同一个对象实例,从而导致争用条件和可见性问题。

票数 213
EN

Stack Overflow用户

发布于 2011-03-03 05:02:56

当一个方法改变一些共享状态时,它只能是线程不安全的。它是否是静态的是无关紧要的。

票数 30
EN

Stack Overflow用户

发布于 2011-03-03 05:08:36

该函数是完全线程安全的。

如果你仔细想想..。假设如果这种情况不同,会发生什么。如果不同步,每个常用函数都会有线程问题,因此JDK中的所有API函数都必须同步,因为它们可能会被多个线程调用。由于大多数时候应用程序都在使用一些API,因此多线程应用程序实际上是不可能的。

这太荒谬了,不去想它,所以只对你来说:如果有一个明确的原因可能会出现问题,那么方法就不是threadsafe。试着总是想一想,如果我的函数中有多个线程,如果你有一个步骤调试器,会不会一步接着一步地推进第一步……然后第二个线程...也许是第二次...会有问题吗?如果你找到了一个,它就不是线程安全的。

还请注意,大多数Java1.5集合类都不是线程安全的,除了那些声明的类,比如ConcurrentHashMap。

如果您真的想深入研究这个问题,可以仔细研究一下volatile关键字及其所有副作用。请看一下信号量()和锁()类,以及它们在java.util.Concurrent中的朋友。阅读类周围的所有API文档。这也是值得学习和满足的。

对于这个过于复杂的回答,我很抱歉。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5173399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档