永发信息网

求大神,java多线程中volitile的使用。

答案:2  悬赏:70  手机版
解决时间 2021-04-08 07:18
  • 提问者网友:黑米和小志
  • 2021-04-07 09:30
求大神,java多线程中volitile的使用。
最佳答案
  • 五星知识达人网友:杯酒困英雄
  • 2021-04-07 09:49
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()这块区域。
全部回答
  • 1楼网友:琴狂剑也妄
  • 2021-04-07 10:18
volatile的作用是保证修饰的属性不存在副本,多个线程访问的是同一个对象。
例如:
有对象x,包含一个属性y,有两个线程A、B,同时不断访问x.y,那么:
1. 当y属性没有volatile修饰的时候,除了主内存中存在一份x.y以外,为提高性能,线程A、B各自缓存一个x.y的副本,并不时与主内存中的属性同步。此时线程A、B对该属性的修改是对副本的修改,另一线程并不能立即获取到修改结果;
2. 当y属性没有volatile修饰的时候,仅有主内存中存在一份x.y,线程A、B强制直接访问主内存中的发展。此时线程A、B对该属性的修改,另一线程立刻就能获取到修改结果。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯