我想处理客户端请求流。每个请求都有其特殊类型。首先我需要为该类型初始化一些数据,然后我可以开始处理请求。当客户端类型第一次来的时候,我只是初始化了相应的数据。在此之后,使用该数据处理该类型的所有以下请求。
我需要以线程安全的方式执行此操作。
这是我写的代码。它是线程安全的吗?
public class Test {
private static Map<Integer, Object> clientTypesInitiated = new ConcurrentHashMap<Integer, Object>();
/* to process client request we need to
create corresponding client type data.
on the first signal we create that data,
on the second - we process the request*/
void onClientRequestReceived(int clientTypeIndex) {
if (clientTypesInitiated.put(clientTypeIndex, "") == null) {
//new client type index arrived, this type was never processed
//process data for that client type and put it into the map of types
Object clientTypeData = createClientTypeData(clientTypeIndex);
clientTypesInitiated.put(clientTypeIndex, clientTypeData);
} else {
//already existing index - we already have results and we can use them
processClientUsingClientTypeData(clientTypesInitiated.get(clientTypeIndex));
}
}
Object createClientTypeData(int clientIndex) {return new Object();}
void processClientUsingClientTypeData(Object clientTypeData) {}
}
一方面,ConcurrentHashMap 不能为同一个 A 生成两次 map.put(A,B) == null。另一方面,赋值和比较操作不是线程安全的。
那么这段代码可以吗?如果没有,我该如何解决?
更新:我接受了 Martin Serrano 的回答,因为他的代码是线程安全的,并且不容易出现双重初始化问题。但我想指出,我的版本没有发现任何问题,作为答案发布在下面,而且我的版本不需要同步。