volatile synchronized

volatile 

 

Volatile关键字修饰,线程A改变主内存flag = flase,会通知线程B去主内存重新读取flag = flase(缓存过期通知) 

Volatile  如何解决指令重排序?
a、java 代码层面 :volatile
b、java字节码层面 :acc_volatile 标记
c、jvm层级内存屏障:屏障两边的指令不可以重排,保证有序性。
d、最底层汇编语言实现 lock  指令

1、线程可见性,底层实现 缓存行对齐,  catch line 64字节,MESI缓存行一致性协议
2、禁止指令重排序 ——》DCL单例
避免乱序执行
1、jvm层级内存屏障(一种cpu指令):屏障两边的指令不可以重排,保证有序性。
2、cpu层级  lock指令

 

Synchronized实现
1、java 代码层面 :synchronized
2、java字节码层面 :开始加 monitorenter监视器,结束moniterexit 退出
3、执行过程中锁自动升级(无锁——》偏向锁——》自旋锁——》重量级锁)
4、最底层汇编语言实现 lock comxchg 指令

volatile synchronized 区别?

  1. Volatile 只能保证可见性
  2. Synchronized 既能保证可见性又能保证原子性 

Synchronized vs Lock(CAS)
在高竞争中 高耗时环境下 synchronized效率更高
在低竞争中 低耗时的环境下CAS效率更高
Synchronized到重量级锁之后是等待队列(不消耗CPU) 
CAS(等待极其消耗CPU)
 

 

Synchronized 与 ReentrantLock 的区别。公平锁

        Lock lock=new ReentrantLock();
        try {
            lock.lock();
        } finally {
            lock.unlock();
        }  

ReentrantLock 必须在 finally 块中释放。否则,如果受保护的代码将抛出异常,锁就有可能永远得不到释放!

ReentrantLock 构造器的一个参数是 boolean 值 。可实现公平锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值