考大家一个很有意思的多线程问题

也是面试出现的
背景是java,因为用到 ConcurrentHashMap

如下代码


private ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();

// implement a method
void operateIfNotLocked(String lockKey) {
   String value = map.get(lockKey);
   if (lockKey == null) {
      map.put(lockKey); 
       // do some logic if lockKey does not exist
      map.remove(lockKey);
   }
}


这里map充当一个管理lock的角色。
目前上面这段代码明显不是thread safe的。如何不用别的lock,不用synchronized,只用 map 本身让它变成 thread safe。

// implement a method
void operateIfNotLocked(String lockKey) {
    String value = map.get(lockKey);
    if (lockKey == null) {
        String localValue = UUID.randomUUID().toString();
        String valueFromMap = map.computeIfAbsent(lockKey, key->localValue);
        if (localValue == valueFromMap) {
            // Now, this thread owns the lock, could do something
            map.remove(lockKey);
        }
    }
}

Incorrect

Hint: putIfAbsent