知识点回顾
volatile 和synchronized的区别
- volatile 是告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要去主内存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞
- volatile仅能使用在变量级别;synchronized则可以使用在变量、方法和类级别
- volatile仅能使用在变量的修改可见性,不保证原子性;synchronized可以使用在变量、方法和类级别
- volatile不会造成线程阻塞;synchronized可能会造成线程阻塞
- volatile 标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化
- 仅使用volatile并不能保证线程安全;synchronized则可以实现线程的安全性,因为线程的安全取决于原子性和可见性
volatile:是java虚拟机提供的轻量级的同步机制
- 保证可见性
- 不保证原子性(就有可能出现写丢失的情况)
- 禁止指令重排
synchronized 是关键字属于jvm层面
- 不需要用户手动释放锁
- 不可中断
- 非公平
- 不可以绑定多个条件Condition
- 是可重入锁
https://www.bilibili.com/video/BV18b411M7xz?p=52&spm_id_from=pageDriver
|