博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 之 Synchronize 锁深度解读(和朋友探讨后的总结和验证)
阅读量:7071 次
发布时间:2019-06-28

本文共 615 字,大约阅读时间需要 2 分钟。

hot3.png

首先一句话自己概述一下自己的理解,一种由JVM实现的互斥同步锁、非公平锁

底层通过该 monitorenter 和 monitorexit 两个字节码指令实现。

在执行到monitorenter命令时,首先尝试获取对象锁,

成功,把锁的计数器加一,这时候对象就是锁定状态(非0),最后执行monitorexit,会将锁计数器减一来实现解锁。

注意:非零或者本身持有对象锁都可以获取对象锁,这个主要用来解决死锁问题,同时实现了锁重入

锁的本质是monitorenter和 monitorexit指令的一个 Reference 类型参数,即要锁定和解锁的对象。

 

jdk6之前,monitor完全依赖底层操作系统的互斥锁来实现(也因为此不同的底层实现有差别),

jdk6开始对锁做了许多优化,说之前先需要知道一个知识点,就是线程的挂起和唤醒需要操作系统协助,在用户态和内核态切换是很耗费资源的,我下面都用一句话来解释

首先就是自旋锁,就是发现对象被锁,死循环等一会再试一下。

锁消除:在运行时发现不可能存在共享数据竞争的锁进行消除。

锁粗化:在一系列连续动作都对同一对象反复枷锁和解锁,造成性能损耗,自动扩大锁范围

轻量级锁:相对原生互斥锁(悲观锁),他就是一种乐观锁,可以参考cas操作

倾向锁:提前预知倾向执行的线程,然后消除它的锁

 

 

转载于:https://my.oschina.net/haitaohu/blog/3000252

你可能感兴趣的文章
RestTemplate实践
查看>>
FYSBIS分析报告:SOFACY的Linux后门
查看>>
javascript 代理模式(通俗易懂)
查看>>
微信小程序开发者经验分享组织成立啦~~~
查看>>
五分钟学习 Java 8 行为参数化
查看>>
Elasticsearch の 初体验|一文了解她
查看>>
聊聊flink的Triggers
查看>>
自建最轻量的react+webpack+es6架构
查看>>
聊聊reactor extra的retry
查看>>
reactor-netty中HttpClient对TcpClient的封装
查看>>
数据库安全性操作——操作原则及SQL注入
查看>>
Java网络爬虫实操(9)
查看>>
前面有一个Redux,我们去撩(聊)一下它。
查看>>
iOS开发证书"此证书的签发者无效"解决方法
查看>>
Python实现的通用树结构,支持节点索引,常数时间查找
查看>>
网络传输协议
查看>>
iOS Principle:Category
查看>>
Java多线程之synchronized增强版——ReentrantLock
查看>>
MVP设计模式应该这样掌握
查看>>
Git标签的管理和配置命令别名
查看>>