jea*_*ean 5 java variables visibility
我发现的关于可见性的所有例子都是基本类型的例子.我想知道的是:如果一个对象在堆中新建,当一个线程调用其方法来改变其状态时,没有锁定或同步,其他线程会看到这个变化?想象一下Java.Colletion对象,一个线程调用它的add()方法
有人说堆中的对象仍然存在可见性问题,但JLS说:17.4.1共享变量可以在线程之间共享的内存称为共享内存或堆内存.
和 http://www.artima.com/insidejvm/ed2/jvm2.html说:线程的Java堆栈存储线程的Java(非本机)方法调用的状态.Java方法调用的状态包括其局部变量,调用它的参数,返回值(如果有)和中间计算.
所以我认为,JVM不会将堆中的对象复制到CPU缓存中.如果这是正确的,堆中的对象将不会有可见性问题,因为线程只引用堆中的对象.
BTW假设当一个线程调用.add()时会出现并发问题.在正常过程中,更改必须使用锁定保护,因此这个问题不是问题.但我只是想知道:)
synchronized如果您没有volatile、原子变量或其他提供happens-before语义的并发容器,您仍然可以执行内存同步。但是,如果您不执行这些操作,那么内存可见性就无法得到保证。
在您的特定情况下,如果您想add()在一个线程中调用容器并让它在另一个线程中可见而无需显式锁定,那么只有当该容器是并发容器(例如,包中的容器之一java.util.concurrent)时,这才有效,或同步的(例如,Collections.synchronizedList)。