您需要了解的第一件事是,链接答案中讨论的方案与您所讨论的方案之间存在细微的差异。您说的是在不同步的情况下修改值,而所有值都是在链接答案中的同步上下文中修改的。考虑到这一点,让我们解决您的问题:
Q1。假设在多线程应用程序中,仅在同步块中读取了对象或原始实例字段(写 *** 作可能会在其他方法中发生而没有同步)。同样,在其他对象上定义了同步块。声明它为易失性(即使仅在Synchronized块中读取)是否有意义?
是的,将字段声明为确实有意义
volatile。由于写 *** 作不是在
synchronized上下文中进行的,因此无法保证写线程会将新更新的值刷新到主内存中。因此,读取线程可能仍会看到不一致的值。
假设进行更改时没有获得锁,但是通过获得锁来完成读取。同步块内的所有对象的状态和所有原始字段的值是否始终具有一致的视图。?
答案是否定的。推理与上面相同。
底线:
在同步上下文之外修改值将无法确保将这些值刷新到主内存。(因为读取器线程可能会在写入器线程之前进入同步块)在
synchronized上下文中读取这些值的线程可能仍然会读取较旧的值,即使它们是从主内存中获取的。
请注意,这个问题是关于基元的,因此理解Java 为32位基元(除long和double以外的所有基元)提供 超薄安全性
也很重要,这意味着您可以放心,至少有效值(如果不一致)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)