有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jakarta ee Java:Java ee应用程序中的静态和线程安全

我想知道在JavaEE应用程序中使用静态方法的含义是什么

例如:有一个类处理日期转换、字符串重新排序等操作。
这个类中的所有方法都是静态的
这些方法由servlet使用

这是否意味着静态方法需要是线程安全的(如果多个用户同时使用应用程序并且同时访问静态方法,那么可能会出现一些问题)

编辑我想在web应用程序的上下文中了解这一点-两个用户是否会同时使用静态方法并相互干扰(静态方法的结果)


共 (3) 个答案

  1. # 1 楼答案

    Does this mean that the static methods need to be thread safe (in that if many users are using the application at the same time and are accessing the static method at the same time that there could be some issues)?

    只有当存在共享状态时。如果要为每次调用在堆上分配新对象,那么这不是问题

    但我从来都不喜欢做这种事情,因为引入共享状态立即意味着你有线程安全问题。我更喜欢创建转换器/助手类的实例(对象创建通常在性能方面可以忽略不计)。这立即意味着您是线程安全的(前提是您不共享状态),每个实例都可以(例如)在构造时进行定制,以便在需要时提供不同的行为

  2. # 2 楼答案

    只要没有共享的类变量,并行访问这些方法是可以的;e、 g.如果该方法声明了自己的内容,那么您就很好:

    public static void thing() {
        String x = "";
        // do stuff with x
    }
    

    以上是好的

    String x = "";
    
    public static void thing() {
        // do stuff with x
    }
    

    这个不是

  3. # 3 楼答案

    当然,如果你不保护你的静态方法,并且它们改变了a状态,就会出现问题

    考虑此样本

    public class GlobalCount {
    
        private int count = 0;
        public static void increment() {
           count++; // that is : count = count + 1 (which means some thread may use the old value of count when assigning)
        }
    }
    

    如果有多个线程调用increment,则可能会丢失一些增量(即count小于调用增量方法的次数)

    因此,必须将方法设置为已同步:

    public static synchronized void increment() {
           count++;
        }
    

    如果您认为自己没有共享状态,请小心:许多标准类(例如SimpleDateFormat,正如您所说的日期格式)不是线程安全的,如果同时从多个线程调用实例,则可能会失败

    因此,一旦有一个静态实例从多个线程访问,就要非常小心