【发布时间】:2019-02-28 19:18:49
【问题描述】:
伙计们- 我有一个助手类,其任务是根据参数构建一些消息。该类本身没有任何私有数据(当然实例除外)。
public class RequestBuilder {
private static RequestBuilder instance = new RequestBuilder();
private RequestBuilder() {}
public static RequestBuilder getInstance() {
return instance;
}
public SetRequest buildSetRequest(Path prefix,
Path path,
ConfigEntity configEntity,
Any protoAnyData) {
.....
.....
return setRequest;
}
public GetRequest buildGetRequest(Path prefix,
Path Path,
RetrieveRequestEntity retrieveRequestEntity,
Encoding encoding) {
.....
.....
return getRequest;
}
}
我了解单例类对多线程不友好。在这种情况下,当 2 个线程尝试同时执行 buildSetRequest() 会发生什么?
感谢您的宝贵时间。
编辑: 根据我的需要,并且正如@BoristheSpide 在下面的 cmets 中所建议的那样,我将把这个类作为一个实用程序类,并进行以下更改: 1. 最终确定。 2. 使方法静态化。 3. 删除所有单例引用。
public final class RequestBuilder {
private RequestBuilder() {}
public static SetRequest buildSetRequest(Path prefix,
Path path,
ConfigEntity configEntity,
Any protoAnyData) {
.....
.....
return setRequest;
}
public static GetRequest buildGetRequest(Path prefix,
Path Path,
RetrieveRequestEntity retrieveRequestEntity,
Encoding encoding) {
.....
.....
return getRequest;
}
}
我将保留原始代码,因为它仍然有效,并为 cmets 提供上下文和此问题的答案。
【问题讨论】:
-
如果没有共享状态——即没有字段——那就没问题了。
-
...虽然这确实引出了一个问题,即为什么你需要一个单身人士。只需将其设为实用程序类即可。
-
那么
buildSetRequest到底是什么?如果该调用修改了configEntity参数;并且两个调用线程使用相同的ConfigEntity实例。那么你可能会遇到问题(因为你有共享可变状态) -
@Daniele,不,没有任何输入被修改。
标签: java multithreading singleton