是否可以使用易失性变量来实现一致的只写同步?
这是代码:
public class Controller {
Container cont = new Container();
...
public Object get(){
if(!cont.isLocked()){
return cont.getObject(); //many threads can read at the same time
}
else synchronized(cont){
return cont.getObject(); //threads wait until write is finished
}
}
public void set(Object o){
synchronized(cont){
cont.lock();
cont.setObject(o);
cont.unlock();
}
}
}
public class Container {
private volatile boolean lock = false;
private Object data;
public Container(){
}
public void lock() {
lock = true;
}
public void unlock() {
lock = false;
}
public boolean isLocked() {
return lock;
}
public void setObject(Object o) {
data = o;
}
public Object getObject() {
return data;
}
}
它会起作用,还是会破裂,您如何看待?
它可能/会破裂。执行示例:
if(!cont.isLocked())
返回trueset(someObject)
return cont.getObject();
返回旧版本更糟糕的是,由于T2和T1之间没有正确的事前关系,因此cont.getObject()
可能会返回对T2创建的新对象的引用,但指向一个不一致/未完全构造的对象。
您有一个典型的先检查后行动问题。
您为什么不只对对象使用易失性引用?
public class Controller {
private volatile Object obj = new Object();
public Object get(){ return obj; }
public void set(Object o){ obj = o; }
}
那将是线程安全的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句