当前位置:网站首页>synchronized原理
synchronized原理
2022-08-03 03:18:00 【lzhNox】
synchronized原理
synchronized是自适应的,会根据情况产生锁膨胀/锁升级过程
在加锁时会经历几个阶段
- 无锁(就是没加锁)
- 偏向锁
- 轻量级锁
- 重量级锁
偏向锁
偏向锁可以类比于单例模式的懒汉模式,在用到的时候才加锁,节省开销。
只是标记了这个锁是我的了,实际上还没上锁,直到有其他线程来竞争锁,才会真正的加锁
轻量级锁
当别的线程开始竞争锁,进入轻量级锁(自适应的自旋锁)
具体可见:http://t.csdn.cn/rINyd
重量级锁
当锁竞争激烈的时候,就会碰撞到重量级锁,也就是系统提供的mutex
synchronized的优化(重点)
**锁消除:**编译器会判断当前的锁是否可以消除,如果可以就直接删掉
例如StringBuffer的append方法都是带有synchronized的,但如果编译器发现该代码不是在多线程环境中执行的,就会把锁删去,节省成本
锁粗化:
锁粒度大小:就是作用范围,锁粒度就大,并发效率就越低。作用范围小,锁粒度就小,并发效率就搞。
锁粗话就是增大锁粒度,增大作用范围,减少上锁和释放的次,提高效率
比如以下代码:
for(...) {
synchronized(lock) {
n++;
}
}
每次循环一次都要加锁释放锁拉低了效率
编译器就会自动将锁粗化
synchronized(lock) {
for(...) {
n++;
}
}
这样就只用上一次锁
边栏推荐
- shell之条件语句(条件测试、if语句,case语句)
- C语言——-动态内存开辟与管理(malloc,free,calloc,realloc)+柔性数组
- Guys, I don't understand a bit: why the documentation of oracle-cdc writes that the connector can be done exactly-o
- 【笔记】混淆矩阵和ROC曲线
- 工业边缘计算研究现状与展望
- 工作两年成跳槽高峰期,程序员会在一家公司待多久?
- 成都高新南区 高新西区 东部新区 多边形范围点位 AOI 高德
- vant-field中colon属性为true报错
- 【GO记录】从零开始GO语言——用GO语言做一个示波器(二)基于arduino的简易示波器
- OneNote 教程,如何在 OneNote 中设置笔记格式?
猜你喜欢
随机推荐
软件测试技术之如何编写测试用例(2)
重定向printf到USB CDC、串口2
iScroll系列之下拉刷新 + 上拉加载更多
金仓数据库 Pro*C 迁移指南( 5. 程序开发示例)
使用docker容器搭建MySQL主从复制
Spark SQL简介
百度超级链:鼓励企业做自己的链
关于 Redis 必问面试题,你知道哪些?
C语言实验十二 指针(二)
leetcode:153. 寻找旋转排序数组中的最小值
数字3d虚拟交互展厅顺应时代发展需求和趋势
Postman如何做接口自动化测试?
(一)Nacos注册中心集群环境搭建
2022-08-02 顾宇佳 学习笔记 多线程
【leetcode热题Hot100】——LRU缓存
PyTorch安装——安装PyTorch前在conda搭建虚拟环境的报错
成都高新南区 高新西区 东部新区 多边形范围点位 AOI 高德
Have bosses know date field flinksql is synchronized to the use of the null on how to deal with
Jincang Database Pro*C Migration Guide ( 5. Program Development Example)
How to write test cases in software testing technology (2)