Zoh*_*qui 2 java multithreading atomic volatile
就像AtomicInteger一样,它也是线程安全的,因为我已经按照理论上讲过了使它成为线程安全的代码和技术
在计算机科学中,比较交换(CAS)是多线程中用于实现同步的原子指令。它将存储位置的内容与给定值进行比较,并且只有它们相同时,才将该存储位置的内容修改为给定的新值。这是作为单个原子操作完成的。原子性保证了根据最新信息计算新值;如果与此同时值已由另一个线程更新,则写入将失败。操作的结果必须表明它是否执行了替换;这可以通过简单的布尔响应(此变量通常称为“比较设置”)来完成,也可以通过返回从内存位置读取的值(而不是写入该值)来完成。
我看过AtomicInteger类的代码
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个问题,如果我使一个变量成为线程安全的,只需声明它为volatile。因此所有读取该变量的线程都将获得最新值。谁能解释给我,当我们有VOLATILE关键字使变量线程安全时,为什么要有AtomicInteger类使变量线程安全。volatile关键字相对于AtomicInteger的优点是什么。
如果我们声明volatile long和volatile double是线程安全的,如果不是,那么为什么它们不是线程安全的。而没有volatile的int是线程安全的。请解释
您已经错过了AtomicInteger中真正重要的部分:
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
Run Code Online (Sandbox Code Playgroud)
你不能模仿的是在一个简单的挥发性纯java。它对本机代码的调用以执行实际的原子比较和设置(CAS)操作
如果您有一个线程更新一个字段并且有任意数量的线程读取该字段,则Volatile很好。为了从多个线程安全地更新字段,您需要原子或同步。
| 归档时间: |
|
| 查看次数: |
576 次 |
| 最近记录: |