synchronized,volatile,final

synchronized
  • 使用方式分类
    • 方法:
      • 修饰实例方法,被锁对象为类的当前实例对象
      • 在这里插入图片描述
      • 修饰静态方法,被锁对象为类对象,即该类的所有实例,调用该方法时都需要排队。在这里插入图片描述
    • 代码块
      • 锁实例对象,类的实例对象。即锁住这个实例对象。
      • 在这里插入图片描述
      • class对象,锁住这一类的对象,不一定是自己,也可以是其他的类,也会被整个锁住,排队进入。在这里插入图片描述
      • 任意实例的对象Object,即实例对象Object。
      • 在这里插入图片描述
  • synchrinized具有重入性。每个对象拥有一个计数器,当线程获得该对象的锁后,计数器加一,释放锁后就会将计数器减一。
volatile
  • Java虚拟机提供的最轻量级的同步机制
  • 两种特性
    • 可见性:指一条线程修改了这个变量的值,新值对于其他线程来说可以立即得知。即每次变量值都存主内存获取,不从工作内存,每次变更都刷新到主内存,
      • 可见性的存在条件
        • 运算结果不依赖变量的当前值,或者能够保证只有单一的线程修改变量值。
        • 变量不需要与其他的状态变量共同参与不变约束。
    • 禁止指令重排序优化
      • 指令重排序优化:是指变量在方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序和程序中的执行顺序是一致的。该操作属于机器级的优化操作
  • 性能
    • 读操作:volatile变量的性能消耗与普通变量几乎没有什么差别。
    • 写操作:会慢一些,因为需要在本地代码中插入许多内存屏障指令来保证处理器补发生乱序行为。
final
  • 修饰类:表明一个累不能被继承,final类中的成员变量被隐式的指定为final方法。
  • 修饰方法:方法被锁定,不能被继承该类的子类修改。
  • 修饰变量
    • 如果修饰基本数据类型的变量,则其数值一旦初始化之后便不能修改。
    • 如果修饰引用类型的变量,则对其初始化之后便不能指向另一个对象(内存地址不能变化,但对象的内部属性可以变)。

synchronized部分参考地址:https://www.jianshu.com/p/d53bf830fa09

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值