是否可以通过任何常规方法或规则来确保专门用于任何应用程序的各种Utility类的静态方法的线程安全性。在这里,我想特别指出Web应用程序的线程安全性。
众所周知,以不可变对象作为参数的静态方法是线程安全的,而可变对象不是。
如果我有一个实用程序方法可用于的某些操作,java.util.Date
并且该方法接受的实例java.util.Date
,则该方法将不是线程安全的。那么如何在不更改参数传递方式的情况下使其成为线程安全的呢?
public class DateUtils {
public static Date getNormalizeDate(Date date) {
// some operations
}
}
课堂也是javax.faces.context.FacesContext
可变的吗?将此类的实例传递给此类静态实用程序方法是否安全?
此类类的实例可能是或不能作为参数传递的,列表可能很长;那么在编写此类实用程序类的代码时我们应牢记哪些要点?
众所周知,具有不变对象作为参数的静态方法是线程安全的,而可变对象不是。
我会对此提出质疑。传递给方法的参数存储在堆栈中,该堆栈是每个线程的惯用法。
如果您的参数是诸如a的可变对象,Date
则需要确保其他线程不会在其他地方同时修改它。但这是与方法的线程安全无关的另一件事。
您发布的方法是线程安全的。它不维护任何状态,仅根据其参数进行操作。
我强烈建议您阅读《
实践中的Java并发》
或类似的专门讨论Java线程安全的书。这是一个复杂的主题,无法通过一些StackOverflow答案来适当地解决。
我有一个简单的静态日志记录类。但是,它肯定不是线程安全的,因为每个调用都试图写入同一个文件。我得到了这些例外情况: 什么是最好的方法使它的线程安全? 作为一个日志记录函数,我希望能够从代码的许多不同部分访问它(因此,我选择它为静态的原因)。然而,我想要使它成为线程安全的,我总是必须向它传递一个公共对象来lock(),我认为这违背了静态函数的目的。还是事实并非如此?
问题内容: 我想将Calendar用于某些静态方法并使用一个静态字段: 现在,我读到java.util.Calendar不是线程安全的。如何使该线程安全(应该是 静态的 )? 问题答案: 如果不是,则不能创建线程安全的东西。在的情况下,即使从中 读取 数据也不是线程安全的,因为它可以更新内部数据结构。 如果有可能,我建议改用Joda Time: 大多数类型是不可变的 不可变类型是线程安全的 无论如
问题内容: 如何确保我的Java Servlet Web应用程序是线程安全的?关于会话变量,类的静态变量或其他可能导致线程安全的问题,我该怎么办? 问题答案: 事实:在webapp的生存期内只有一个servlet实例。它是在webapp启动时创建的,在webapp关闭时销毁的。另请参见此答案以进行粗略的解释。 因此,它已在所有请求(线程)之间共享。如果将请求或会话范围的数据分配为实例变量(或更糟的
问题内容: 我正在使用静态代码块来初始化我拥有的注册表中的某些控制器。因此,我的问题是,我可以保证在首次加载该类时,该静态代码块仅被绝对调用一次吗?我知道我不能保证何时将调用此代码块,我猜是在Classloader首次加载时。我意识到我可以在静态代码块中的类上进行同步,但是我猜这实际上是怎么回事? 简单的代码示例将是; 还是我应该这样做? 问题答案: 是的,Java静态初始化器是线程安全的(使用第
问题内容: 我正在尝试为一个项目实施单元测试,它使用了一个遗留有静态方法的旧式“实用程序”项目,并且许多类是最终的,或者它们的方法是最终的。我根本无法更新旧项目。 JMock和EasyMock都限制了最终方法,我看不到测试静态调用的好方法。有哪些技术可以测试这些? 问题答案: 如果您能够重构代码,则可以将对final / static方法的调用包装在简单的实例方法中,例如: 这使您可以在单元测试中
问题内容: 我有一个关于可变范围的问题。 例如: 现在,我创建两个线程,并为每个线程创建一个实例。 当我在每个线程中调用时,可以保证线程安全吗? 本地变量存储在哪里?每个线程的堆栈?堆空间? PS我知道在这种情况下,静态是毫无意义的。我在我们的旧代码中找到了它;我只是想确定我所知道的! 问题答案: 局部变量存储在每个线程自己的堆栈中。这意味着局部变量永远不会在线程之间共享。这也意味着所有本地原始变