java多线程中volitile的运用场景

java多线程中volitile的使用场景

volitile是不能保证线程对共享资源获取是同步的,volitile只能保证被修改的数据不会存在于cpu的缓存中,而是直接刷新回内存,这样可以保证所有对资源共享的线程都是从内存中直接读取相同的数据,而就不存在一部分线程读内存中的数据而另外一部分读缓存中的数据,造成数据的可视性不一致了。使用volitile和非volitile修饰的变量同样是不存在粒子性的,其自加和自减操作在jvm的实现中都是分多步进行的,1gefiled2、将域值放入栈帧的局部变量区,3、将局部变量区的数据取得后放入操作数栈进行运算4、计算完成返回结果后再putfield。这样在多线程中对共享资源的同步使用volitile同样是非线程安全的。对共享资源同步的保险方法是使用synchronized方法,每个对象只有一个对象锁,jvm负责监控对象锁,当对象锁被某个线程取得时,jvm对对象锁的计数变为1,此时jvm将不会允许其它线程获得此对象的对象锁。将共享资源的运算以及获取放入synchronized方法中,同时将共享资源修饰为volitile,这样就可以做到双保险了。Synchronized修饰的方法是隐式的锁技术,可以使用Lock进行细粒度的锁控制,在Lock对象未调用unlock方法之前,非持有对象锁的进程均无法进入Lock.lock()…………Lock.unlock()这块区域。