Java虚拟机的锁优化
2024-10-08 07:16:15
1 锁偏向。当现成请求一个对象锁时,如果获得锁,则该对象锁进入偏向模式,当该线程再次请求该对象的锁时,无需再做任何同步操作。
可通过在Java虚拟机中开启参数-XX:+UseBasedLock开启偏向锁
适用环境是:锁的竞争不是很激烈。如果是锁竞争非常激烈的环境下,很可能下次请求当前锁的不是同一个线程,此时偏向锁失效
2 轻量锁 。如果偏向失败,虚拟机并不会立即挂起线程。虚拟机会简单的将对象的头部作为指针,指向持有锁的线程的堆栈内部,以此来判断一个线程是否持有对象锁。
如果线程获得轻量级锁成功,则可以顺利进入线程内部。
3 自旋锁。如果轻量级锁失败,线程不会立即被挂起,虚拟机还会做最后的努力:自旋锁。由于其他线程已经获得锁,我们不知道该锁什么时候会被释放,如果简单粗暴的直接将当前线程挂起,可能会得不偿失,徒增资源消耗。这时候虚拟机会假设在不久的将来,我们可以获得锁。系统会让当前线程做几个空循环,在进行几个循环之后,如果获得锁,就进入临界区,否则挂起线程。
4 锁消除。虚拟机在JIT编译时,进行上下文扫描,去除不可能存在资源竞争的锁
最新文章
- 【学】jQuery的源码思路1——后代选择器
- Python自动化测试工具Splinter简介和使用实例
- paper 101:图像融合算法及视觉艺术应用
- iOS开发UI篇—UITableviewcell的性能优化和缓存机制
- ###《Effective STL》--Chapter1
- Spring 反转控制(IOC) 依赖注入(DI)
- 反射调用方法报InvocationTargetException异常
- NYOJ--244--16进制的简单运算(C++控制输入输出)
- webpack2+node+react+babel实现热加载(hmr)
- JS针对pc页面固定宽度在手机展示问题 <;meta ...>;
- springboot+rabbitmq例子
- Unable to add window -- token android.os.BinderProxy@3a067204 is not valid错误分析记录
- 局部内部类访问它所在方法的局部变量时,要求该局部变量必须声明为final的原因
- mysql 开发基础系列12 选择合适的数据类型(上)
- django中admin
- python测试开发django-43.session机制(登录/注销)
- 20145326《Java程序设计》实验二Java面向对象程序设计实验报告
- scrum 项目的基本模式
- gsoap
- 算法笔记_028:字符串转换成整数(Java)