Java锁相关

Synchronized从使用到原理

为JVM提供,有很多优化,Lock锁为JDK提供。

Java中锁的概念

在这里插入图片描述

同步关键字synchronized

  1. 用于实例方法,静态方法时,隐式指定对象锁;
  2. 用于代码块时,显示指定对像锁;
  3. 锁的作用域:对象锁,类锁,分布式锁;
  4. 引申:多个线程怎么办?

特性:synchronized是悲观锁,排他锁(独享锁),可重入锁,非公平锁
锁优化:锁消除(开启锁消除的参数: -XX:+DoEscapeAnalysis -XX:+EliminateLocks)
锁粗化:JDK做了锁粗化的优化,但我们自己可从代码层面优化

Synchronized和Volatile的比较:

  • Synchronized保证内存可见性和操作的原子性
  • Volatile只能保证内存可见性
  • Volatile不需要加锁,比Synchronized更轻量级,并不会阻塞线程(volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞)
  • volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化(如编译器重排序的优化)
  • volatile是变量修饰符,仅能用于变量,而synchronized是一个方法或块的修饰符
  • volatile本质是在告诉JVM当前变量在寄存器中的值是不确定的,使用前,需要先从主存中读取,因此可以实现可见性。而对n=n+1,n++等操作时,volatile关键字将失效,不能起到像synchronized一样的线程同步(原子性)的效果。
    锁信息存储在Java对象头部中
    轻量级锁
    在这里插入图片描述
    抢不到锁,锁升级
    锁升级后->重量级锁 JVM修改对象头
    在这里插入图片描述
    在这里插入图片描述
    偏向锁
    在这里插入图片描述

锁的升级过程

在这里插入图片描述
总结:

  • 抢锁使用CAS操作,先比对人后进行修改,比对和修改都需要是原子操作(本质,使用CAS操作对内存进行修改,修改成功即为抢到锁)
  • 偏向锁为极端优化,不多做赘述
  • 轻量级锁:不停的使用CAS对内存操作,操作成功的即为抢到了锁,未成功的继续CAS自旋
  • 重量级锁:owner拥有者,所有线程来抢锁,使用CAS操作来修改owner,未成功的线程进入EntryList中,将线程挂起,然后再次尝试(排队机制)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值