是否可以使用易失性变量来实现一致的只写同步?

马库斯

是否可以使用易失性变量来实现一致的只写同步?

这是代码:

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;
    }
}

它会起作用,还是会破裂,您如何看待?

亚述

它可能/会破裂。执行示例:

  • T1:if(!cont.isLocked())返回true
  • T2: set(someObject)
  • T1: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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

嵌入式C-使用“易失性”声明一致性

来自分类Dev

Java易失性和缓存一致性

来自分类Dev

易失性关键字和内存一致性错误

来自分类Dev

为什么“易失性”需求仅从数组声明定义一致性?

来自分类Dev

为什么“易失性”需求仅从数组声明定义一致性?

来自分类Dev

对非易失性字段的同步访问是否安全?

来自分类Dev

同步是否保证线程将看到另一个线程正在修改的非易失性变量的最新值?

来自分类Dev

是否可以使用类型类来实现特征?

来自分类Dev

是否可以使用WCF来实现惰性逻辑?

来自分类Dev

c ++一致性是否使用decltype来帮助模板推导?

来自分类Dev

是否可以在C中编写一致的malloc实现?

来自分类Dev

何时可以完全优化掉易失性变量?

来自分类Dev

我可以通过将变量声明为本地线程来避免缓存一致性检查吗?

来自分类Dev

Java易失性和同步

来自分类Dev

Cassandra 是否为单个节点提供写后读一致性?

来自分类Dev

是否可以使用带有字符串的变量来标识另一个变量?

来自分类Dev

是否可以使用Stream API提供的并行性来调用一定数量的相互独立的方法?

来自分类Dev

“强一致性”与“写后读取一致性”

来自分类Dev

强制读取易失性变量

来自分类Dev

了解C中的易失性变量

来自分类Dev

了解C中的易失性变量

来自分类Dev

易失性和同步性之间的区别

来自分类Dev

是否可以使用Lisp中的宏来实现依赖类型输入的好处?

来自分类Dev

是否可以使用无侧折来实现foldl / folder?

来自分类Dev

是否可以使用Redis作为字典和AngularJs来实现拼写检查功能?

来自分类Dev

是否可以使用 Firebase 来实现分布式互斥锁?

来自分类Dev

当涉及到高速网络消息传递时,使用易失性词典是否是一个不错的选择?

来自分类Dev

明显不一致的读/写变量

来自分类Dev

是否可以使用解构来追加?

Related 相关文章

  1. 1

    嵌入式C-使用“易失性”声明一致性

  2. 2

    Java易失性和缓存一致性

  3. 3

    易失性关键字和内存一致性错误

  4. 4

    为什么“易失性”需求仅从数组声明定义一致性?

  5. 5

    为什么“易失性”需求仅从数组声明定义一致性?

  6. 6

    对非易失性字段的同步访问是否安全?

  7. 7

    同步是否保证线程将看到另一个线程正在修改的非易失性变量的最新值?

  8. 8

    是否可以使用类型类来实现特征?

  9. 9

    是否可以使用WCF来实现惰性逻辑?

  10. 10

    c ++一致性是否使用decltype来帮助模板推导?

  11. 11

    是否可以在C中编写一致的malloc实现?

  12. 12

    何时可以完全优化掉易失性变量?

  13. 13

    我可以通过将变量声明为本地线程来避免缓存一致性检查吗?

  14. 14

    Java易失性和同步

  15. 15

    Cassandra 是否为单个节点提供写后读一致性?

  16. 16

    是否可以使用带有字符串的变量来标识另一个变量?

  17. 17

    是否可以使用Stream API提供的并行性来调用一定数量的相互独立的方法?

  18. 18

    “强一致性”与“写后读取一致性”

  19. 19

    强制读取易失性变量

  20. 20

    了解C中的易失性变量

  21. 21

    了解C中的易失性变量

  22. 22

    易失性和同步性之间的区别

  23. 23

    是否可以使用Lisp中的宏来实现依赖类型输入的好处?

  24. 24

    是否可以使用无侧折来实现foldl / folder?

  25. 25

    是否可以使用Redis作为字典和AngularJs来实现拼写检查功能?

  26. 26

    是否可以使用 Firebase 来实现分布式互斥锁?

  27. 27

    当涉及到高速网络消息传递时,使用易失性词典是否是一个不错的选择?

  28. 28

    明显不一致的读/写变量

  29. 29

    是否可以使用解构来追加?

热门标签

归档