【发布时间】:2017-12-02 10:48:15
【问题描述】:
原子操作 - 一次有效地发生或根本不发生的动作 例如:java.util.concurrent.atomic.AtomicInteger
互斥 - 防止同时访问共享资源 例如:synchronized
使用互斥方法,SynchronizedCounter 是线程安全的,
class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
}
使用原子变量方法,AtomicCounter 是线程安全的,
import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
private AtomicInteger c = new AtomicInteger(0);
public void increment() {
c.incrementAndGet();
}
public void decrement() {
c.decrementAndGet();
}
public int value() {
return c.get();
}
}
1) 在上面的代码中,为什么原子变量方法优于互斥方法?
2) 总的来说,互斥和原子变量方法的目标不一样吗?
【问题讨论】:
-
请在问题中提供完整的上下文,无需点击链接。
-
@hyde 查询已编辑
-
它“更好”是因为它使用了比同步更快的低级指令,而且使用它比使用同步更难引入错误。
-
@JBNizet 原子变量方法是否提供无锁同步?
-
如果你的目标是只增加一个整数,原子地,是的。对于更复杂的用例(例如以原子方式修改两个引用),否。
标签: java multithreading atomic mutual-exclusion