如何保证实用静态方法的螺纹安全?

是否有任何通用方法或规则退出,通过这些方法,我们可以确保在任何应用程序的各种实用程序类中专门使用的静态方法的线程安全。在这里,我想特别指出Web应用程序的线程安全性。

众所周知,以不可变对象作为参数的静态方法是线程安全的,而可变对象则不是。

如果我有一个实用程序方法用于某些操作,并且该方法接受 的实例,那么此方法将不是线程安全的。那么如何在不改变参数传递方式的情况下使其线程安全呢?java.util.Datejava.util.Date

public class DateUtils {

    public static Date getNormalizeDate(Date date) {
        // some operations
    }   
}

此外,该类是否可变?将此类的实例传递给此类的静态实用程序方法是否线程安全?javax.faces.context.FacesContext

这个类列表,其实例可以或不能作为参数传递,可能很长;那么在编写此类实用程序类的代码时,我们应该记住哪些要点呢?


答案 1

众所周知,将不可变对象作为参数的静态方法是线程安全的,而可变对象则不是。

我会对此提出异议。传递给方法的参数存储在堆栈上,堆栈是每个线程的习惯用语。

如果您的参数是可变对象(如 a),则需要确保其他线程不会在其他地方同时修改它。但这是另一回事,与方法的线程安全性无关。Date

您发布的方法具有线程安全性。它不维持任何状态,只对其论点进行操作。

我强烈建议您阅读Java Concurrency in Practice,或者一本专门介绍Java中线程安全的类似书籍。这是一个复杂的主题,无法通过一些StackOverflow答案来适当地解决。


答案 2

由于您的类不保存任何成员变量,因此您的方法是无状态的(它仅使用局部变量和参数),因此是线程安全的。

调用它的代码可能不是线程安全的,但这是另一个讨论。例如,Date 不是线程安全的,如果调用代码读取由另一个线程写入的日期,则必须在 Date 写入和读取代码中使用正确的同步。