Java线程安全(volatile & synchronized)

总结

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

名词解释

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


Java线程安全(volatile & synchronized)_第1张图片
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

你可能感兴趣的:(Java线程安全(volatile & synchronized))