1 锁偏向。当现成请求一个对象锁时,如果获得锁,则该对象锁进入偏向模式,当该线程再次请求该对象的锁时,无需再做任何同步操作。

可通过在Java虚拟机中开启参数-XX:+UseBasedLock开启偏向锁

适用环境是:锁的竞争不是很激烈。如果是锁竞争非常激烈的环境下,很可能下次请求当前锁的不是同一个线程,此时偏向锁失效

2 轻量锁 。如果偏向失败,虚拟机并不会立即挂起线程。虚拟机会简单的将对象的头部作为指针,指向持有锁的线程的堆栈内部,以此来判断一个线程是否持有对象锁。

如果线程获得轻量级锁成功,则可以顺利进入线程内部。

3 自旋锁。如果轻量级锁失败,线程不会立即被挂起,虚拟机还会做最后的努力:自旋锁。由于其他线程已经获得锁,我们不知道该锁什么时候会被释放,如果简单粗暴的直接将当前线程挂起,可能会得不偿失,徒增资源消耗。这时候虚拟机会假设在不久的将来,我们可以获得锁。系统会让当前线程做几个空循环,在进行几个循环之后,如果获得锁,就进入临界区,否则挂起线程。

4 锁消除。虚拟机在JIT编译时,进行上下文扫描,去除不可能存在资源竞争的锁

最新文章

  1. 【学】jQuery的源码思路1——后代选择器
  2. Python自动化测试工具Splinter简介和使用实例
  3. paper 101:图像融合算法及视觉艺术应用
  4. iOS开发UI篇—UITableviewcell的性能优化和缓存机制
  5. ###《Effective STL》--Chapter1
  6. Spring 反转控制(IOC) 依赖注入(DI)
  7. 反射调用方法报InvocationTargetException异常
  8. NYOJ--244--16进制的简单运算(C++控制输入输出)
  9. webpack2+node+react+babel实现热加载(hmr)
  10. JS针对pc页面固定宽度在手机展示问题 <meta ...>
  11. springboot+rabbitmq例子
  12. Unable to add window -- token android.os.BinderProxy@3a067204 is not valid错误分析记录
  13. 局部内部类访问它所在方法的局部变量时,要求该局部变量必须声明为final的原因
  14. mysql 开发基础系列12 选择合适的数据类型(上)
  15. django中admin
  16. python测试开发django-43.session机制(登录/注销)
  17. 20145326《Java程序设计》实验二Java面向对象程序设计实验报告
  18. scrum 项目的基本模式
  19. gsoap
  20. 算法笔记_028:字符串转换成整数(Java)

热门文章

  1. sublime插件AndyJS2安装教程
  2. 二维码开源库ZBar-吐槽篇
  3. QT开发应用程序的欢迎界面
  4. python学习:设计一个算法将缺失的数字找出来。
  5. Zabbix 3.0 监控Web
  6. Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍
  7. 【mysql】 操作 收集持续更新
  8. Maven中模块的聚合以及对jar包的继承
  9. PHP不使用array_merge函数实现一维数组合并
  10. Jmeter简单介绍与搭配Jenkins实现自动化