Java的锁深入理解

Java的锁深入理解
java线程通信介绍
  1. 几种重要的锁实现方式:synchronized、ReentrantLock、ReentrantReadWriteLock。
  2. 对象锁的内存结构以及各种转换。
  3. Java的API层面提供锁的源码分析(单独分析)。
锁类型的介绍
锁类型的介绍
  1. 自旋锁:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。
  2. 乐观锁:假定没有冲突,在修改数据时如果发现数据和之前获取的不一致,则读最新数据,修改后重试修改。
  3. 悲观锁:假定会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁。
  4. 独享锁(写):给资源加上写锁,线程可以修改资源,其他线程不能再加锁;(单写)
  5. 共享锁(读):给资源加上读锁后只能读不能改,其他线程也只能加读锁,不能加写锁;(多读)
  6. 可重入锁、不可重入锁:线程拿到一把锁之后,可以自由进入同一把锁所同步的其他代码。
  7. 公平锁、非公平锁:争抢锁的顺序,如果是按先来后到,则为公平。
synchronized关键字

JMM中规定,synchronized要保证可见性(不能够被缓存)。
1、用于实例方法、静态方法时,隐式指定锁对象
2、用于代码块时,显示指定锁对象
3、锁的作用域:对象锁、类锁、分布式锁
4、引申:如果是多个进程,怎么办?
特性:可重入、独享、悲观锁
特殊优化: 锁消除(开启锁消除的参数:-XX:+DoEscapeAnalysis -XX:+EliminateLocks)
、锁粗化JDK做了锁粗化的优化,但我们自己可从代码层面优化
-XX:+EliminateLocks 锁消除
-XX:+EliminateAllocations开启标量替换 1.8默认开启
锁的优化带来的性能的提升
https://www.jianshu.com/p/04fcd0ea5af7

对象头(MarkWord)
  1. park和unpark是在LockSupport类中 提供的API也是单纯的等待和唤醒操作
  2. park和unpark 可以单独使用和锁是没有关系的
  3. park和unpark 解决了 supend/resume 问题 如果线程先unpark之后在park是可以直接往下运行的
    在这里插入图片描述
    默认情况下JVM锁会经历:未锁定->偏向锁-> 轻量级锁-> 重量级锁这四个状态
    参考来源:
    https://www.cs.princeton.edu/picasso/mats/HotspotOverview.pdf
    https://wiki.openjdk.java.net/display/HotSpot/Synchronization
锁升级的过程

在这里插入图片描述
偏向标记第一次有用,出现过争用后就没用了。-XX:-UseBiasedLocking禁用使用偏置锁定,
偏向锁,本质就是无锁,如果没有发生过任何多线程争抢锁的情况,JVM认为就是单线程,无需做同步(jvm为了少干活:同步在JVM底层是有很多操作来实现的,如果是没有争用,就不需要去做同步操作)

重量级锁-- Monitor

修改mark word如果失败,会自旋CAS一定次数,该次数可以通过参数配置:
超过次数,仍未抢到锁,则锁升级为重量级锁,进入阻塞。
monitor也叫做管程,计算机操作系统原理中有提及类似概念。一个对象会有一个对应的monitor。
在这里插入图片描述
wait方法导致当前线程等待,加入该对象的等待集合中,并且放弃当前持有的对象锁。
notify/notifyAll方法唤醒一个或所有正在等待这个对象锁的线程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值