假设我有以下课程将被大量阅读,但只是偶尔写入。它将在多线程 Web 应用程序中使用,因此它需要是线程安全的:
public class Foo {
private volatile String foo;
public String getFoo() {
return foo;
}
public synchronized String setFoo(String in) {
this.foo = in;
}
}
Java并发(http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html)指出这是一种保护写访问同时改善读访问的脆弱方法。这种模式的更强大的替代方案是什么?或者如果 foo 需要在读取繁重的环境中可变,还有其他选择吗?谢谢。
Volatile 提供对字段的快速线程安全无锁访问,无需同步
private volatile String foo;
public String getFoo() {
return foo;
}
public void setFoo(String in) {
this.foo = in;
}
易失性解决了 3 个问题 1) 内存可见性 2) 双精度和长字段的原子写入 3) 禁止指令重新排序。但是,如果您需要将一个字段上的多个操作作为一个原子事务(例如增量),那么这还不够。这段代码已损坏
private volatile int id;
public void incrementId() {
id++;
}
因为如果两个线程同时读取并递增它并保存结果,那么第一个递增的结果将被第二个递增的结果覆盖。为了防止这种情况发生,我们需要使用同步
private int id;
public synchronized int nextId() {
return ++id;
}
或 java.util.concurrent.atomic 包
private AtomicInteger id = new AtomicInteger();
public void incrementId() {
return id.incrementAndGet();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)