目前这似乎有效,但也许有一天它会出错:
我有一个二维布尔数组,这些布尔值代表各种对象的状态(如果它们准备好或不被处理)
一个线程正在运行并制作这些对象,一旦制作了一个对象,它的布尔值就会设置为“true”(制作一个对象最多需要 20 毫秒)。
我的问题是:
我可以在线程发挥它的魔力时读取(仅读取)这个数组吗?如果线程在我的方法读取它时写入 true,会发生什么?
谢谢。
目前这似乎有效,但也许有一天它会出错:
我有一个二维布尔数组,这些布尔值代表各种对象的状态(如果它们准备好或不被处理)
一个线程正在运行并制作这些对象,一旦制作了一个对象,它的布尔值就会设置为“true”(制作一个对象最多需要 20 毫秒)。
我的问题是:
我可以在线程发挥它的魔力时读取(仅读取)这个数组吗?如果线程在我的方法读取它时写入 true,会发生什么?
谢谢。
写入boolean
是原子的,因此您不会看到任何不一致之处。long
和的情况并非如此double
。
发生在你身上的最糟糕的事情就是能见度。当一个线程更新给定变量但其他线程没有立即(或从不)看到该更改时,会出现可见性问题。
为了确保所有线程看到相同的最新值,您必须使用某种同步或volatile
字段。
我可以在线程发挥它的魔力时读取(仅读取)这个数组吗?如果线程在我的方法读取它时写入 true,会发生什么?
是的,您可以很好地阅读它,如果您尝试对其进行写入,您可能会发现自己陷入困境。至于第二个问题,很简单,这是不可能的。您不能在该索引发生变化的同时读取该索引。它要么等到写入完成,要么读取写入之前的任何内容。