例如,以下方法:
class MyClass
self.perform(id)
hash = doSomething(id)
doMoreStuff(hash)
return hash
end
end
我关心的是如果我有多个线程调用MyClass.perform()
。对象hash
是否可能被另一个线程覆盖?换句话说,Thread 1调用do某物
并获取返回的{1=的哈希值
或者,每个线程都在自己的
散列
上工作,而其他线程永远不会触及它?假设
doSomething
和doMoreStuff
已经是线程安全的。
如果重要的话,我使用的是Rails 3.0。
作为类方法(只是类对象上的单例方法)的东西并不比作为实例方法更具线程安全性。
局部变量,例如您的散列
,对于周围方法的特定调用是局部的。如果两个线程同时调用perform
,那么每个调用都将获得自己的执行上下文,除非涉及到共享资源,否则这些上下文不会重叠:实例变量(@hash
)、类变量(@@hash
)、全局变量($hash
)、。。。可能会导致并发问题。使用像perform
这样的简单工具,就不用担心线程方面的问题了。
但是,如果perform
正在创建线程,并且最终在perform
中使用闭包,那么最终可能会有多个线程引用通过闭包捕获的相同局部变量。因此,在创建线程时,您必须小心范围问题,但在处理仅处理局部变量的简单方法时,您不必担心范围问题。
IBM的支持指出,Class.GetAnnotation的实现不是线程安全的。 与其他JVM实现(例如,OpenJDK)相比,我们可以看到它们以线程安全的方式实现类方法。IBM JVM是一个闭源JVM,他们确实会发布一些源代码和他们的JVM一起,但无论什么时候他们的类实现是否线程安全,都不足以做出明确的判断。 类文档没有清楚地说明它的方法何时是线程安全的。那么,将类方法(特别是getAnnotat
看起来它工作得很好,但我想知道我是否必须确保新代码需要线程安全?这里有什么意见吗?抱歉用了假名字,提前致谢。
问题内容: 我有多个线程试图更新MySQL数据库?使用executeUpdate方法是线程安全的吗? 问题答案: 不,使用它不是线程安全的。 实际上,如果其他某个线程使用一条语句,然后另一个线程调用executeUpdate(),则另一个线程的s(如果有的话)将被关闭。“ javadoc.sql.Statement的JavaDoc(PreparedStatement是其子类型) ”如果存在打开的语
问题内容: 在我的Java项目中,我需要以多种方式使用TreeMap。我发现ConcurrentSkipListMap是我需要的,但是某些方法不是线程安全的。其中之一- containsKey(Object key)。以多种方式使用此方法的典型解决方案是什么?在我的程序中,我需要放置不会替换旧密钥的密钥,如果不可能的话,我将放置另一个密钥而不会获得唯一密钥。因为我不会丢失信息,所以应该使用哪种构造
我读过很多关于Servlet和threadsafe的文章--我知道,“Servlet容器只加载和实例化每个Servlet一次……”。但是,如果我创建抽象类extends Servlet,它有一个用参数处理的方法,那么在后代中使用这个threadsafe吗?
问题内容: 根据Swing教程: 一些Swing组件方法在API规范中被标记为“线程安全”。这些可以从任何线程安全地调用。所有其他Swing组件方法都必须从事件分发线程中调用。忽略此规则的程序在大多数情况下都可以正常运行,但是会遇到难以预料的错误,这些错误很难重现。 但是这些标记为“线程安全”的Swing组件方法是什么?真的有吗? 更新/赏金: 是否有线程安全的摆动方法的 完整列表 ?(线程安全的