Java并发-volidate关键字

原创
2019/12/14 16:15
阅读数 354

使用volidate关键字修饰的成员变量,保证可见性,也就是当一个线程修改这样的成员变量后,其他的线程能够立即看到这次的修改。有两个方面的原因:

1.编译器不优化对这样的关键字修饰变量的一些访问操作

2.对读,写这个关键字修饰的变量前后,会追加内存屏障指令,使其当读之前,会主动从主存中读,当写之后,会使其他的缓存内的这个变量值失效,迫使使用那个缓存的线程再次读取这个变量时主动从主存中读取。

为何volidate关键字不保证原子性?

针对这样的变量的get,set能够保证原子性,但是针对某些操作无法保证原子性,比如++,--这样的操作。

使用的方式一般是一个线程修改变量,其余的线程读取变量。用作线程间通知的作用。

当初电话面试阿里巴巴的一个开发岗位,对方问了一下多线程的简单概念,问volatile关键字是否能保证线程安全,我说不能,他说为什么不能,我答不上来。

现在再次深入学习java并发编程,终于理解为什么volatile不能保证线程安全了。

保证线程安全可以有两种方式

1.原子操作,基本上只能是cas操作才能保证原子操作。

2.线程互斥执行,可以使用锁来保证线程互斥执行,也就是线程串行执行。

3.变量只被一个线程所读写。

知识需要理解,技能需要练习,体系需要建立。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部