volatile 与 synchronize

1、volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好;volatile只能修饰变量,而synchronized可以修饰方法,代码块。随着JDK新版本的发布,synchronized的执行效率也有较大的提升,在开发中使用synchronized的比率还是很大的。

2、多线程访问volatile变量不会发生阻塞,而synchronized可能会阻塞。

3、volatile能保证数据的可见性,但是不能保证原子性;而synchronized可以保证原子性,也可以保证可见性。

4、关键字volatile解决的是变量在多个线程之间的可见性;synchronized关键字解决多个线程之间访问公共资源的同步性。

volatile这个关键字,解决的是变量修改的“可见性”问题。被volatile修饰的变量,不会被CPU放到它的缓存中,而是在内存中,这样任何一个CPU修改了它的值,其他的CPU马上就能够读到

什么时候需要加volatile呢?如果一个变量需要被多个线程共享,就需要添加volatile

volatile无法保证线程安全

保证线程安全的一个办法是加锁

synchronized与volatile都可以实现线程的可见性

synchronized
遇到线程不安全的问题,习惯性的会想到用 synchronized 关键字来解决问题,暂且先不论该办法是否合理,我们来看 synchronized 关键字是怎么解决上面提到的共享变量内存可见性问题的

【进入】synchronized 块的内存语义是把在 synchronized 块内使用的变量从线程的工作内存中清除,从主内存中读取
【退出】synchronized 块的内存语义事把在 synchronized 块内对共享变量的修改刷新到主内存中
上述2个特性,决定了synchronized的可见性

猜你喜欢

转载自blog.csdn.net/u014365523/article/details/128410480