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使用哪个块?如果我应该使用一个块,我应该使用什么对象来锁定它?
您应该捕获类中的计算,并为每个线程创建该类的实例.你现在所拥有的并不是线程安全的,并且为了使它成为线程安全的,你必须在静态资源/访问该静态资源的方法上进行同步,这将导致阻塞.
请注意,有一些模式可以帮助您解决此问题.您可以使用策略模式(在其规范形式中,必须在运行时选择策略,这可能适用于此处,也可能不适用)或变体.只需使用execute方法(以及具有该方法的接口)为每个计算创建一个类,并传递一个上下文对象来执行.上下文包含计算的所有状态.每个线程一个策略实例及其上下文,您不应该有任何问题.
我能做那些计算静态辅助函数吗?如果服务器有足够的处理器核心,那么对该静态函数的多次调用(由多个不同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)
但是,理想情况下,您可以将辅助类编写为不可变(无状态或其他),这样您就不必担心线程安全.
| 归档时间: |
|
| 查看次数: |
12739 次 |
| 最近记录: |