Synchronize 和 volitile 的区别(1)

来源:互联网 发布:万网域名转入 编辑:程序博客网 时间:2024/05/21 06:43

Synchronize
1,在同一对象锁或者同一对象监视器(Object Monster)上的同步
2,保证了不同线程对共享变量操作结果的可见性
volitile
Thread 1 负责对共享变量的写write
Thread 2~n 负责Read

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

0 0
原创粉丝点击