volatile与synchronized的区别,底层实现

首先两者都是用来确保数据的一致性的,volatile它能够使变量在值发生改变时尽快让其他线程知道,为什么要这么做呢?编译器为了加快程序运行速度,对一些变量的写操作会先在寄存器或者是cpu缓存上进行,最后才写入内存,这个过程,变量的新值对其他线程是不可见的,而volatile的作用就是使它修饰的变量的读写操作都必须在内存中进行。

区别:Volatile本质是告诉jvm当前变量在寄存器中的值是不安全的需要从内存中读取,sychronized则是锁定当前变量,只有当前线程可以访问到该变量,其他线程被阻塞。
volatile只能作用于变量,sychronzied则是可以作用在变量和方法上
volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的可见性和原子性
volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞
volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化

注意:因此,在使用volatile关键字时要慎重,并不是只要简单类型变量使用volatile修饰,对这个变量的所有操作都是原来操作,当变量的值由自身的上一个决定时,如n=n+1、n++ 等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原级别的。所以在使用volatile关键时一定要谨慎,如果自己没有把握,可以使用synchronized来代替volatile

发布了63 篇原创文章 · 获赞 3 · 访问量 1415

猜你喜欢

转载自blog.csdn.net/weixin_41772761/article/details/104158486