Jam*_*ins 7 java concurrency multithreading atomicity memory-visibility
关于内存可见性的小问题.
CodeSample1:
class CustomLock {
private boolean locked = false;
public boolean lock() {
if(!locked) {
locked = true;
return true;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
此代码在多线程环境中容易出错,首先是因为"if-then-act"不是原子的,其次是因为潜在的内存可见性问题,例如threadA将字段设置为true,但是threadB是后来希望读取该字段的值可能看不到,仍然看到值false.
最简单的解决方案是使用synchronized关键字,如CodeSample2中所示.
CodeSample2:
class CustomLock {
private boolean locked = false;
public synchronized boolean lock() {
if(!locked) {
locked = true;
return true;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
现在如果我希望使用原子变量,例如,AtomicBoolean(问题适用于所有原子变量),
CodeSample3:
public static class CustomLock {
private AtomicBoolean locked = new AtomicBoolean(false);
public boolean lock() {
return locked.compareAndSet(false, true);
}
}
Run Code Online (Sandbox Code Playgroud)
除了更好的性能考虑之外,我们可以看到现在我们使用AtomicBoolean 实现了与CodeSample1的"if-then-act"类似的逻辑.逻辑上代码的作用并不重要,我的问题是如果2个线程在同一时间内调用CodeSample3中的lock()方法,而且很明显现在对该字段的任何写操作都将以原子方式完成,AtomicBoolean的使用是否也保证了内存可见性?
对不起,我只想确保尽可能清楚地发现,谢谢你们......
| 归档时间: |
|
| 查看次数: |
714 次 |
| 最近记录: |