下面的演示代碼是如何線程安全的?我們正在確保CAS指令中的值是否未被修改,然後在int上進行增量。 return v + 1;
步驟不會跳過整個目的,因爲它可以跳過線程的更新。使用compareAndSet進行線程安全
這裏原子整數用來模仿一個非阻塞int計數器。
//Here value is an atomic integer
public int increment()
{
int v;
for(;;)
{
v = value.get();
if(value.compareAndSet(v, v + 1))
return v + 1;
}
}
不宜代碼是這樣的:
public int increment()
{
int v;
for(;;)
{
v = value.get();
if(value.compareAndSet(v, v + 1))
return value.get();
}
}