GUC篇

死锁 四个条件 环路循环等待 不可剥夺 互斥 请求和保持

锁的一些应用场景

  • synchronized 锁的对象是方法的调用者 同一对象的两个方法用同一个锁 谁先拿到谁先执行
  • 两个对象 两个同步方法 不同的对象两把锁 通过延迟的时间片来判断(sleep)(同一个类的不同对象的锁互不干扰)
  • 两个静态同步方法 (非静态锁对象 静态锁类)static类一加载就有 锁的是class模板 class对象全局唯一 所以是按线程调用顺序执行
  • 一个同步方法 一个静态同步方法 (两把锁 对象锁 类锁) 两个锁 (类锁和对象锁互不干扰) 本质上还是在抢锁(类锁是一种特殊的对象锁)

指令重排

什么是指令重排

存在依赖关系的不能进行指令重排(有依赖关系他只能按顺序执行 没有依赖关系就感觉跟抢锁差不多)
什么是指令重排:你写的程序,计算机并不是按照你写的那样去执行的
源代码–》编译器优化重排–》指令并行也可能会重排–》内存系统也会重排–》执行
词法分析 语法分析 语义分析 代码优化 中间代码生成

Volatile可以避免指令重排

内存屏障: 禁止上面指令和下面指令顺序交换(单例模式使用的多)
cpu指令 作用:
1 保证特定的操作执行顺序
2 可以保证某些变量的内存可见性(利用这些特性实现了可见性)

volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值

volatile与synchronized的区别:

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

volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.

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

volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.

volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化.

所谓volatile的措施

  1. 每次从内存中取值,不从缓存中什么的拿值。这就保证了用 volatile修饰的共享变量,每次的更新对于其他线程都是可见的。
  2. volatile保证了其他线程的立即可见性,就没有保证原子性。
    3.由于有些时候对 volatile的操作,不会被保存,说明不会造成阻塞。不可用与多线程环境下的计数器。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值