synchronized和volatile有什么区别

一叶知秋 分类:问答

如题:synchronized和volatile有什么区别

回复

共1条回复 我来回复
  • Java实验室
    Java实验室
    【Java实验室】JAVA入门教程,springboot基础教程,springcloud,jvm学习交流平台,项目驱动交流学习,专注Java、springboot、springcloud、jvm、javaweb、j2ee开发等方向,誓做java交流沟通平台的拓荒者。
    评论

    volatile仅能使用在变量级别;synchronized则可以使用在变量方法、和级别的。
    volatile保证了变量的可见性synchronized保证了原子性可见性

    volatile

    原理:首先我们要先意识到有这样的现象,编译器为了加快程序运行的速度,对一些变量的写操作会先在寄存器或者是CPU缓存上进行,最后才写入内存。而在这个过程,变量的新值对其他线程是不可见的,而volatile的作用就是使它修饰的变量的读写操作都必须在内存中进行volatile告诉JVM, 它所修饰的变量不保留拷贝,直接访问主内存中的

    volatile与synchronized

    • volatile本质是在告诉JVM当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住
    • volatile仅能使用在变量级别,synchronized则可以使用在变量方法.
    • volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性原子性
    • volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞。
    • volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化。

    volatile不能保证原子性原因:线程A修改了变量还没结束时,另外的线程B可以看到已修改的值,而且可以修改这个变量,而不用等待A释放锁,因为Volatile 变量没上锁。

    注意
    声明为volatile的简单变量如果当前值由该变量以前的值相关,那么volatile关键字不起作用

    只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1。

    6个月前 1条评论
关注我们