我从一个开源项目中阅读了一些有趣的代码,但我并没有真正理解它。
下面的 concurrentMapExample 是 java.util.concurrent.ConcurrentMap。下面的代码可以防止多个线程同时返回isLocked=true吗?
public boolean tryLock()
{
isLocked = concurrentMapExample.putIfAbsent(key, "") == null;
return isLocked;
}
我从一个开源项目中阅读了一些有趣的代码,但我并没有真正理解它。
下面的 concurrentMapExample 是 java.util.concurrent.ConcurrentMap。下面的代码可以防止多个线程同时返回isLocked=true吗?
public boolean tryLock()
{
isLocked = concurrentMapExample.putIfAbsent(key, "") == null;
return isLocked;
}
下面的代码可以防止多个线程同时返回isLocked=true吗?
是的。此代码是线程安全的,只有一个线程会返回 null。putIfAbsent(...)
之后使用相同key
(!!)调用的其他线程将获得该""
值isLocked
并将为 false。
为了迂腐,我建议您将相等性检查包装在括号中,或者可能执行以下操作以提高可读性:
if (concurrentMapExample.putIfAbsent(key, "") == null)
return true;
else
return false;
这似乎是一个学术问题,但对于后代来说,显然有更好的意愿这样做。例如,使用 an 的相同逻辑AtomicBoolean
将是:
private final AtomicBoolean isLocked = new AtomicBoolean(false);
...
return isLocked.compareAndSet(false, true);