线程内存,
当一个线程创建对象instance时,在堆内存中创建对象,引用指向堆内存的地址。
当对这个引用内容进行修改与赋值时,并不是直接操作堆内存对象。如果这样,所有线程操作同一个地方,也不会出现不一致问题了。这里要说的是线程内存,线程若要读取instance中的xxx值时,根据引用找到堆
内存这个对象的属性值,赋值给线程中的变量instance.xxx,修改完毕,用这个值覆盖堆中的xxx值。
总结一下就是,每个线程访问对象时,利用引用读取对象的属性拷贝到自己的线程内存,修改完毕覆盖回去。
这种情况可能会别人修改的还未覆盖就已经读取了,导致不一致问题。
volatile关键字就是每次使用前都和堆内存进行读取或者写回操作,这样不管哪个线程使用该关键字
修饰的变量,都能保证使用时先同步堆内存数据,保证了线程的可见性。
任重而道远
网友评论