小编Aft*_*eld的帖子

使用ConcurrentHashMap时的并发问题

我一直在研究REST API作为一些技能的一部分.在将对象插入ConcurrentHashMap时,我当前的实现有一个小的并发问题.

我的代码检查消耗的JSON是否包含ID.如果不是,我创建一个新的唯一ID并插入该对象.如果是,我继续检查我的地图中是否已存在该ID.如果不存在具有该ID的对象,则插入该对象.

检查HashMap是否包含匹配的ID并插入对象之间的时间段在许多并发POST请求发生时证明是一个问题.如果在第二个请求的代码gcdMap.get(obj.getId()) == nullgcdMap.put(obj.getId(), obj);代码行之间执行第一个请求,则指定了ID的请求可能会写入具有生成ID 的请求.我一直在使用Thread.Sleep()来重现这个问题.

public static ConcurrentMap<Long, GCDObject> gcdMap = new ConcurrentHashMap<Long, GCDObject>();
@POST

@Consumes(MediaType.APPLICATION_JSON)
public GCDObject create(GCDObject obj) throws GCDRequestException {
    obj.setTimestamp(LocalDateTime.now());
    obj.setResult(GCD.calculate(obj.getX(), obj.getY()));

    if (obj.getId() != null) { // JSON contains ID
        if (gcdMap.get(obj.getId()) == null) { // If map does not contain obj with ID already,
            Thread.sleep(1000);
            gcdMap.put(obj.getId(), obj); // Put obj into map.
            return obj;
        } else { // else map already contains ID,
            throw new GCDRequestException();
        } …
Run Code Online (Sandbox Code Playgroud)

java rest concurrency thread-safety java-8

4
推荐指数
1
解决办法
301
查看次数

标签 统计

concurrency ×1

java ×1

java-8 ×1

rest ×1

thread-safety ×1