1、重量级锁  

  作为互斥同步的方式,是最基础的锁,其他的锁都是为了减少开销做的优化,重量级锁借助了monitor 对象,monitor对象中有三个区域,分别是entity site、 owner和wait,进程进入同步前首先进入entity区域等待,若owner没有进程,则进入owner区域,若owner区域已经有进程则阻塞等待,owner也可以执行wait进入wait区域,当owner区域的进程执行完毕释放锁后,会唤醒阻塞的进程竞争锁,由于会导致线程的阻塞,则势必会导致用户态到核心态的切换,大大增加了损耗,因此才称为重量级锁。

2、自旋锁

  自旋锁就是为了防止线程阻塞所带来的上下文切换损耗,当线程竞争锁失败后,并不阻塞,而是继续请求锁直到锁释放,一般虚拟机设置为10次,可以自己设置,现在虚拟机也可以根据对象使用动态设置,当然自旋过程中也需要占用cpu,因此只使用于多核心的情况下,类似于等红灯的时候不熄火等绿灯。

3、轻量级锁

  轻量级锁是在线程没有其他竞争者的情况下的操作,先说一下对象头的构造,对象头的一部分存储的是与对象自身信息无关的信息,被称为markword,包括自身hash码、gc分代年龄等,mark word的32个比特里25个比特存哈希码,4个存分代年龄,2个存锁标记,1个存是否进入偏向锁,当对象被加了轻量级锁后,markword就被拷贝到当前线程,并被替换成指向位置的指针,替换过程要采用CAS操作,如果更新失败则说明有线程在竞争当前对象,锁膨胀成为重量级锁,在解锁时同样要进行CAS操作进行修改,如果失败则说明当前锁已经进入重量级锁,要唤醒等待进程,假如进程A持有当前锁对象,而此时进程B试图获取,则B会将锁修改为重量级锁,虚拟机会建立monitor对象,B进入阻塞或者自旋。

4、偏向锁

偏向锁和轻量级锁一样,都是基于当前进程没有其他进程竞争锁对象时,偏向锁更加乐观,当确定当前锁对象的mark word指向的是自身的指针后,则不进行CAS操作,直接继续使用对象,除非有其他进程竞争才膨胀为重量级锁。

5、可重入锁

 当前进程在获取锁对象后,第二次获取对象时若持有锁对象的是自身,则可以继续使用

在锁优化中,若无其他线程竞争锁对象,当有使用到当前锁对象的hashcode时,也会导致锁膨胀

最新文章

  1. go interface
  2. 344. Reverse String
  3. UML学习---交互
  4. 现在还需要测试或者QA人员吗?
  5. zpf 获取表单等数据的用法
  6. Oracle学习系列6
  7. 各种demo——CI框架学习
  8. Ganglia3.6.0,nginx+php搭建gweb,监控Hadoop2.2 和 Hbase0.98.1
  9. Ehcache中配置详解
  10. 多目标遗传算法 ------ NSGA-II (部分源码解析)README 算法的部分英文解释
  11. C功底挑战Java菜鸟入门概念干货(一)
  12. Apache httpd.conf配置详解
  13. 取distinct数据同时还取其他字段
  14. C++回顾day02---<对象构造和析构,外加友元函数>
  15. 接口签名进行key排序,并MD5加密
  16. Java: |(或运算) 与 多选判断
  17. 牛客网第一场 A Monotonic Matrix
  18. Netty私有协议栈 读书笔记
  19. oracle decode函数和 sign函数
  20. Codeforces-417D总结&题解

热门文章

  1. 接口介绍以及postman的基本使用
  2. java基础(数组、面向抽象编程、static、异常)
  3. 在react项目如何捕获错误
  4. (原创)【B4A】一步一步入门04:编译模式、打包为APK、私钥签名
  5. mysql怎么设计库、设计表
  6. select去除默认样式
  7. Apache Maven Assembly自定义打包插件的使用
  8. snowland-smx密码算法库
  9. php 中解析xml文件
  10. CF1303F 题解