关于voliatile实际上并没有多少知识点可以阐述,至少我是这么理解的.但是因为在java多线程和并发编程的过程中都可以用到这种方式,所以对它进行了大概的了解.

  在多线程的开发过程中,每次在一个线程中打开运行一个新线程,新线程对它的父线程中的数据操作实质上就是将父线程中的数据进行拷贝然后存储在新线程自己开辟的内存空间中.

  所以线程的实用造成脏数据的原因就存在于这里,当子线程从父线程拿到数据的那一瞬间这个数据就已经独立出来了,完全不管父线程接下来会对这个数据进行怎样的修改,而是当子线程操作完成后自己将子线程自己内存空间的数据复制到父线程中这样就导致了父线程在调用子线程之后对数据的操作全部无效.

  而java的加锁操作机制就在于,当子线程在对数据进行修改的过程中,就将父线程对这个数据操作的能力给锁上,相反亦然.

  最后voliatile的操作就在于子线程不会拷贝父线程的数据到自己的内存中,而是每次需要使用的时候去父线程中提取就可以了,有人会说,那好啊,这样数据就不会出错了.

  实际上n = n++;这样的操作仍然会出错,因为他涉及到三个步骤:

  1.提取数据,数据没出错.

  2.加法操作,这个时候数据可能在主线程中被更改了

  3.赋值操作,脏数据出现了

  那么最后volatile到底作用在哪里呢?

  volatile能保证你在线程中任何读操作都绝对是读的实时数据,写的话就不保证了....