synchronized和volatile的区别

synchronized和volatile的区别

1、volatile
volatile是java的关键字,使用volatile修饰的变量会强制将修改的值立即写入主存,主存中的值更新会使工作线程中的副本值失效。

保证内存可见性:某个线程修改了volatitle修饰的变量值,其他线程能够及时知道。
禁止指令重排序:当程序执行到volatitle修饰的变量的读写操作时,可以保证之前的语句已执行完,也能确定后面的逻辑还未执行
不保证原子性:volatitle不保证变量的任何操作都是原子性的,比如i++
2、synchronized
synchronized依赖于JVM,保证了同一时刻只能有一个线程在作用对象的作用范围内进行操作。内存可见性:线程在加锁时,先清空工作内存->在主存中拷贝最新变量副本到工作线程->执行完代码->将更改后的共享变量刷到主存中->释放互斥锁
操作的原子性:因为synchronized保证了同一时间只有一个线程对代码块进行操作,所以操作是原子性的。
有序性:第一条的特性决定,在多线程环境中,代码执行是有序的。
3、volatile和synchronized的区别
volatile不会加锁,比synchronized更轻量级,不会阻塞线程
volatile标记的变量不会被编译器优化而synchronized可以(比如编译器重排优化)
volatile是变量修饰符,而synchronized可以修改方法、变量、代码块、
volatile不保证原子性,synchronized可以保证原子性
他们都能保证内存可见性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值