多个线程调用静态帮助器方法

Mar*_*ioP 9 java static multithreading static-methods

我有一个在Tomcat上运行的Web应用程序.

需要在Web应用程序的多个位置进行多项计算.我可以将这些计算用于静态辅助函数吗?如果服务器有足够的处理器内核,那么对该静态函数的多次调用(由多个不同servlet的请求产生)是否可以并行运行?或者一个请求是否必须等到另一个请求完成呼叫?

public class Helper {
    public static void doSomething(int arg1, int arg2) {
        // do something with the args
        return val;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果调用并行运行:我有另一个带有静态函数的辅助类,但是这个类包含一个静态函数中使用的私有静态成员.如何确保函数是线程安全的?

public class Helper {

    private static SomeObject obj;

    public static void changeMember() {
        Helper.obj.changeValue();
    }

    public static String readMember() {
        Helper.obj.readValue();
    }

}
Run Code Online (Sandbox Code Playgroud)

changeValue()并readValue()读取/更改相同的成员变量Helper.obj.我是否必须使整个静态函数同步,或者只是Helper.obj使用哪个块?如果我应该使用一个块,我应该使用什么对象来锁定它?

hvg*_*des 5

您应该捕获类中的计算,并为每个线程创建该类的实例.你现在所拥有的并不是线程安全的,并且为了使它成为线程安全的,你必须在静态资源/访问该静态资源的方法上进行同步,这将导致阻塞.

请注意,有一些模式可以帮助您解决此问题.您可以使用策略模式(在其规范形式中,必须在运行时选择策略,这可能适用于此处,也可能不适用)或变体.只需使用execute方法(以及具有该方法的接口)为每个计算创建一个类,并传递一个上下文对象来执行.上下文包含计算的所有状态.每个线程一个策略实例及其上下文,您不应该有任何问题.


Mat*_*all 5

我能做那些计算静态辅助函数吗?如果服务器有足够的处理器核心,那么对该静态函数的多次调用(由多个不同servlet的请求产生)是否可以并行运行?

是的,是的.

我是否必须使整个静态函数同步

那可行.

或只是块,其中Helper.obj使用

那也行.

如果我应该使用一个块,我应该使用什么对象来锁定它?

使用static Object:

public class Helper {

    private static SomeObject obj;
    private static final Object mutex = new Object();

    public static void changeMember() {
        synchronized (mutex) {
            obj.changeValue();
        }
    }

    public static String readMember() {
        synchronized (mutex) {
            obj.readValue();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,理想情况下,您可以将辅助类编写为不可变(无状态或其他),这样您就不必担心线程安全.