根据“Java Concurrency in Practice”:
当 B 执行由同一锁保护的同步块时,A 在同步块中或之前所做的一切对 B 都是可见的
和
volatile 变量的可见性影响超出了 volatile 变量本身的值。当线程 A 写入一个 volatile 变量,随后线程 B 读取同一个变量时,在写入 volatile 变量之前对 A 可见的所有变量的值在读取 volatile 变量后对 B 可见
我不清楚的是一切和所有变量意味着什么?它真的意味着一切吗?如果我们有这样一个类:
class MyClassA{
int a;
int[] array = new int[10];
MyClassB myClass; // a class with similar properties
void notSyncronizedMethod(){
// do something with a, array[3], myClass.a, myClass.array[3]
}
syncronized void syncronizedMethodA(){
// update value of a, array[3], myClass.a, myClass.array[3]
}
syncronized void syncronizedMethodB(){
// do something with a, array[3], myClass.a, myClass.array[3]
}
}
如果我们syncronizedMethodA()在一个线程中调用然后在另一个线程中调用syncronizedMethodB()or notSyncronizedMethod(),假设时间顺序是严格保证的,将调用syncronizedMethodB()并notSyncronizedMethod()使用由 设置的最新变量值syncronizedMethodA()。我确定 a 的值对于 是可以的syncronizedMethodB(),但是像 array[3]、myClass.a 甚至 myClass.myClass.array[3] 这样的引用类型的元素呢?notSyncronizedMethod()通过同步方法更新值怎么样?
倚天杖
相关分类