Java线程安全(volatile & synchronized)

总结

volatile不能保证线程安全而synchronized可以保证线程安全。volatile只能保证被其修饰变量的内存可见性,但如果对该变量执行的是非原子操作线程依旧是不安全的。而synchronized既可以保证其修饰范围内存可见性和操作的原子性,所以synchronized是线程安全的

名词解释

内存可见性:在并发编程中,我们可以通过消息机制和共享内存来进行线程间的通信。在Java中共享内存通过Java内存模型(JMM)来控制。


Jmm.jpg

线程A要和线程B都需要操作同一个变量,这时A和B会将该变量缓存至其私有内存域中,在A线程中对该变量执行了操作后刷新至主内存然后通过主内存更新至B线程的私有内存域中,这样就能达到线程间通信的目的了,如果线程B始终可以得到线程A中最新的共享变量,这时我们可以认为线程A对该变量的操作对于B来说是可见的。

原子操作

可以理解为不可被中断的一个或一系列操作,一旦该操作开始就必须结束之后才会执行别的操作。

注意要点

1.由于volatile不保证原子性,所以当大量的线程频繁执行非原子操作时将导致各线程得不到最新的共享变量,使得最终的结果不符我们的预期。
2.实例锁

synchronized(this);

synchronized{
     代码块
}

锁住的是对象
3.对象锁

synchronized(xxx.class)

static synchronized

锁住的是该类

volatile使用场景
(1)运算的结果并不依赖于变量的当前值,或者能够确保只有单一的线程修改变量的值;

(2)变量不需要与其他状态变量共同参与不变约束。

DSC_0489.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容