java非易失性变量是否需要同步?
考虑2个线程和一个数组^ {CD1>}。 第一个线程正在执行:
synchronized (values) {
values[i] = 58;
}
当第二个线程正在执行时:
if (values[i] == 58) {
}
在synchronized
块之外
如果第一个线程首先执行values[i]= 58
,是否可以保证如果第二个线程执行得稍晚,即使第二个线程在synchronized
块外读取58
,第二个线程的if
也会读取58
# 1 楼答案
上述行为不能保证。这种“可见性”的保证实际上是关系发生之前的主题:
在实现关系(according to JLS)之前发生:
因此,在您的特定情况下,您实际上需要使用共享监视器或AtomicIntegerArray进行同步,以确保对阵列线程的访问安全
volatile
修饰符不会起作用,因为它只影响指向数组的变量,而不会影响数组的元素(more detailed explanation)# 2 楼答案
没有
以这种方式同步不会停止其他线程同时对阵列执行任何操作。但是,将阻止其他线程获取阵列上的锁