前言-发奋忘食,乐以忘优,不知老之将至.
介绍:在java中用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值[注意:不要被这个都字误导.稍后做详细解释].volatile很容易被[误用],用来进行[原子性]操作。
解释:在java的虚拟机运行的机制中,java的线程运行程序的时候,为了保证程序运行的效率问题,每个线程运行的时候,虚拟机会单独为这个线程分配一块临时内存区域,我们可以称之为[当前线程专用内存]
而线程会把自己运行过程中所需要的变量加载到[当前线程专用内存]之中,(举例线程A需要执行一个对变量a的++的操作,在线程加载的时候,会首先把变量a加入到自己的[当前线程专用内存]当中),当线程
执行完毕的时候,会再把当前的保存在[当前线程专用内存]的变量,更新到[原始内存]当中.
问题:如果有两个线程A和B,同时对变量进行upate操作,那么在两个线程执行当中,可能会出现这样一种情况,两个线程进入程序,都在自己的[当前线程专用内存]当中保存了,变量的原始值.那么两个线程执行
完毕之后,最后一个执行的线程的update操作将覆盖第一个线程执行的update操作.----------------程序的不同步问题(银行取钱存钱问题.)
解决思路
1.同时只让一个程序执行update操作----------效率低-------synchronized
2.执行updtae操作的时候,让线程不要从[当前线程专用内存]中读取备份的变量,而是直接从内存中读取变量--------效率稍高-------volatile
原文:http://www.cnblogs.com/yatou520/p/4115837.html