您的位置: 首页 > 面试技巧

面试题:synchronized和volatile的区别是什么?

来源:华信智原  |  发布时间:2021-01-11  |  浏览量:160


面试题:synchronized和volatile的区别是什么?


区别:

volatile本质是在告诉JVM当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住;

volatile仅能使用在变量级别;synchronized则可以使用在变量、方法和类级别的;

volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性;

volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞;

volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。


volatile如何保证可见性:

    写屏障(sfence)保证在该屏障之前的,对共享变量的改动,都同步到主存当中;

    而读屏障(Ifence)保证在该屏障之后,对共享变量的读取,加载的是主存中最新数据。

volatile如何保证有序性:

    写屏障会确保指令重排序时,不会将写屏障之前的代码排在写屏障之后;

    读屏障会确保指令重排序时,不会将读屏障之后的代码排在读屏障之前。

volatile无法解决指令交错:


    写屏障仅仅是保证之后的读能够读到最新的结果,但不能保证读跑到它前面去;

    而有序性的保证也只是保证了本线程相关代码不被重排序。


相关新闻

24小时报名热线

400-7777-699

报名热线:400-7777-699

微博

微信公众号

友情链接 :智原在线   美味学院   安徽新华电脑   安徽新华教育

华信智原(官网)|京ICP备09028087号-8|咨询热线:400-7777-699|地址:北京海淀区北三环中路44号院爱工场文化教育产业园|版权所有:北京华信智原教育技术有限公司
在线报名 学费详情 开班信息 职业护航 视频下载

小小华想和您聊一聊